Perf

為什麼 perf stat -a 顯示的時鐘 (Ghz) 低於我的 cpu 額定值?

  • February 8, 2018

為什麼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

中的 Ghz 值perf stat -a不顯示每秒週期數。4,719,000 個週期除以 0.0016 秒是 2.9Ghz,而不是 0.76Ghz。

我猜想顯示的是每個 cpu 核心perf每秒的平均週期數。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 以完全乾擾空閒)。

引用自:https://unix.stackexchange.com/questions/422802