哈喽大家好,我是咸鱼。
在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的状态。
- R:可执行状态(runnable),表示进程正在被CPU执行或者处在CPU队列中等待分配CPU时间片。
- S:可中断睡眠状态(interrupted sleep),表示进程处于睡眠状态,当特定条件或者信号到达时,就会被唤醒,状态也由S变成R。
- D:不可中断睡眠状态(uninterrupted sleep),类似于状态S,不同的是进程在接收到信号时不会被唤醒,这类状态的进程一般在等待I/O结束。
- Z:僵尸状态(zombie),表示进程已经终止,但父进程还没有发出wait4()系统调用去读取它的结束信息。
- 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高:
- 系统存在I/O性能问题:系统正在做的工作,大部分时间都是在等待I/O。
- 有进程因为等待I/O操作而阻塞,但这并不意味着系统不可以运行其他进程。
4)系统iowait低不能说明进程没有阻塞在I/O上。因为CPU在iowait状态的时候能执行其他进程。
标签:游戏攻略