apache webserver对服务器状态无响应,显示所有等待连接的子进程[关闭]


10

我的设置:我有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交换分区。


当您从本地主机或服务器之间(如果它们位于同一网络上)运行wget或curl时,网站是否显示相同的症状?
亚历克斯·福布斯

也许流量转储(tcpdump)可以帮助您找到问题的根源……请问您的内存使用情况和防火墙策略是什么?
drcelus 2012年

@ al4上次发生这种情况时,我已经能够从本地主机连接到服务器状态页面,而我却无法从外部连接到网页。我不太确定,因为这也可能是随机的事情,而有些工人才可以使用。下次出现问题时,我将对此进行更多测试。如果我可以确认外部连接与本地连接之间的任何区别,您的建议是什么?
杰夫

如果您可以确认它在本地运行,而不是在外部运行,则可以进一步说明网络是问题所在-这意味着您应该在两端使用tcpdumps和wirehark进行测试,以查看正在通过的内容,而不是跟踪apache进程。如果可能,我还会从同一局域网上的主机进行测试。并检查dmesg以查看是否有任何可能相关的消息,但听起来您已经这样做了。
亚历克斯·福布斯

它又发生了。并且当出现此问题时,我能够验证我也无法本地连接。我也使用netstat进行了一些连接统计:请参阅问题文本
Jeff

Answers:



1

首先:检查您Max open files对过程的限制。活动的套接字连接算作一个打开的文件。cat /proc/###/limits是检查另一个过程的有效值的好方法。您可以获取打开文件的列表,lsof -p ###其中###是您的Web服务器的进程ID。您可以进行比较,lsof -p ### | wc -l以了解达到极限的距离。如果达到极限,您还应该在apache的error_log中看到消息。

每个套接字连接以及每个cgi脚本或数据文件引用都需要一个文件句柄。对于920个MaxClient,您应该为httpd进程至少配置4,000个文件。您可以通过在/etc/security/limits.d/中添加具有以下内容的文件来增加文件数量。确保用户名与您用于Web服务器的名称匹配。

apache soft nofile 10000
apache hard nofile 10000

第二:如果您的问题是端口耗尽,则可以在/etc/sysctl.conf中调整一些IP设置。(以开头net.ipv4.tcp_fin_timeout)。通常只有很多非常小的连接才有问题。许多TIME_WAIT套接字是对此的一种指示,但这仅在伴随有关于possible SYN flooding和的syslog错误时指示端口耗尽Sending cookies。您还应该确保服务器位于可以阻止恶意SYN攻击的防火墙之后。


0

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

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

以我的经验,此类事件是由搜索引擎搜寻器或ARP冲突之类的事件触发的。或网络某些相关部分的流量水平。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.