Linux 进程的 Uninterruptible sleep(D) 状态
Posted Still waters run deep
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 进程的 Uninterruptible sleep(D) 状态相关的知识,希望对你有一定的参考价值。
首先,说一下产生D状态的原因。
上图阐释了一个进程运行的情况,首先,运行的时候,进程会向内核请求一些服务,内核就会将程序挂起进程,并将进程放到parked队列,通常这些进程只会在parked队列中停留很短的时间,在ps(1)列表中是不会出现的。但是如果内核因为某些原因不能提供相应服务的话。例如,进程要读某一个特定的磁盘块,但是磁盘控制器坏了,这时,除非进程完成读磁盘,否则内核无法将该进程移出parked队列,此时该进程标志位就会被置为D。由于进程只有在运行的时候才能接受到signals,所以此时在parked队列上的进程也就无法接收到信号了。解决这个问题的方法要么是给资源给该进程,要么是reboot。
通俗一点说,产生D状态的原因出现uninterruptible sleep状态的进程一般是因为在等待IO,例如磁盘IO、网络IO等。在发出的IO请求得不到相应之后,进程一般就会转入uninterruptible sleep状态,例如若NFS服务端关闭时,如果没有事先amount相关目录。在客户端执行df的话就会挂住整个会话,再用ps axf查看的话会发现df进程状态位已经变成D。
出现负载较高的情况,可以通过vmstat查看是否是由于uninterruptible sleep进程引起的,其中vmstat命令中的procs部分的b列就表示uninterruptible sleep的数量:
Procs r: The number of runnable processes (running or waiting for run time). b: The number of processes in uninterruptible sleep.
如上图,该服务器存在uninterruptible sleep进程,通过 ps aux查看,是数据库的写盘进程,初步判断进程在等待io。
注:
由于只有运行状态的进程才可以接受信号,所以处于uninterruptible sleep的进程,是无法用kill命令杀掉的,即使是加9或15的信号。
参考:
http://www.dewen.net.cn/q/5664
以上是关于Linux 进程的 Uninterruptible sleep(D) 状态的主要内容,如果未能解决你的问题,请参考以下文章
2. 在Linux中进程有哪几种状态,每种状态代表的含义是啥?
Linux 内核进程管理 ( Linux 内核中的进程状态 | TASK_RUNNING | TASK_INTERRUPTIBLE | __TASK_STOPPED | EXIT_ZOMBIE )