Linux系统中iowait状态解析

哈喽大家好,我是咸鱼。

在Linux系统中,使用top命令可以查看整体CPU使用情况。当查看CPU状态时,我们通常会关注下面这一列:

%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  68.0 wa,  0.0 hi,  0.0 si,  0.0 st

其中,wa表示CPU等待I/O操作(iowait)的时间百分比。在这篇文章中,我们将解释iowait状态的含义以及其与CPU空闲状态之间的联系。

上面的输出显示,CPU有68%的时间花在等待I/O操作完成上。这是否意味着Linux在I/O等待中浪费了CPU的宝贵性能?CPU在iowait状态下能否执行其他任务?让我们一起来揭开这些疑惑,深入探讨iowait到底是什么。

参考文章:

https://www.kawabangga.com/posts/5903

https://blog.popkx.com/linux系统top命令中的iowait究竟是什么意思/

https://www.linfo.org/process_state.html

https://blog.pregos.info/wp-content/uploads/2010/09/iowait.txt

进程和CPU状态

首先,我们需要搞清楚进程的状态和CPU的状态。

  1. R:可执行状态(runnable),表示进程正在被CPU执行或者处在CPU队列中等待分配CPU时间片。
  2. S:可中断睡眠状态(interrupted sleep),表示进程处于睡眠状态,当特定条件或者信号到达时,就会被唤醒,状态也由S变成R。
  3. D:不可中断睡眠状态(uninterrupted sleep),类似于状态S,不同的是进程在接收到信号时不会被唤醒,这类状态的进程一般在等待I/O结束。
  4. Z:僵尸状态(zombie),表示进程已经终止,但父进程还没有发出wait4()系统调用去读取它的结束信息。
  5. T:暂停状态(stopped),表示进程已经暂停,是可以恢复的。

CPU一共有四种状态:user,sys,idle,iowait。这四种状态相加的结果是100%。具体来说,CPU状态可以分为工作/忙碌(user、system)和非工作/空闲(idle、iowait)两种。

这里需要注意的是,iowait其实可以归类到idle状态,本质上表示CPU是空闲的,只不过iowait表示任务中有等待I/O操作完成的时间。

那么,当CPU处于iowait状态时,它能否执行其他任务呢?让我们通过一个例子来探讨这个问题。

举个栗子

我们在双核CentOS 7环境下进行实验。首先,使用dd命令模拟高密集I/O任务,并使用taskset为任务指定CPU。

# taskset 后的数字 1 并不是CPU的编号,而是一种掩码。
taskset 1 dd if=/dev/sda of=/dev/null bs=1MB

通过top命令查看CPU使用率,可以发现CPU0的wa项接近100,这表明CPU0几乎所有的时间都花在等待I/O操作完成上。

接着,我们输入以下命令:

taskset 1 sh -c "while true; do true; done"

这条命令是在相同的CPU上执行一个死循环,用于模拟计算密集型任务。

可以看到:CPU0的wa降低为0,与此同时us和sy的时间占比接近100%。这意味着CPU在iowait状态下能执行其他任务。

但这是否意味着dd命令产生的进程没有阻塞在I/O上呢?并不是。

假设有一个进程需要花70%的时间等待I/O完成,把它放到一个空闲的单CPU的系统中,显示的iowait是70%。但是我在这个系统中增加一个非I/O的计算任务,iowait就变成0了。而我们之前的那个进程依然需要花70%的时间等待I/O。

一个是从CPU角度来看,一个是从进程的角度来看,iowait是CPU的一个状态,它不是进程的状态。因此,iowait很低并不代表进程没有阻塞在I/O上。

总结

最后总结一下:

1)不要混淆CPU状态和进程状态。进程有R、S、D、Z、T,5种状态;CPU有4种状态:工作(user、system)和空闲(idle、iowait)。

2)iowait表示CPU实际上是空闲的,不过CPU并不是严格意义上的“空闲”,上面还有等待I/O操作的进程在执行。

3)系统iowait高:

  1. 系统存在I/O性能问题:系统正在做的工作,大部分时间都是在等待I/O。
  2. 有进程因为等待I/O操作而阻塞,但这并不意味着系统不可以运行其他进程。

4)系统iowait低不能说明进程没有阻塞在I/O上。因为CPU在iowait状态的时候能执行其他进程。

标签:游戏攻略