【问题标题】:"vmstat" and "perf stat -a" show different numbers for context-switching“vmstat”和“perf stat -a”为上下文切换显示不同的数字
【发布时间】: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 1000vmstat -w 1 在那里是一致的。我测试了内核 4.18 和 5.1。
  • 您是否有perfthe unit-scaling bug 的版本?在您让perf 运行的任何时间间隔内,每秒 4k 与 12M 切换是否一致?如果不是,手动计算 12.3M / t 秒是否与 vmstat 匹配?
  • @PeterCordes 你是绝对正确的!愚蠢的我,我没有注意绝对数字。事实上,如果我以sudo perf stat -a -- sleep 10 启动它并手动划分,数字匹配。谢谢!您要回答这个问题以便我接受吗?

标签: linux perf context-switch


【解决方案1】:

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

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

Commit 0aa802a79469 ("perf stat: 摆脱额外的时钟显示 function") 引入了主线 Linux 4.19-rc1 左右的 bug。

因此,perf_stat__update_shadow_stats() 现在保存时钟事件的缩放值 以毫秒为单位,而不是原始的纳秒。但是在计算值时 shadow stats 我们仍然以 nsecs 为单位考虑时钟事件值。这个结果 在错误的影子统计值中。

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


为其稳定内核挑选提交的供应商内核树可能存在错误或已修复该错误。

【讨论】:

  • 这里有两个不一致的地方。根据 GitHub 发布标签,我们可以确定哪个提交进入了哪个内核版本。 commit 0aa802a79469 是在 Linux 4.19-rc1 中发布的,但该 bug 存在于 4.14(OP 的系统)中,因此 commit 不可能是引入该 bug 的那个。 @Zulan 在 cmets 中说 4.18 中不存在该 bug,但在 Linux 5.0-rc1 中发布了 commit 57ddf09173c1。
  • @HadiBrais:感谢您研究提交何时进入 Linus 的树。供应商内核可能会将这些补丁精心挑选到 他们的 4.14 内核中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多