vmstat:cpu 等待究竟是什么意思?

Tho*_* C. 5 linux linux-kernel

今天我有一个 linux 系统,在 vmstat 等待列中 100% 等待。

我的问题是:处理器在等待 I/O 时究竟做了什么?

据我了解,cpu 真的等不及了——它必须运行一些代码!那么它是否正在运行一些严格的“等到磁盘中断到来”代码?为什么它不运行其他代码并在磁盘中断到达时返回?

据我所知,磁盘太慢了,以至于 cpu 可以做很多很多周期,直到磁盘准备好。

为什么 linux 让 cpu 等到 I/O 完成而不是让它做一些工作?

托马斯

Tho*_* C. 6

我在这里找到了答案: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
Run Code Online (Sandbox Code Playgroud)

您可以看到第一个 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
Run Code Online (Sandbox Code Playgroud)

现在我们在同一个 cpu 上开始一个紧密的 cpu 循环:

%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
Run Code Online (Sandbox Code Playgroud)

而且 - 看看那个 - 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
Run Code Online (Sandbox Code Playgroud)

希望能帮助别人!

问候,

托马斯


Tom*_*ner 3

如果进程在等待 IO 设备时处于“不可中断”状态,则会发生 IO 等待。

如果一个进程当前执行某些系统调用,那么它是“不可中断的”——read我认为正常等待光盘旋转不会导致 IO 等待——这会导致应用程序或可能的数据中出现错误行为——如果进程被中断(由于例如用于访问特殊硬件的驱动程序的限制),则会造成损失。

在网上搜索“linux 不间断内核睡眠解释”后,可以进一步阅读