"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,我试过在一台机器上做同样的事情 运行 不同的工作负载,那里的差异甚至大两倍。
环境:
- AWS EC2 c5.9xlarge 实例
- 亚马逊 Linux,内核 4.14.94-73.73.amzn1.x86_64
- 该服务在 Docker 18.06.1-ce
上运行
一些最新版本的 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 为他们的稳定内核提交的供应商内核树可能有错误或更早地修复错误。
我试图了解我系统上的上下文切换率(运行 在 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,我试过在一台机器上做同样的事情 运行 不同的工作负载,那里的差异甚至大两倍。
环境:
- AWS EC2 c5.9xlarge 实例
- 亚马逊 Linux,内核 4.14.94-73.73.amzn1.x86_64
- 该服务在 Docker 18.06.1-ce 上运行
一些最新版本的 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 为他们的稳定内核提交的供应商内核树可能有错误或更早地修复错误。