进程长期处于 'D' (UnInterruptible)状态没法退出

这种多是由内核中的故障引起的. 内核在很多执行路径中会将进程至于'D'的状态,以确保关键的执行路径不被外部的信号中断, 导致不必要的内核中数据结构状态的不一致性. 但一般而言,进程处于 'D' 状态的时间不会太久, 因为状态结束的条件(如timer触发,

IO操作完成等)很快会将进程唤醒. 当进程长期处于 'D',关键是要找出其阻塞的代码位置, 用 sysrq 的t键功能可直接打印出系统中全部睡眠进程的内核执行堆栈,如 echo 't' > /proc/sysrq-trigger, 其中包括出现 'D'状态的进程的内核态堆栈. 找出代码位置后,一般可直接分析出 'D' 状态不能退出的原因, 如IO read操作因硬件或nfs故障而不能完成.

有可能导致 'D' 状态的原因比较复杂,如‘D’的退出依赖于某变量的值,而该变量的值因某种原因被永久corrupted掉了.
参与1

0同行回答

“答”则兼济天下,请您为题主分忧!

提问者

zhuhongcheng9
系统架构师58同城
擅长领域: 云计算容器Docker

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2015-05-08
  • 关注会员:1 人
  • 问题浏览:2441
  • X社区推广