我正在努力熟悉perf
并针对我编写的各种程序运行它。
当我针对100%单线程的程序启动它时,perf显示它在机器上需要两个核心(任务时钟事件)。 这是示例输出:
perf stat -a --per-core python3 test.py
Performance counter stats for 'system wide':
S0-C0 1 19004.951263 task-clock (msec) # 1.000 CPUs utilized (100.00%)
S0-C0 1 5,582 context-switches (100.00%)
S0-C0 1 19 cpu-migrations (100.00%)
S0-C0 1 3,746 page-faults
S0-C0 1 <not supported> cycles
S0-C0 1 <not supported> stalled-cycles-frontend
S0-C0 1 <not supported> stalled-cycles-backend
S0-C0 1 <not supported> instructions
S0-C0 1 <not supported> branches
S0-C0 1 <not supported> branch-misses
S0-C1 1 19004.950059 task-clock (msec) # 1.000 CPUs utilized (100.00%)
S0-C1 1 6,752 context-switches (100.00%)
S0-C1 1 25 cpu-migrations (100.00%)
S0-C1 1 935 page-faults
S0-C1 1 <not supported> cycles
S0-C1 1 <not supported> stalled-cycles-frontend
S0-C1 1 <not supported> stalled-cycles-backend
S0-C1 1 <not supported> instructions
S0-C1 1 <not supported> branches
S0-C1 1 <not supported> branch-misses
19.004688019 seconds time elapsed
它甚至表明简单的sleep
命令在我的计算机上占用了两个核心,我无法解释这一点。我知道操作系统调度程序可以为任何进程重新分配活动核心,但在这种情况下,CPU利用率会反映出来。
任何人都能解释一下吗?
谢谢!
答案 0 :(得分:1)
根据perf stat
子命令的手册页,您有-a
选项来分析完整系统:
http://man7.org/linux/man-pages/man1/perf-stat.1.html
-a, --all-cpus
system-wide collection from all CPUs (default if no target is
specified)
在此“系统范围”模式下,perf stat
(和perf record
too)将计算系统中所有CPU的事件(或record
的配置文件)。在没有command
的附加参数的情况下使用时,perf将一直运行,直到被Ctrl-C中断。使用command
的参数,perf将计算/分析直到命令工作。典型用法是
perf stat -a sleep 10 # Profile counting every CPU for 10 seconds
perf record -a sleep 10 # Profile with cycles every CPU for 10 seconds to perf.data
要获取单个命令的统计信息,请使用单个进程概要分析(不带-a选项)
perf stat python3 test.py
对于分析(perf record
),您可以在没有-a选项的情况下运行;或者您可以使用-a然后在perf report
中进行一些手动过滤,只关注应用程序的pids / tids / dsos(如果命令配置文件使用某些进程间请求到其他守护进程,这可能非常有用)很多CPU工作)。
--per-core, -A, -C <cpulist>, --per-socket
选项仅适用于系统范围的-a
模式。尝试--per-thread
-p pid
附加处理选项。