"vmstat" 和 "perf stat -a" 显示上下文切换的不同数字

"vmstat" and "perf stat -a" show different numbers for context-switching

我试图了解我系统上的上下文切换率(运行 在 AWS EC2 上),以及切换的来源。只是得到数字已经令人困惑,因为我知道可以输出这样一个指标的两个工具给我不同的结果。这是 vmstat 的输出:

$ vmstat -w 2
procs -------------------memory------------------ ---swap-- -----io---- --system-- -----cpu-------
 r  b       swpd       free       buff      cache   si   so    bi    bo   in   cs  us sy  id wa st
 8  0          0     443888     492304    8632452    0    0     0     1    0    0  14  2  84  0  0
37  0          0     444820     492304    8632456    0    0     0    20 131602 155911  43  5  52  0  0
 8  0          0     445040     492304    8632460    0    0     0    42 131117 147812  46  4  50  0  0
13  0          0     446572     492304    8632464    0    0     0    34 129154 142260  49  4  46  0  0

这个数字是~140k-160k/秒。

但是 perf 告诉我们其他事情:

$ sudo perf stat -a
 Performance counter stats for 'system wide':

    2980794.013800      cpu-clock (msec)          #   35.997 CPUs utilized
        12,335,935      context-switches          #    0.004 M/sec
         2,086,162      cpu-migrations            #    0.700 K/sec
            11,617      page-faults               #    0.004 K/sec
...

0.004 M/sec 显然是 4k/秒。

为什么这两个工具之间存在差异?我是否误解了他们中的任何一个,或者他们的 CS 指标有什么不同?

FWIW,我试过在一台机器上做同样的事情 运行 不同的工作负载,那里的差异甚至大两倍。

环境:

一些最新版本的 perf 在打印代码中有 a unit-scaling bug。手动执行 12.3M / wall-time 并查看是否正常。 (剧透警告:根据OP的评论。)

https://lore.kernel.org/patchwork/patch/1025968/

提交 0aa802a79469(“性能统计:摆脱额外的时钟显示 function") 在主线 Linux 4.19-rc1 左右引入了错误。

Thus, perf_stat__update_shadow_stats() now saves scaled values of clock events in msecs, instead of original nsecs. But while calculating values of shadow stats we still consider clock event values in nsecs. This results in a wrong shadow stat values.

2018 年 12 月 17 日星期一的提交 57ddf09173c1 在 5.0-rc1 中修复了它,最终与 perf 上游版本 5.0 一起发布。


cherry-pick 为他们的稳定内核提交的供应商内核树可能有错误或更早地修复错误。