今天我在vmstat等待列中有一个100%等待的linux系统。
我的问题是:处理器在等待I / O时究竟做了什么?
据我所知,cpu不能真正等待 - 它必须运行一些代码! 那么它是否正在运行一些“等到磁盘中断到来”代码? 为什么它没有运行其他代码并在磁盘中断到来时返回?
据我所知,磁盘速度太慢,以至于cpu可以执行许多次循环,直到磁盘准备就绪。
为什么linux让cpu等到I / O完成而不是给它做一些工作呢?
托马斯
答案 0 :(得分:2)
如果进程在等待IO设备时处于不间断状态,则会发生IO等待。
流程是“不间断的”'如果它当前执行某些系统调用 - 正常read
等待光盘旋转不会导致IO等待我认为 - 这将导致应用程序中的错误行为或可能的数据 - 如果进程被中断(由于例如用于访问特殊硬件的驱动程序的限制),则会损失。
在搜索网页后可以进一步阅读。 ' linux不间断内核睡眠解释'
答案 1 :(得分:1)
我在这里找到了答案: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 Wait已经消失,因为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
希望能帮到别人!
Grettings,
托马斯