前几天在微信群中跟一个人讨论问题,其中提到了pidstat中的%wait到底是不是等待io的。
当时我有一些含糊的是pidstat中似乎没看过有wait这个计数器。但是基于top中的wa和mpstat中的%iowait的多年判断经验。我当时说是在等io的。
当时我还说,如果我判断错了,下次见面,我请他喝花酒(不是你想的花酒,
)。 为了验证自己的说法,自己上服务器看了一下。一看不要紧,结果没wait这个计数器!!
这下蒙了,为什么我没这个计数器呢?
但是这个问问题的同学界面是这样的。
多出来一个wait。而这个wait确实是在pidstat的-u的CPU参数中输出的。
虽然看到的是pidstat输出的CPU的wait,但是却和mpstat的iowait以及top中的wa对应不上。
从上图可以看出,mpstat输出的%iowait并没有值,但是pidstat中的%wait却有比较高的值。在同一时间输出的数据相差如此之大,确实有蹊跷。
于是,我问他的环境中的版本是什么。他说是sysstat11.5.5的版本可以看到。我输出自己环境里的pidstat是10.1.5,在Centos8和7中如果用yum安装,都没这么高的版本。
分析过程
没有办法,本着对技术的偏执,我觉得要搞清楚有没有解释错!
来看一下分析过程。
计数器解释
要想了解计数器值为什么对不上,首先得先知道他们是不是同样的含义。
因为几个命令的参数值不一样,而top和mpstat也用了多年。那就先检查一下这几个计数器的帮助是怎么定义的。 top中的wa是这样解释的。
代码语言:javascript复制wa, IO-wait : time waiting for I/O completion
mpstat中的iowait是这样的。
代码语言:javascript复制%iowait
Show the percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.
这也是我为什么判断CPU中的wait是等IO的原因,因为上面两个计数器都明确说了等IO。 但是!!!我的错误判断的转折点来了。 我装了最新版本的sysstat之后,看到pidstat中的wait是这样解释的。