iowait升高时,很可能因为得不到硬件响应,长时间处于不可中断状态,使用ps或top看,它们会处在D状态,即不可中断状态(Uninterruptible Sleep)。
使用top查看信息,会出现S一列,这一列就表示进程状态。进程状态有以下几种:
R:running或runnable的缩写,表示进程在CPU就绪队列中或正在执行。
D:disk sleep,即不可中断睡眠(Uninterruptible Sleep),一般表示进程正在和硬件交互,且不允许被打断。
Z:zombie的缩写,表示僵尸进程,也就是进程已经结束了,但父进程没有回收它的资源。
S:是Interruptible Sleep的缩写,可中断状态睡眠,表示进程因等待某个事件而被系统挂起。当进程等待的某个事件发生时,状态会变为R。
I:idle缩写,表示空闲状态,用在不可中断睡眠的内核线程上。硬件交互导致的不可中断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。
T或t:也就是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。
X:dead的缩写,表示进程消亡,所以不会再top中看到它。
不可中断状态就是为了保证进程数据和硬件数据的一致,正常情况下,不中断线程都很短,一般可以忽略。如果硬件损坏导致不可中断很长,就要注意了。
僵尸进程是很多系统会遇见的。正常情况下,当一个进程创建了子进程后,它应该通过系统调用wait()或waitpid()等待子进程结束,回收子进程资源。而子进程结束时,会向父进程发送信号,父进程根据信号来异步回收资源。
如果因为一些原因,父进程没来得及回收子进程资源,这些子进程就变成了僵尸进程。一旦僵尸进程过多,导致PID耗尽,新进程将不能创建。