我试图了解我的系统(在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 / sec。
但是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 / sec。
为什么这两个工具之间存在差异?我是在其中一个中误解了某些内容,还是其CS指标有所不同?
FWIW,我尝试在运行不同工作负载的计算机上执行相同的操作,但差异甚至大两倍。
环境:
答案 0 :(得分:2)
perf
的某些最新版本在打印代码中包含a unit-scaling bug。手动执行12.3M /挂墙时间,看看是否理智。 (扰流板警报:根据OP的评论。)
https://lore.kernel.org/patchwork/patch/1025968/
提交0aa802a79469(“性能统计:摆脱多余的时钟显示 函数”)引入了主线Linux 4.19-rc1左右的错误。
因此,
perf_stat__update_shadow_stats()
现在保存时钟事件的缩放值 以毫秒为单位,而不是原始的nsec。但是在计算 阴影统计信息,我们仍然考虑以nsec为单位的时钟事件值。结果 错误的阴影统计值。
在2018年12月17日星期一提交57ddf09173c1,并将其修复为5.0-rc1,最终在perf
上游版本5.0中发布。
供应商内核树可能有该错误,或者早有已修复该错误。