为什么“perf stat -a”显示的时钟 (Ghz) 低于我的 CPU 额定值?

为什么“perf stat -a”显示的时钟 (Ghz) 低于我的 CPU 额定值?

为什么perf stat -a显示时钟速度三次低于我的 CPU 额定值?

我不认为电源管理是一个问题,因为我确保测试运行了一整秒,以允许 cpu 频率升至最大值。

# time perf stat -a -r 500  mount --make-rprivate /mnt/a

 Performance counter stats for 'system wide' (500 runs):

          6.217301      cpu-clock (msec)          #    3.782 CPUs utilized            ( +-  0.63% )
                 6      context-switches          #    0.998 K/sec                    ( +-  1.31% )
                 0      cpu-migrations            #    0.018 K/sec                    ( +- 15.14% )
               122      page-faults               #    0.020 M/sec                    ( +-  0.04% )
         4,719,129      cycles                    #    0.759 GHz                      ( +-  1.93% )
         3,998,374      instructions              #    0.85  insn per cycle           ( +-  0.44% )
           805,593      branches                  #  129.573 M/sec                    ( +-  0.44% )
            22,548      branch-misses             #    2.80% of all branches          ( +-  0.26% )

       0.001644054 seconds time elapsed                                          ( +-  0.62% )


real    0m1.152s
user    0m0.386s
sys 0m0.824s

# rpm -q perf
perf-4.14.16-300.fc27.x86_64

答案1

中的 Ghz 值perf stat -a不显示每秒的周期数。 4,719,000 个周期除以 0.0016 秒是 2.9Ghz,而不是 0.76Ghz。

我猜perf显示的是每秒周期的平均值在每个CPU核心上。 2.9Ghz 除以 0.76Ghz 得到 3.8。这并不是 CPU 的整数,但也差不多了。我注意到它与上面奇怪的“CPU 使用率”数字完全匹配。


比较perf stat没有-a

# time perf stat -r 500  mount --make-rprivate /mnt/a

 Performance counter stats for 'mount --make-rprivate /mnt/a' (500 runs):
      1.323450      task-clock (msec)         #    0.812 CPUs utilized            ( +-  0.84% )
             0      context-switches          #    0.008 K/sec                    ( +- 44.54% )
             0      cpu-migrations            #    0.000 K/sec                  
           122      page-faults               #    0.092 M/sec                    ( +-  0.04% )
     2,668,696      cycles                    #    2.016 GHz                      ( +-  0.28% )
     3,090,908      instructions              #    1.16  insn per cycle           ( +-  0.04% )
       611,827      branches                  #  462.297 M/sec                    ( +-  0.03% )
        20,252      branch-misses             #    3.31% of all branches          ( +-  0.09% )

   0.001630517 seconds time elapsed                                          ( +-  0.82% )


real    0m1.089s
user    0m0.378s
sys 0m0.715s

另请注意,报告的周期perf stat -a并不完全代表生产性计算。 perf record -a接下来perf report显示最热门的热点如下:

# perf record -a sh -c "for i in {1..500}; do mount --make-rprivate /mnt/a; done"
...
# perf report
...
  19.40%  swapper          [kernel.kallsyms]           [k] intel_idle
...

即,虽然cpu频率在空闲内核上降低时,perf 计数的周期似乎也包含大量“消耗”的周期,而内核已停止 CPU 并进入 cpu 空闲状态。

(或者至少内核是使CPU处于低功耗空闲状态。我不知道是否perf经常中断CPU以完全干扰空闲)。

相关内容