我试图了解我的系统(在 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/秒显然是 4k/秒。
为什么这两个工具之间存在差异?我是否误解了它们中的某些内容,或者它们的 CS 指标是否有所不同?
FWIW,我尝试在运行不同工作负载的计算机上执行相同的操作,并且差异甚至大两倍。
环境:
- AWS EC2 c5.9xlarge 实例
- Amazon 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 一起发布。
为其稳定内核精心挑选提交的供应商内核树可能存在该错误,或者较早修复了该错误。
关于linux - "vmstat"和 "perf stat -a"显示不同的上下文切换数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346469/