mpstat
我正在同时使用和 来监控 ubuntu 12.04 中的 mysql 进程pidstat
。在调试其 CPU 使用率时,我注意到了一些异常。虽然这两个工具都同意 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
我对它们在总体百分比上存在分歧并不感到惊讶,但我搞不明白为什么它们pidstat
在mpstat
CPU 负载类型上存在分歧。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
答案1
所以,我有一个原因,但它并不是真正的根本原因:
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
当然,每个差异都要根据mpstat
和pidstat
的源代码进行导数计算,转化为百分比等。
如果你进一步研究/proc
并将 相加/proc/<pid>/task/**/stat
,结果会更有意义。这个数字的增长速度比/proc/stat
整体要慢,而且比 慢得多/proc/<pid>/stat
。
似乎如果我要进一步研究这个问题,我需要更好地了解内核如何针对我的特定版本编写这些文件。很明显,这/proc/<pid>/stat
与 不一致/proc/<pid>/task/**/stat
。