如何调试处于不可中断睡眠状态的进程?

4

这是在Linux系统(Red Hat发行版)上。

我编写了一个Perl实现的守护进程。它监视一个作业表格,当发现新的作业时,就fork出一个子进程来执行该作业。

我发现子进程在进程表中处于不可中断状态而挂起:

 682 16658  100 dumpdeco dumpdeco ?          0:27.62  0.0  1.8 D perl /root/runObjectBrowserJobs.pl
 1453 16658  100 dumpdeco dumpdeco ?          0:13.34  0.0  1.5 D perl /root/runObjectBrowserJobs.pl
 1458 16658  100 dumpdeco dumpdeco ?          0:12.42  0.0  1.5 D perl /root/runObjectBrowserJobs.pl
 1467 16658  100 dumpdeco dumpdeco ?          0:13.35  2.9  1.8 D perl /root/runObjectBrowserJobs.pl
 1474 16658  100 dumpdeco dumpdeco ?          0:14.31  0.0  2.1 D perl /root/runObjectBrowserJobs.pl
 1479 16658  100 dumpdeco dumpdeco ?          0:13.73  0.0  2.1 D perl /root/runObjectBrowserJobs.pl
 1496 16658  100 dumpdeco dumpdeco ?          0:13.97  0.0  2.0 D perl /root/runObjectBrowserJobs.pl
 1499 16658  100 dumpdeco dumpdeco ?          0:13.93  0.0  2.2 D perl /root/runObjectBrowserJobs.pl
 1501 16658  100 dumpdeco dumpdeco ?          0:14.47  0.0  1.4 D perl /root/runObjectBrowserJobs.pl
 1503 16658  100 dumpdeco dumpdeco ?          0:14.86  2.0  2.2 D perl /root/runObjectBrowserJobs.pl
 1505 16658  100 dumpdeco dumpdeco ?          0:13.88  1.0  2.0 D perl /root/runObjectBrowserJobs.pl
 1520 16658  100 dumpdeco dumpdeco ?          0:14.39  0.0  1.5 D perl /root/runObjectBrowserJobs.pl
 1522 16658  100 dumpdeco dumpdeco ?          0:14.12  1.0  1.8 D perl /root/runObjectBrowserJobs.pl
 1531 16658  100 dumpdeco dumpdeco ?          0:16.45  0.0  1.7 D perl /root/runObjectBrowserJobs.pl
 3619 16658  100 dumpdeco dumpdeco ?          2:03.59  0.0  4.5 D perl /root/runObjectBrowserJobs.pl

根据我的记录,孩子们已经完成了分配给他们的工作。他们已经记录了这一点,并且该工作已从待处理队列中删除。所以,从代码检查来看,他们没有任何任务可做,只需要退出。

这似乎是一个新现象。这是一段旧代码,我已经做过了僵尸进程的处理,所以我很确定这不是错误收割的问题。

我正在试图找出这些进程挂起的原因。我尝试过使用strace,但它没有返回任何结果。说实话,这并不奇怪,因为根据我的猜测,该进程实际上除了睡眠等待某个系统调用返回外,什么都不做。

所以,我在想:

  • 有没有办法打印正在运行进程的当前调用堆栈?
  • 有没有办法转储一个进程并在转储时查看其调用堆栈?
  • 您有什么建议应该寻找什么?我在考虑是损坏的存储驱动程序(我们最近遇到了其他存储问题),但总是把责任归咎于驱动程序似乎对我来说是一种懒惰的选择。

我会看一下存储方面的问题。状态为D的进程通常表明它们正在等待IO。由于进程本身没有什么操作(IO在内核空间),所以strace不会显示任何东西。 - Friek
1个回答

1

13
使用GDB实现pstack时,当试图附加到我的不可中断进程时,两者都会挂起。 - nhed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接