阿帕奇没有回应,并没有任何logging经过短暂,强大的“交通波”

我的Apache服务器负载为0.05,服务器的服务器负载一直在300个请求/秒(2兆字节/秒)。

问题是,我的服务体系结构在特定的时刻会导致巨大的stream量(比如300-500人在几秒钟内被JavaScriptredirect到某个页面)。

在这么短的stream量跳跃之后,apache变得没有响应(在firefox中大约30秒后连接重置)而没有logging任何东西。 Apache被冻结,直到apache2重新启动程序。

冻结时,即使是没有PHP或SQL连接的简单HTML文件也不能提供服务(但存在apache2进程)

我尝试了不同的prefork设置从50到几乎1000闲置的工人和最大客户限制10000,但没有什么帮助。

除了没有logging任何东西之外,另一个症状是在冻结前的瞬间,apache状态模块显示(也是最后一次它没有响应之前)几乎每个进程都在等待连接:

__R_R_______R__RR______R___R________________RR_______R______R___ _________R__________R_________________________R________CR___R___ ___________R__________________________C__WR__R________________R_ 

但在正常的,低调的工作表明:

 C___R___K_C___C___C_____KK______R___C_C_R______C__K___C________K ____C__KR_RR__C___K___KK_C__R__K__C_CK__RC___CR___R__K__C__R____ ___KR____C_____R______R______K__R_______KC__C_K__R____C_______R_ 

syslog也没有提供任何东西。 我的机器有64GB RAM,永远不会超过0.1的负载

我认为,当您的连接速度超过每秒450次时,可能与您在Linux中使用临时端口的事实有关。

看看这个以前回答的问题

来自答案的小抽象:


 sysctl net.ipv4.ip_local_port_range sysctl net.ipv4.tcp_fin_timeout 

ephermal端口范围定义主机可以从特定IP地址创build的出站套接字的最大数量。 fin_timeout定义了这些套接字将保持TIME_WAIT状态的最短时间(一次使用后不可用)。 常用的系统默认值是:

 net.ipv4.ip_local_port_range = 32768 61000 net.ipv4.tcp_fin_timeout = 60 

这基本上意味着您的系统在任何时候都不能保证超过(61000 – 32768)/ 60 = 470个插槽。 如果你不满意,你可以开始增加port_range。 现在将范围设置为15000 61000是很常见的。 您可以通过减lessfin_timeout来进一步提高可用性。 假设你们两个都做,你应该会看到超过1500个出站连接。

你可以附加到正在运行的无响应进程,看看会发生什么? 如果你运行prefork可能会更容易。

使用trace附加到进程

 strace -p <pid> -o /tmp/somefile 

你可能想玩-s

-s strsize Specify the maximum string size to print (the default is 32). Note that filenames are not considered strings and are always printed in full.

我同意3molo,strace可以给你提示正在发生的事情,即如果系统调用挂起。 我没有发现的一件事是帮助缓慢的io问题。 运行

 sudo iotop 

 sudo top 

可以给出一些洞察力,看看发生了什么样的IO活动。 在过去,慢IO对我造成了类似的行为; 例如不得不从慢速NAS读取很多非常小的文件。 如果最高报告等待时间较长,iotop显示的带宽百分比较高,则可能需要应用不同的存储解决scheme。

你需要从两件事情开始。

1)将日志级别设置为在Apacheconfiguration中进行debugging。 只要你有问题的行为,看看访问日志和错误日志。

警告:这可能会快速填满磁盘。 因此,一旦有足够的信息,请从debugging切换回其原始值。

2)虽然我同意在这里build议strace选项,我会build议你在运行过程中做gdb。 如果您需要更多关于如何debugging正在运行的进程的帮助,我build议您看看这个 。

听起来很像文件描述符限制。 你需要su到apache运行的用户然后运行这个:

 ulimit -n 

许多发行版的默认设置似乎是1024.如果是这样,请尝试启动。 您可以在基于debian的发行版的/etc/security/limits.conf中更改它。 假设用户apache运行的是apache ,那么你可以添加这个:

 apache soft nofile 65535 apache hard nofile 65535 

您需要重新启动才能应用此更改。