为什么'mpstat'和'pidstat'不同意CPU负载水平?

我正在使用mpstatpidstat同时在ubuntu 12.04中监视一个mysql进程。 在debuggingCPU使用率时,我注意到了一些不寻常的事情 虽然两种工具都认为CPU负载正在发生,但他们不同意它是什么样的负载。 这是一个示例时间片:

 $ pidstat -p 2763 1 01:36:36 PM PID %usr %system %guest %CPU CPU Command 01:36:36 PM 2763 0.00 0.00 0.00 0.00 0 mysqld 01:36:37 PM 2763 0.00 1.00 0.00 1.00 0 mysqld 01:36:38 PM 2763 0.00 5.00 0.00 5.00 0 mysqld 01:36:39 PM 2763 0.00 11.00 0.00 11.00 0 mysqld 01:36:40 PM 2763 0.00 12.00 0.00 12.00 0 mysqld 01:36:41 PM 2763 0.00 0.00 0.00 0.00 0 mysqld 01:36:42 PM 2763 0.00 0.00 0.00 0.00 0 mysqld 01:36:43 PM 2763 0.00 5.00 0.00 5.00 0 mysqld 01:36:44 PM 2763 0.00 170.00 0.00 170.00 0 mysqld 01:36:45 PM 2763 0.00 150.00 0.00 150.00 0 mysqld 01:36:46 PM 2763 0.00 4.00 0.00 4.00 0 mysqld 01:36:47 PM 2763 0.00 7.00 0.00 7.00 0 mysqld 01:36:48 PM 2763 0.00 7.00 0.00 7.00 0 mysqld 01:36:49 PM 2763 0.00 59.00 0.00 59.00 0 mysqld 01:36:50 PM 2763 0.00 85.00 0.00 85.00 0 mysqld 

请注意, pidstat在各个时间点报告了严重的系统级使用情况。 这里是大致相同的时间段的mpstat

 $ mpstat -P ALL 1 01:36:37 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:38 PM all 0.38 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.62 01:36:38 PM 0 2.02 0.00 0.00 0.00 0.00 0.00 0.00 0.00 97.98 01:36:38 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:38 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:38 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:38 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:38 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:38 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:38 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:38 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:39 PM all 0.88 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.12 01:36:39 PM 0 4.08 0.00 0.00 0.00 0.00 0.00 0.00 0.00 95.92 01:36:39 PM 1 2.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.00 01:36:39 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:39 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:39 PM 4 0.99 0.00 0.99 0.00 0.00 0.00 0.00 0.00 98.02 01:36:39 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:39 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:39 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:39 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:40 PM all 0.62 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.38 01:36:40 PM 0 5.05 0.00 0.00 0.00 0.00 0.00 0.00 0.00 94.95 01:36:40 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:40 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:40 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:40 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:40 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:40 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:40 PM 7 0.99 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.01 01:36:40 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:41 PM all 1.25 0.00 0.25 0.00 0.00 0.12 0.00 0.00 98.38 01:36:41 PM 0 10.00 0.00 1.00 0.00 0.00 1.00 0.00 0.00 88.00 01:36:41 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:41 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:41 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:41 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:41 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:41 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:41 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:41 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:42 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:42 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:43 PM all 0.12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.88 01:36:43 PM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:43 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:43 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:43 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:43 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:43 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:43 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:43 PM 7 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 01:36:43 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:44 PM all 2.88 0.00 0.00 0.00 0.00 0.00 0.00 0.00 97.12 01:36:44 PM 0 22.77 0.00 0.99 0.00 0.00 0.00 0.00 0.00 76.24 01:36:44 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:44 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:44 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:44 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:44 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:44 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:44 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:44 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:45 PM all 23.72 0.00 0.12 0.00 0.00 0.12 0.00 0.00 76.03 01:36:45 PM 0 99.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 01:36:45 PM 1 89.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11.00 01:36:45 PM 2 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 01:36:45 PM 3 0.00 0.00 0.99 0.00 0.00 0.00 0.00 0.00 99.01 01:36:45 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:45 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:45 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:45 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:45 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:46 PM all 13.89 0.00 0.00 0.00 0.00 0.00 0.13 0.00 85.98 01:36:46 PM 0 34.34 0.00 0.00 0.00 0.00 1.01 0.00 0.00 64.65 01:36:46 PM 1 69.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 31.00 01:36:46 PM 2 5.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 95.00 01:36:46 PM 3 3.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 97.00 01:36:46 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:46 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:46 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:46 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:46 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:47 PM all 0.50 0.00 0.00 0.00 0.00 0.13 0.00 0.00 99.37 01:36:47 PM 0 3.96 0.00 0.00 0.00 0.00 0.00 0.00 0.00 96.04 01:36:47 PM 1 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00 01:36:47 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:47 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:47 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:47 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:47 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:47 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:47 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 01:36:48 PM all 0.63 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.37 01:36:48 PM 0 5.10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 94.90 01:36:48 PM 1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:48 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:48 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:48 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:48 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:48 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 01:36:48 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 

我不惊讶地看到他们不同意总体百分比,但我不明白为什么pidstatmpstat不同意CPUtypes的负载。 mpstat表示负载正在发生在应用程序级别。 pidstat指出它发生在内核级别。 这里发生了什么事? 我认为这两个都是/proc视图,但是我不太了解他们的内部知道他们在哪里得到不同的信号。

编辑:最好,我可以告诉这个结果,每个程序使用的/proc计算机制之间的差异。

pidstat使用/proc/<pid>/stat : https : //github.com/sysstat/sysstat/blob/master/pidstat.c#L373-L382

mpstat正在使用/proc/uptime/proc/stat : https : //github.com/sysstat/sysstat/blob/master/rd_stats.c#L59-L163

所以,我有一个原因,但这不是一个真正的根本原因:

mpstat依靠/proc/stat作为它的CPU指标。 pidstat依赖于/proc/<pid>/stat 。 这些文件有时不同意在特定时间内观察到的内核jiffies的数量,我认为这是有意义的,因为我们正在讨论如此的时间分辨率增量:

 17:06:41 /proc/stat 158257197 17:06:46 /proc/stat 158257230 17:06:51 /proc/stat 158257236 17:06:56 /proc/stat 158257279 # t3 - t0 = 82 jiffies 

与…

 17:06:41 /proc/2763/stat 208862696 17:06:46 /proc/2763/stat 208862971 17:06:51 /proc/2763/stat 208863114 17:06:56 /proc/2763/stat 208863143 # t3 - t0 = 447 jiffies 

当然,每一个区别都是根据mpstatpidstat的源代码进行派生计算, pidstat百分比等等。

如果你深入挖掘/proc和sum /proc/<pid>/task/**/stat ,结果会更有意义。 这个数字总体上比/proc/stat增长要慢,比/proc/<pid>/stat慢得多。

看来,如果我要进一步采取这一点,我需要更好地了解内核如何写这些文件,为我的特定版本。 很显然, /proc/<pid>/stat/proc/<pid>/task/**/stat不一致。