Brendan Gregg 在他最近的博客文章CPU Utilization is Wrong 中建议使用每周期 PMC 指令。简而言之,如果 IPC
如果您的 IPC
如果您的 IPC > 1.0,您可能会受到指令限制。寻找方法
减少代码执行:消除不必要的工作,缓存
CPU 火焰图是一个很好的工具
调查。对于硬件调优,请尝试更快的时钟频率等
核心/超线程。
对于我的上述规则,我在 1.0 的 IPC 上进行拆分。我从哪里得到的
从?根据我之前在 PMC 的工作,我弥补了这一点。这是你的方式
可以获得为您的系统和运行时自定义的值:编写两个
虚拟工作负载,一种受 CPU 限制,一种受内存限制。措施
他们的 IPC,然后计算他们的中点。
以下是stress tool 及其 IPC 生成的虚拟工作负载的一些示例。
内存绑定测试,IPC 低 (0,02):
$ perf stat stress --vm 4 -t 3
stress: info: [4520] dispatching hogs: 0 cpu, 0 io, 4 vm, 0 hdd
stress: info: [4520] successful run completed in 3s
Performance counter stats for 'stress --vm 4 -t 3':
10767,074968 task-clock:u (msec) # 3,560 CPUs utilized
0 context-switches:u # 0,000 K/sec
0 cpu-migrations:u # 0,000 K/sec
4 555 919 page-faults:u # 0,423 M/sec
4 290 929 426 cycles:u # 0,399 GHz
67 779 143 instructions:u # 0,02 insn per cycle
18 074 114 branches:u # 1,679 M/sec
5 398 branch-misses:u # 0,03% of all branches
3,024851934 seconds time elapsed
CPU 绑定测试,IPC 高 (1,44):
$ perf stat stress --cpu 4 -t 3
stress: info: [4465] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: info: [4465] successful run completed in 3s
Performance counter stats for 'stress --cpu 4 -t 3':
11419,683671 task-clock:u (msec) # 3,805 CPUs utilized
0 context-switches:u # 0,000 K/sec
0 cpu-migrations:u # 0,000 K/sec
108 page-faults:u # 0,009 K/sec
30 562 187 954 cycles:u # 2,676 GHz
43 995 290 836 instructions:u # 1,44 insn per cycle
13 043 425 872 branches:u # 1142,188 M/sec
26 312 747 branch-misses:u # 0,20% of all branches
3,001218526 seconds time elapsed