阿帕奇没有回应,并没有任何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 

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