为什么perf显示睡眠需要所有核心?

时间:2017-05-10 13:51:46

标签: linux unix profiling perf

我正在努力熟悉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 个答案:

答案 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附加处理选项。