要了解I/O wait, 必须先了解进程状态。在任何时刻,一个进程会存在于某个服务状态, 这个状态可以通过ps或者top命令输出的STAT中看到。通过ps(1)的man手册可以看到:
  • D - 不可中断睡眠 (usually IO)
  • R - 正在运行或可以运行( 在运行队列中)
  • S - 可中断睡眠 ( 等待一个事件结束)
  • T - 停止, 接到了作业控制信号,或者是进程被trace。
  • W - 分页 (2.6.xx kernel中取消了这个状态)
  • X - 死亡 (永远不应该处于这个状态)
  • Z - 僵死 ("zombie") 进程, 中断运行但是没有被他的父进程回收。
只有在有进程处于不可中断睡眠(D state)的时候才会产生I/O wait, 通常进程会因为等待某些I/O结束而被置为D状态。进程执行了一个内核的系统调用然后开始等待结果。 在这段时间中, 进程处于不可中断状态, 因为中断会造成驱动程序状态异常或者是硬件损坏。
当一个进程进入D状态, kernel就会知道进程所在的CPU, 并且计算进程进入D状态的时间,最后统计出这个CPU的I/O wait。
注意从CPU的角度看, I/O wait和idle time是一样的, 一个处于I/O wait的进程不会阻止CPU运行其他进程。
同样非常重要的是,高的I/O wait值不一定必然的问题,如果一台服务器运行I/O密集的程序,那么可以预料到I/O wait会很高。这时I/O wait反应了系统是如何在这些任务上花费时间的。