apache webserver 无响应,服务器状态显示所有子进程正在等待连接

Jef*_*eff 11 web-server connection tcp apache-2.2

我的设置:我有 3 台几乎相同的网络服务器机器,为相同的高负载动态网站提供简单的 dns 负载平衡。该服务已经使用相同的 apache 配置运行了两年多:apache2、php5、ubuntu 8.04 linux 2.6.24-29-server。

我的问题:大约两周前我遇到了这个配置的问题。几乎每天我都会有一个小时刻,大约 5 分钟,网站无法访问。我仍然可以通过 ssh 登录到服务器。如果我运行htop,我会看到机器什么也不做。我有大约 1000 个 apache 进程在运行,但没有 CPU 活动。

我已经使用 apache mod_status 来调试这种情况。流程记分板如下所示:

_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K

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
Run Code Online (Sandbox Code Playgroud)

所以大多数进程只是在等待连接。大约 5 分钟后,情况将恢复正常:我在每台机器上的进程最少,大多数工人都有“.”-状态(意味着他们可以处理请求),当然网站是可以访问的!

所以我试图在日志中找到一些东西,但是什么也没有……apache 访问日志静默了大约 4 分钟,错误日志也是如此。我也无法找出其他系统日志中的任何错误。

所有 3 个网络服务器上的情况都是一样的(它们都同时具有这种负载峰值和无响应的情况),所以我不认为这与硬件有关。但我认为,这可能与某些网络(tcp)问题有关。

有任何想法吗?

编辑:我刚刚发现的更多信息:

它刚刚再次发生,我能够验证在发生此问题时我也无法在本地连接。

发生后,我使用以下命令进行了一些连接统计: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c

  • 109 关闭_等待
  • 2652 成立
  • 2 FIN_WAIT1
  • 11 LAST_ACK
  • 12 听
  • 第91话
  • 1 SYN_SENT
  • 16 TIME_WAIT

如果我稍后执行相同的命令,我会得到如下结果:

  • 4 闭幕
  • 108 成立
  • 18 FIN_WAIT1
  • 第182话
  • 37 LAST_ACK
  • 12 听
  • 50 SYN_RECV
  • 11276 时间等待

因此,在正常情况下,此时由 apache 处理的客户端只有 100-200 个打开的连接。当我遇到这种“崩溃”时,我有更多的联系。分析此问题的最佳方法是什么?

EDIT2: apa​​che2.conf 中的重要行是:

KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit           920
StartServers          30
MinSpareServers       80
MaxSpareServers      120
MaxClients          920
MaxRequestsPerChild   700
</IfModule>
Run Code Online (Sandbox Code Playgroud)

它是一个带有 php_mod 的 apache2 prefork。

服务器有 8GB 内存和 4GB 交换分区。

Cam*_*err 0

另外,请记住,在 prefork MPM 中,每个进程的内存空间中都将包含 PHP(其内存限制设置是多少?)。您可能想尝试更改为工作 MPM,这可能需要稍微不同的 PHP 模块。

还值得远程耳环来修剪无关模块的 Apache 配置

根据我的经验,此类事件是由搜索引擎爬虫或 ARP 冲突等事件触发的。或者网络某些相关部分的流量水平。

您可能会发现“sar”很有用...不是最友好的,但肯定有用。

可能也与io相关。Sar 可以告诉您(如果您将其配置为记录磁盘活动)平均 io 等待时间是多少。您还可以查看顶部的 IO 等待时间(这是一个百分比,请阅读它的实际含义)。如果您使用 SAN 或虚拟环境,这一点可能非常重要。