Apache 在“读取请求”时卡住,并且 PID 占用 100% CPU

Apache 在“读取请求”时卡住,并且 PID 占用 100% CPU

最近,与一些服务器升级有些相似(尽管有很多事情发生了变化),Apache 的一些进程开始卡在“正在读取请求”状态。处于此状态的每个 PID 都占用 100% 的 CPU,并且与之一致的进程很少,并且还有另一个卡住的进程(根据 lsof)——一些进程有打开的 TCP/IP 连接,一些有等待的连接,一些只在监听 www。

模式如下:

  1. 重启 Apache
  2. 稍等一下(几分钟)
  3. 得到僵尸“读取请求”进程,CPU开始上升
  4. 更多的僵尸出现了,所有这些都没有发生任何明显的变化
  5. CPU 负载达到 15 - 40,具体取决于我上次注意到的时间
  6. 转到 1

整个周期大约持续 30 分钟到 4 小时,取决于我及时执行步骤 1 的能力。

服务器状态给我:

R_.__.K._K.._._...._........W...................................
................................................................
................................................................
................................................................

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

Srv PID Acc M   CPU     SS  Req Conn    Child   Slot    Client  VHost   Request
0-0 24363   0/1/7   R   0.46    447 844 0.0 0.00    0.26    ?   ?   ..reading.. 
[followed by a bunch of entirely normal requests]

当然,服务器状态行中缺少可以帮助我调试此问题的关键信息。

我无法将其追溯到任何特定的地方。我尝试过 lsof、netstat,查看日志(尽管有大量日志需要查看。没有发现任何明显的问题)。网络流量没有激增,服务器正在为一堆随机网站提供服务,因此监控传入连接很困难。

最初,这种情况发生在一个老旧的 Lenny 安装上,所以我开始逐步将软件包升级到 Squeeze。到目前为止,没有升级导致这种情况消失(不过我很高兴获得了一些不错的新软件!)。

除了开始调试 Apache 本身那么,还可以做其他事情来尝试找到问题的根源吗?


细节:

Debian Lenny/Squeeze(主要是 Lenny。一些组件升级到 Squeeze)在 Debian Squeeze Xen 主机上的 Linux 2.6.32-5-xen-amd64 上运行。

Apache2 MPM 预分叉(2.2.16-6+squeeze7)

模块:libapache2-mod-fastcgi、libapache2-mod-perl2、libapache2-mod-php5、libapache2-mod-python、libapache2-mod-scgi、libapache2-mod-wsgi、libapache2-modxslt、libapache2-svn

答案1

我在运行 CentOS 6.2 的服务器上遇到了同样的问题。我怀疑这与每周日志轮换中的优雅重启有关。当我跟踪占用 100% CPU 周期的 httpd 进程时,它会循环从管道句柄(STDIN?)中读取空字符串。因此,我猜根本问题是 read() 应该阻塞并且不会一直返回零,从而导致 100% 的 CPU 使用率。

相关内容