我的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
您需要重新启动才能应用此更改。