FreeBSD 9.0下的进程在不间断的睡眠中挂起,显然没有系统调用(空wchan)

时间:2012-03-20 12:12:02

标签: sleep freebsd ps truss

我有一个自定义日志记录进程,它从STDIN读取并通过TCP将数据发送到划线记录服务器。 在我的情况下,STDIN是一个访问日志,在httpd.conf中附加到Apache httpd 2.2,如下所示:    CustomLog“| / usr / local / bin / serelog”默认

我的serelog进程有时会在FreeBSD 9.0下进入不间断的睡眠状态,并且不会从它返回。它在其他操作系统下可靠运行,包括FreeBSD 8,Linux 2.6和Linux 3.1。

我怎样才能找出不间断睡眠的原因?

整体结构如下: httpd - [PIPE] - > serelog - [TCP-CONNECTION] - >刻划

到目前为止,我做了以下分析:

  • 使用ps:stat为“D”,wchan为“ - ”。所以显然没有系统调用,但事实并非如此 对我来说太有意义了,因为这个过程是不间断的睡眠,应该在内核的土地上。
  • 当进程处于状态“D”时,该进程不会像预期的那样对kill -9作出反应。
  • 从外部将truss附加到serelog:只要附加了truss,serelog就可以顺利运行。 从serelog分离桁架后不久(秒),serelog进入“D”状态。
  • 当桁架进入“D”状态后将桁架连接到serelog时,桁架不打印任何内容
  • 在“D”状态下,lsof显示传入的PIPE已满。这是执行的,因为在“D”状态下进程“休眠” 并且不能再读了。传出的TCP-CONNECTION为空。
  • 如果我杀死“周围”的Apache httpd服务器,serelog进程最终会在(例如)40分钟后终止。
  • 检查其他人在论坛中报告的关于不间断问题的内容未成功:在我的设置中没有NFS。 由于它是服务器,因此也没有用户与CD驱动器或可插拔硬件的交互。

所以我现在陷入了一个不间断的过程,显然不在系统调用中, 并且在跟踪时可靠地工作。唯一的好处是我能够重现几个行为 我通过JMeter loadtest(JMeter中的5个线程)发送大量HTTP请求时的秒或分钟。

有关调试,内核参数调整的任何提示都很受欢迎。

问候

1 个答案:

答案 0 :(得分:1)

该问题已被证明是一个实际的FreeBSD内核错误,现在已在内核中修复。

链接到PR:http://www.freebsd.org/cgi/query-pr.cgi?pr=166340

建议的补丁:http://lists.freebsd.org/pipermail/freebsd-bugs/2012-May/048610.html