我正在努力熟悉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利用率将反映这一点。
有人能解释一下吗?
1条答案
按热度按时间lkaoscv71#
根据
perf stat
subocmmand的手册页,您可以使用-a
选项来分析整个系统:http://man7.org/linux/man-pages/man1/perf-stat.1.html在此“系统范围”模式下,
perf stat
(和perf record
too)将对系统中所有CPU上的事件进行计数(或对record
进行分析)。如果使用时没有额外的参数command
,perf将一直运行,直到被Ctrl-C中断。如果使用参数command
,perf将一直计数/分析,直到命令生效。典型用法为要获取单个命令的统计信息,请使用单个进程分析(不带-a选项)
对于性能分析(
perf record
),可以在不使用-a选项的情况下运行;或者您可以使用-a,然后在perf report
中进行一些手动过滤,只关注应用程序的pids/tids/dsos(如果要分析的命令使用一些对其他守护进程的进程间请求来执行大量CPU工作,这将非常有用)。--per-core, -A, -C <cpulist>, --per-socket
选项仅适用于系统范围-a
模式请尝试使用--per-thread
附加到进程选项-p pid