Perf為什麼
為什麼 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
中的 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 以完全乾擾空閒)。