我的设置:我有3台几乎完全相同的Web服务器,它们通过相同的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
因此,大多数过程只是在等待连接。大约5分钟后,情况将恢复正常:我的每台计算机上的进程数量最少,大多数工作人员的状态为“。”(表示他们可以处理请求),当然可以访问该网站!
因此,我试图在日志中查找某些内容,但根本没有任何内容... apache访问日志在大约4分钟内处于静默状态,对于错误日志也是如此。我也无法找出其他系统日志中的任何错误。
所有3个Web服务器上的情况都相同(它们都同时具有此负载峰值和无响应状态),所以我认为这与硬件无关。但我认为,这可能与某些网络(tcp)问题有关。
有任何想法吗?
编辑:我刚刚发现的一些更多信息:
它再次发生了,当出现此问题时,我能够验证我也无法在本地连接。
发生后,我使用以下命令进行了一些连接统计: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652年建立
- 2 FIN_WAIT1
- 11 LAST_ACK
- 12听
- 91个SYN_RECV
- 1个SYN_SENT
- 16 TIME_WAIT
如果稍后再执行相同的命令,则会显示以下内容:
- 4关闭
- 已建立108
- 18 FIN_WAIT1
- 第182章
- 37个LAST_ACK
- 12听
- 50个SYN_RECV
- 11276 TIME_WAIT
因此,在正常情况下,此时此刻,Apache处理的客户端只有100-200个开放连接。当我遇到“崩溃”时,我会有更多的联系。对此进行分析的最佳方法是什么?
EDIT2:apache2.conf中的重要行是:
KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit 920
StartServers 30
MinSpareServers 80
MaxSpareServers 120
MaxClients 920
MaxRequestsPerChild 700
</IfModule>
这是一个带有php_mod的apache2 prefork。
该服务器具有8GB内存和4GB交换分区。
tcpdump
)可以帮助您找到问题的根源……请问您的内存使用情况和防火墙策略是什么?