我对 perf top 的输出完全感到困惑
我正在运行一个名为 sac2 的 C 程序,它会消耗整个 CPU。具体来说,它迭代一个 1000 亿字节数组,将所有字节添加为 8 位整数。
从功能的角度来看,它没有做任何有趣的事情,但是当我以不同的步幅运行它时,它使我能够收集和比较各种硬件计数器。
如果我运行 top,它会告诉我我正在使用 100% 的 CPU,如下所示。
top - 00:27:48 up 8 days, 10:10, 4 users, load average: 0.67, 0.49, 0.58
Tasks: 1881 total, 3 running, 1878 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.4 us, 0.4 sy, 0.0 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 15828906+total, 79267468+free, 51445376 used, 73877056+buff/cache
KiB Swap: 4194300 total, 207800 free, 3986500 used. 97584883+avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
197713 root 20 0 93.2g 20.9g 508 R 100.0 1.4 0:25.91 sac2
61859 root 20 0 3875820 748664 102052 S 3.3 0.0 10:40.92 perf
258330 root 20 0 103340 9024 1524 S 2.2 0.0 80:17.05 pmdalinux
194985 root 20 0 163968 4204 1608 R 2.0 0.0 0:10.48 top
7099 root 20 0 28504 4800 400 S 1.9 0.0 224:19.92 irqbalance
192315 pcp 20 0 125020 35180 2524 S 1.0 0.0 0:06.15 pmlogger
71102 root 20 0 150408 6092 1584 S 0.7 0.0 25:47.99 dstat
然而 perf top 告诉我,开销(我假设是 CPU 利用率)只有 40% 左右。如果是这样的话,也应该是100%。
Samples: 68M of event 'cycles:ppp', 4000 Hz, Event count (approx.): 85009918166 lost: 0/0 drop: 0/0
Overhead Shared Object Symbol
39.63% sac2 [.] main
9.18% [kernel] [k] mem_cgroup_charge_common
5.10% [kernel] [k] clear_page_c_e
3.43% [kernel] [k] retint_userspace_restore_args
3.00% [kernel] [k] sysret_check
此外,当 sac2 完成后,perf top 继续显示 sac2 处于活动状态 25 秒,开销稳步下降。
另一个问题是 perf-top 手册页中描述的几乎所有选项都被忽略。
全面披露的是,该系统拥有 96 个 Skylake 核心、192 个线程和 1.5 TB 内存。当我运行测试时,机器上只有我一个人。我以 root 身份运行,系统运行 Centos7,Linux 内核为 3.10。
一种可能性是 perf top 在 3.10 内核上有很多错误。另一种可能性是我不明白什么是开销,但即便如此,大多数选项不起作用的事实还是非常可疑的。有人可以帮忙吗?
答案1
此外,当 sac2 完成后,perf top 继续显示 sac2 处于活动状态 25 秒,开销稳步下降。
这是时间平均值; “观察到的样本的百分比”当然会随着观察到的样本的数量而变化。所以,这也是完全可以预料到的!
具体来说,它迭代一个 1000 亿字节数组,将所有字节添加为 8 位整数。
那么,您有 100 GB RAM 吗?否则,部分 RAM 将必须被调出。您的你的top
输出告诉我们您的内存大约为 16 GB!top
说法具有误导性,而且你有 1.5 TB 的 RAM,所以这很合适!
perf top
还可以计算必须获取页面的次数(即缓存未命中),我猜会发生这种情况很多在你的情况下。这很可能不计入 CPU 定时器!
另请注意,perf top
without-a
将附加到单个 CPU 核心,而不是对所有核心进行采样。除非您将sac2
进程固定到您正在观察的同一核心,否则它可能会在其他地方运行!