Tho*_* C. 5 linux linux-kernel
今天我有一个 linux 系统,在 vmstat 等待列中 100% 等待。
我的问题是:处理器在等待 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
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)
希望能帮助别人!
问候,
托马斯
如果进程在等待 IO 设备时处于“不可中断”状态,则会发生 IO 等待。
如果一个进程当前执行某些系统调用,那么它是“不可中断的”——read我认为正常等待光盘旋转不会导致 IO 等待——这会导致应用程序或可能的数据中出现错误行为——如果进程被中断(由于例如用于访问特殊硬件的驱动程序的限制),则会造成损失。
在网上搜索“linux 不间断内核睡眠解释”后,可以进一步阅读
| 归档时间: |
|
| 查看次数: |
5814 次 |
| 最近记录: |