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

最近,与某些服务器升级(虽然有各种各样的事情发生了变化)有些相似,但是Apache开始结束了一些处于“读取请求”状态的进程。 每个得到这个状态的PID占用100%的CPU,并且与它有很less的一致性,另一个卡住的进程(根据lsof) – 有些是开放的TCP / IP连接,有些是等待的,有些只是在www上进行监听。

模式如下:

  1. 重启apache
  2. 等一下(分钟)
  3. 得到僵尸“读取请求”的过程,CPU开始上升
  4. 更多的僵尸进来,所有不与任何明显的事情相吻合
  5. 根据我上次注意到的情况,CPU负载可以达到15-40
  6. GOTO 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] 

当然,那里帮助我debugging的关键信息在服务器状态行中是不存在的。

我没有能够追查到任何特别的东西。 我试过lsof,netstat,查看日志(虽然有很多日志需要查看,没有明显的出现)。 networkingstream量没有高峰,服务器主动为一堆随机网站提供服务,因此监控传入连接非常困难。

最初,这开始发生在老化的Lenny安装上,所以我开始零碎升级包到Squeeze。 到目前为止,没有升级造成这种消失(尽pipe我得到了一些不错的,新鲜的软件!)。

除了开始debuggingApache本身 ,还有其他的事情可以做,以试图find问题的根源?


细节:

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

Apache2 MPM prefork(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

我在运行CentOS 6.2的服务器上遇到同样的问题。 我怀疑这与每周日志轮换一部分的平稳重启有关。 当我对使用100%CPU循环的httpd进程进行strace时,它正在循环读取pipe道句柄(STDIN?)中的空string(所以我猜根本问题是read()应该阻塞而不是全部返回零时间,导致100%的CPU使用率。