perf top 未按预期工作

perf top 未按预期工作

我对 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 topwithout-a将附加到单个 CPU 核心,而不是对所有核心进行采样。除非您将sac2进程固定到您正在观察的同一核心,否则它可能会在其他地方运行!

相关内容