我有一个程序,运行在一个多线程框架上,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使用率很低。
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我的问题是
native_write_msr在堆栈跟踪中出现了这么多次(因此,它在火焰图中占据了大约80%的空间)。它是块操作,还是在调用时实现CPU?%system而不是%system。任何帮助都是非常感谢的。如果我错过了任何有用的信息,请评论。
非常感谢!
发布于 2022-05-31 18:20:38
从火焰图中可以发现,native_write_msr函数是由函数schedule调用的。当正在运行的进程从一个内核中被移除(因为它被迁移到另一个核心或被调度程序停止以运行另一个进程)时,调度程序需要转储进程的perf数据并清理它的perf配置,因此我们不会破坏不同进程的perf数据。调度程序可能需要在此步骤中写入msr,从而调用native_write_msr。因此,native_write_msr被多次调用,因为调度或核心迁移发生得太频繁。
https://stackoverflow.com/questions/66515594
复制相似问题