为什么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以完全干扰空闲)。