我的设置:我有3个几乎完全相同的networking服务器服务器相同的高负载的dynamic网站,简单的负载平衡的DNS。 这个服务已经使用了相同的apacheconfiguration工作了两年多了。 apache2,php5,ubuntu 8.04 linux 2.6.24-29-server
我的问题:大约两周后,我遇到了这个configuration的问题。 几乎每一天,我都有一个5分钟的小时间,其中网站是无法访问的。 我仍然可以通过SSHlogin到服务器。 如果我跑htop,我看到机器什么都不做。 我有大约1000个Apache进程运行,但没有CPU活动。
我已经使用Apache的mod_status来debugging这种情况。 进程记分牌看起来像这样:
_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
所以大部分stream程只是在等待连接。 大约5分钟后,情况将恢复正常:我在每台机器上都有很less的进程,大多数工作人员都拥有“。” – 地位(他们是开放的来处理一个请求),当然这个网站是可以访问的!
所以我试图find日志中的东西,但没有什么… apache访问日志沉默大约4分钟,同样是错误日志。 我也无法弄清楚其他系统日志中的任何错误。
所有3个networking服务器的情况都是一样的(所有这些服务器同时都有这个负载峰值和无响应的情况),所以我不这样做是硬件相关的。 但我想,这可能与某些networking(tcp)问题有关。
有任何想法吗?
编辑:一些更多的信息,我刚刚发现:
它刚刚发生了。 当我发现这个问题的时候,我可以validation我也不能在本地连接。 发生了netstat -an | awk'/ tcp / {print $ 6}'| sort | uniq -c后,
如果我在一段时间后执行相同的命令,我有这样的事情:
所以在正常情况下,我这个时候只有100-200个由apache处理的客户端连接。 当我有这个“崩溃”,我有更多的连接。 什么是分析这个最好的方法?
编辑2: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 RAM和4GB交换分区。
首先:检查您的Max open files
限制的过程。 一个活动的套接字连接计为一个打开的文件。 cat /proc/###/limits
是检查另一个进程的有效值的好方法。 您可以使用lsof -p ###
获得打开文件的列表,其中###是您的Web服务器的进程ID。 你可以比较lsof -p ### | wc -l
lsof -p ### | wc -l
看你有多接近极限。 如果您达到限制,您还应该在apache的error_log中看到消息。
您需要每个套接字连接的文件句柄,以及每个cgi脚本或数据文件引用。 对于920 MaxClients,您应该为httpd进程configuration至less4,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
和Sending cookies
错误时才会发生。 你还应该确保你的服务器在防火墙的后面,可以阻止恶意的SYN攻击。
您应该启用mod_status的扩展状态( http://httpd.apache.org/docs/2.2/mod/mod_status.html#extentionstatus )以监视当前正在处理的主机和请求。 我认为有一个脚本/页面需要太多的时间来释放连接,并使连接堆叠。
显示你的Apache MPM设置和Keepalive设置。
这可能是这些的一个不好的组合。
编辑:我刚刚看到你提到的PHP。
如果这是你正在使用的mod_php,那么这台机器最好有64GB的内存,否则你永远不会维持2500个连接。
另外,请记住,在prefork MPM中,每个进程将在其内存空间中有PHP(它的内存限制设置是什么?)。 您可能想尝试更改为worker MPM,这可能需要稍微不同的PHP模块。
还值得远程耳环修剪你的Apacheconfiguration多余的模块
根据我的经验,这样的事情是由像search引擎爬行程序或类似ARP冲突的事情触发的。 或在networking的一些相关部分的stream量水平。
你可能会发现'sar'有用…不是最友好的,但肯定有用的。
也可能与io有关。 萨尔可以告诉你(如果你configuration它来logging磁盘活动),等待时间的平均值是多less。 您也可以查看顶部的IO等待时间(这是一个百分比,了解它的实际含义)。 如果您使用SAN或虚拟环境,这可能很重要。