unix 为什么perf显示睡眠占用所有内核?

b4wnujal  于 2022-11-04  发布在  Unix
关注(0)|答案(1)|浏览(155)

我正在努力熟悉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利用率将反映这一点。
有人能解释一下吗?

lkaoscv7

lkaoscv71#

根据perf stat subocmmand的手册页,您可以使用-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

相关问题