首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么`native_write_msr`会主导我的分析结果?

为什么`native_write_msr`会主导我的分析结果?
EN

Stack Overflow用户
提问于 2021-03-07 10:42:11
回答 1查看 461关注 0票数 5

我有一个程序,运行在一个多线程框架上,Linux内核4.18和Intel CPU。我运行perf record -p pid -g -e cycles:u --call-graph lbr -F 99 -- sleep 20收集堆栈跟踪和生成火焰图。

我的程序是在低工作负载下运行的,所以在futex_wait上花费的时间是预期的。但是堆栈的顶部是一个内核函数native_write_msr。根据What does native_write_msr in kernel do?https://elixir.bootlin.com/linux/v4.18/source/arch/x86/include/asm/msr.h#L103的说法,该函数用于性能计数器。我已经禁用了native_write_msr中的跟踪点。

pidstat -p pid 1告诉我,系统的CPU使用率很低。

代码语言:javascript
复制
05:44:34 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
05:44:35 PM  1001     67441   60.00    4.00    0.00   64.00    11  my_profram
05:44:36 PM  1001     67441   58.00    7.00    0.00   65.00    11  my_profram
05:44:37 PM  1001     67441   61.00    3.00    0.00   64.00    11  my_profram

我的问题是

  1. 为什么native_write_msr在堆栈跟踪中出现了这么多次(因此,它在火焰图中占据了大约80%的空间)。它是块操作,还是在调用时实现CPU?
  2. 为什么系统CPU相对于框架图的使用率相对较低?根据图表,80%的CPU时间应该属于%system而不是%system

任何帮助都是非常感谢的。如果我错过了任何有用的信息,请评论。

非常感谢!

EN

回答 1

Stack Overflow用户

发布于 2022-05-31 18:20:38

从火焰图中可以发现,native_write_msr函数是由函数schedule调用的。当正在运行的进程从一个内核中被移除(因为它被迁移到另一个核心或被调度程序停止以运行另一个进程)时,调度程序需要转储进程的perf数据并清理它的perf配置,因此我们不会破坏不同进程的perf数据。调度程序可能需要在此步骤中写入msr,从而调用native_write_msr。因此,native_write_msr被多次调用,因为调度或核心迁移发生得太频繁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66515594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档