【发布时间】:2019-05-28 16:23:36
【问题描述】:
我正在尝试了解我的系统(在 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,我尝试在运行不同工作负载的机器上做同样的事情,结果差异甚至大了一倍。
环境:
- AWS EC2 c5.9xlarge 实例
- Amazon Linux,内核 4.14.94-73.73.amzn1.x86_64
- 服务在 Docker 18.06.1-ce 上运行
【问题讨论】:
-
无法在裸机系统上复制。
-
感谢您的回复!那么,在裸机系统上,那些计数器是一样的吗?很高兴知道,至少它[可能]意味着它们应该是相同的。我想,EC2 虚拟化可能是罪魁祸首。我将在问题中添加更多环境细节。
-
恐怕我不知道差异来自哪里。我还在 KVM 来宾系统上进行了测试:
perf stat -a -e context-switches -I 1000和vmstat -w 1在那里是一致的。我测试了内核 4.18 和 5.1。 -
您是否有
perf和the unit-scaling bug 的版本?在您让perf运行的任何时间间隔内,每秒 4k 与 12M 切换是否一致?如果不是,手动计算 12.3M /t秒是否与vmstat匹配? -
@PeterCordes 你是绝对正确的!愚蠢的我,我没有注意绝对数字。事实上,如果我以
sudo perf stat -a -- sleep 10启动它并手动划分,数字匹配。谢谢!您要回答这个问题以便我接受吗?
标签: linux perf context-switch