“ vmstat”和“ perf stat -a”显示了用于上下文切换的不同数字

时间:2019-05-28 16:23:37

标签: 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 / 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上运行

1 个答案:

答案 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中发布。


樱桃选择为其稳定内核提交的

供应商内核树可能有该错误,或​​者早有已修复该错误。