Apache mod_perl进程挂起在futex_wait状态

eomnis 发布于 2018-12-06 apache 最后更新 2018-12-06 22:59 3 浏览

我运行一个非常流行的基于浏览器的网页游戏,运行在Apache(worker)和mod_perl下。在高峰期间,当服务器每分钟处理大约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
...并且不会继续。 我不知道如何进一步调试。
已邀请:

hquas

赞同来自:

这是由于mod-perl中的一个错误,因为修复了,在这里记录: http://www.gossamer-threads.com/lists/modperl/dev/104026

lvero

赞同来自:

选择最低的流量时间,并在现场机器上启动带有strace的apache,这样你就可以找到错误的原因,对于一个互联网博主来说,一个解决方案归结为

rm /dev/random 
mknod -m 644 /dev/random c 1 9 
您可以通过使用反向代理设置来避免500: server closed connection without sending data back,因此当apache检测到没有数据的超时时,它会将请求转发给不同的mod_perl子客户端 这样,他的请求需要5秒钟,而不是客户端获得500 (不要问我怎么做,请看mod_perl / apache指南:)

要回复问题请先登录注册