今天我有一个在 vmstat 等待列中等待 100% 的 Linux 系统。
我的问题是:处理器在等待 I/O 时到底会做什么?
据我了解,CPU 真的等不及了 - 它必须运行一些代码!那么它是否正在运行一些紧凑的"等到磁盘中断到来"的代码?为什么它不运行其他代码并在磁盘中断到达时返回?
据我所知,磁盘非常慢,以至于CPU可以执行许多周期,直到磁盘准备就绪。
为什么 Linux 让 CPU 等到 I/O 完成,而不是给它一些工作要做?
托马斯
我在这里找到了答案:http://veithen.github.io/2013/11/18/iowait-linux.html
因此,在处理器级别"等待 I/O"意味着:处理器除了等待 I/O 外什么都不做。在等待 I/O 时,处理器可以运行用户代码,在这种情况下,等待 I/O 消失,CPU% 上升。
这里是链接页面中的测试用例。
只需运行一个在第一个 CPU 上执行大量 I/O 的任务:
taskset 1 dd if=/dev/sda of=/dev/null bs=1MB
您可以看到第一个 CPU 现在要么运行内核代码 (sy),要么等待 I/O (wa):
%Cpu0 : 0.0 us, 2.9 sy, 0.0 ni, 0.0 id, 97.1 wa, 0.0 hi, 0.0 si, 0.0 st
现在我们在同一 CPU 上启动一个紧密的 CPU 循环:
taskset 1 sh -c "while true; do true; done"
而且 - 看看那个 - I/O 等待消失了,因为 CPU 现在除了等待 I/O 之外还有一些其他事情要做 - 它运行用户空间代码!
%Cpu0 : 91.3 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 7.3 si, 0.0 st
希望对别人有帮助!
格雷廷斯,
托马斯
如果进程在等待 IO 设备时处于"不间断"状态,则会发生 IO 等待。
如果进程当前执行某些系统调用,则进程是"不间断的"——我认为等待光盘旋转的正常read
不会导致 IO-wait ——这将导致应用程序中的错误行为或如果进程中断可能丢失数据(例如,由于用于访问特殊硬件的驱动程序的限制)。
网络上搜索例如"linux不间断内核睡眠解释"后,可以获得进一步阅读