Apache mod_perl进程挂起在futex_等待状态

Apache mod_perl进程挂起在futex_等待状态,perl,apache,apache2,mod-perl,futex,Perl,Apache,Apache2,Mod Perl,Futex,我在Apache(worker)和mod_perl下运行了一个相当流行的基于浏览器的web游戏。在高峰时期,当服务器每分钟处理大约4200个请求时,大约每3-15分钟Apache进程就会挂起一次 我已经确定,这些进程被困在“FUTEX_WAIT”状态中,并且似乎什么也没做:它们不消耗CPU或在RAM中变大。但这是一个严重的问题,因为他们只是坐在那里,占据公羊 我目前的解决方案是一个cron作业,它剔除了困在futex_wait_queue_me中的Apache进程。但这并不好,因为碰巧等待挂起的

我在Apache(worker)和mod_perl下运行了一个相当流行的基于浏览器的web游戏。在高峰时期,当服务器每分钟处理大约4200个请求时,大约每3-15分钟Apache进程就会挂起一次

我已经确定,这些进程被困在“FUTEX_WAIT”状态中,并且似乎什么也没做:它们不消耗CPU或在RAM中变大。但这是一个严重的问题,因为他们只是坐在那里,占据公羊

我目前的解决方案是一个cron作业,它剔除了困在futex_wait_queue_me中的Apache进程。但这并不好,因为碰巧等待挂起的Apache进程响应的用户会收到错误(500:服务器关闭连接而不返回数据)

我无法在我的开发机器上重现这个问题,也不知道如何进行故障排除。我很想知道:如何进一步诊断

编辑:我发现问题发生在流量突发之后,当Apache生成更多的工作进程时,然后尝试剔除它们。从孩子的角度来看,这就是它正常工作时的样子:

$ sudo strace -p 21764
Process 21764 attached - interrupt to quit
read(5, "!", 1)                         = 1
tgkill(21764, 21791, SIGHUP)            = 0
tgkill(21764, 21791, SIG_0)             = 0
select(0, NULL, NULL, NULL, {0, 500000}) = ? ERESTARTNOHAND (To be restarted)
--- SIGTERM (Terminated) @ 0 (0) ---
rt_sigreturn(0xf)                       = -1 EINTR (Interrupted system call)
munmap(0x7f9905750000, 8392704)         = 0
munmap(0x7f98f8736000, 8392704)         = 0
[...]
madvise(0x7f98e4021000, 73728, MADV_DONTNEED) = 0
exit_group(0)                           = ?
Process 21764 detached
。。。但有时情况是这样的:

$ sudo strace -p 24133
Process 24133 attached - interrupt to quit
read(5, "!", 1)                         = 1
tgkill(24133, 24164, SIGHUP)            = 0
tgkill(24133, 24164, SIG_0)             = 0
--- SIGTERM (Terminated) @ 0 (0) ---
rt_sigreturn(0xf)                       = 0
select(0, NULL, NULL, NULL, {0, 500000}) = 0 (Timeout)
tgkill(24133, 24140, SIGUSR1)           = 0
futex(0x7f9904f4e9d0, FUTEX_WAIT, 24140, NULL
。。。不再继续


我不知道如何进一步调试这个问题。

选择最低的通信时间,在实时计算机上启动apache with strace,这样您就可以追踪错误的原因,对于一位互联网博主来说,解决方案可以归结为

rm /dev/random 
mknod -m 644 /dev/random c 1 9 
通过使用反向代理设置,您可以避免
500:服务器关闭连接而不发回数据
,因此当apache检测到没有数据的超时时,它会将请求转发给不同的mod_perl子级

这样一来,客户的请求就需要额外的5秒钟,而不是500秒
(不要问我如何操作,请参阅mod_perl/apache指南:)

这是由于mod perl中的一个错误造成的,因为已修复,记录在这里:


谢谢!我设法在我的开发机器上重现了这个问题,并将在上面发布更多信息。不幸的是,/dev/random技巧似乎对我没有帮助。但我至少更先进了!