linux - "vmstat"和 "perf stat -a"显示不同的上下文切换数字

标签 linux perf context-switch

我试图了解我的系统(在 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 上运行

最佳答案

一些最新版本的 perfa 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/

相关文章:

compiler-errors - SYS_futex的性能编译异常

asp-classic - 经典 asp -- 最好做大量的 response.write 或使用 <%

linux - 如何使用 SCP 自动在 Linux 服务器之间传输文件?

linux - 如何在没有 termcap 文件只有 terminfo 的情况下更改 Fedora 20 上的终端设置

Linux `perf record --append` 选项缺失

multithreading - 双CPU机器上的线程合作

linux - float 分配算作使用 fpu 吗?

c - 信号的范围是什么?

php - 更改特定时区的时区配置

performance-testing - DRAM 访问的性能计数器