Linux-什么原因容易导致D状态(uninterruptible sleep状态)?
1、项目中用socketpair进行父子进程间通信。
2、子进程会建立n个socket与网络对端通信,如果n在400左右,且非集中连接,则不会出现问题,n达到500,集中连接就回出现D状态。
3、epoll监听fd状态。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
针对这个问题,上网搜索了相关资料并进行了一些整理
首先,说一下产生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。