繁体   English   中英

是否 perf stat -CX<command> 在核心 X 上运行命令?

[英]Does perf stat -C X <command> run the command on core X?

我想在单个核心上分析一个命令,比如ls 我可以使用perf stat-C标志来指定要分析的核心,但是ls是否真的在我在这里选择的核心上运行?

尝试perf stat -C 7 ls ,我得到从 150k 到 500 万的完全不同的循环计数。

我可以强制ls使用任务集在特定核心上运行,例如perf stat -C 7 -A taskset --cpu-list 7 ls ,但每次运行我仍然会得到截然不同的循环计数 - 尽管似乎确实有更少的变化( 2-6 百万次循环)。 当然, taskset在这里会有一些开销。 为了获得尽可能准确的结果,这是正确的做法吗?

不,它没有。 它计算该 CPU 上的事件,无论您的任务中是否有任何线程碰巧在其上运行!

您可以使用taskset -c 7 perf stat ...如果您不介意 perf 本身也在该 CPU 内核上运行,以避免分析任务集。 perf stat几乎没有任何开销,因此在计数时它与工作负载位于同一核心上不是问题。

根据手册页, perf stat -C并不意味着-a ,因此令人惊讶的是,您没有更多的时间得到零计数(被分析的进程根本没有在选定的 CPU 内核上运行)。

/bin/ls是一个非常短暂的工作负载,大部分时间都花在系统调用上,所以它是一个奇怪的选择来分析一些东西。 在 4GHz CPU 上,400 万个周期仅需 1 毫秒。 其中大部分可能用于getdents的内核代码,因此如果您不使用--all-user-e instructions:u,cycles:u等,无论如何您都会期望高可变性。

在 i7-6700k 和 Linux 5.16 上,使用一些 CPU 时间的简单工作负载的正常运行如下所示:

$ taskset -c 4 perf stat --all-user awk 'BEGIN{for(i=0;i<10000000;i++){}}'

 Performance counter stats for 'awk BEGIN{for(i=0;i<10000000;i++){}}':

            331.11 msec task-clock                #    0.999 CPUs utilized          
                 0      context-switches          #    0.000 /sec                   
                 0      cpu-migrations            #    0.000 /sec                   
               177      page-faults               #  534.559 /sec                   
     1,371,512,156      cycles                    #    4.142 GHz                    
     3,582,591,466      instructions              #    2.61  insn per cycle         
       970,439,895      branches                  #    2.931 G/sec                  
            22,558      branch-misses             #    0.00% of all branches        

       0.331526126 seconds time elapsed

       0.328034000 seconds user
       0.003313000 seconds sys

但是 10 次背靠背运行只计算用户空间的 CPU,而不是它所固定的 CPU 计算的指令和周期数量差异很大。 (注意远超过 100% 的方差。)不确定它到底可以计算什么指令,就像我说的那样,我希望这为零。

$ taskset -c 4 perf stat --all-user -r10 -C 3 awk 'BEGIN{for(i=0;i<10000000;i++){}}'

 Performance counter stats for 'CPU(s) 3' (10 runs):

            329.45 msec cpu-clock                 #    0.999 CPUs utilized            ( +-  0.06% )
                 0      context-switches          #    0.000 /sec                   
                 0      cpu-migrations            #    0.000 /sec                   
                 0      page-faults               #    0.000 /sec                   
         2,692,718      cycles                    #    0.008 GHz                      ( +-124.70% )
         1,875,435      instructions              #    0.24  insn per cycle           ( +-241.60% )
           358,646      branches                  #    1.088 M/sec                    ( +-254.22% )
            12,917      branch-misses             #    0.68% of all branches          ( +- 70.77% )

          0.329648 +- 0.000198 seconds time elapsed  ( +-  0.06% )

指令在几次运行中从 139k 到 3767k 不等,而且并不总是相同的 IPC,有时像 1.0,但许多其他的 0.25 +- 0.05

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM