您的位置:首页 > 运维架构 > Apache

Apache的工作模式和Keepalive设置导致的SYN_RECV

2012-12-27 17:48 483 查看
首先说一下Apache的工作模式吧:

prefork–Unix平台上的默认(缺省)MPM,使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接,效率高,但内存占用量比较大。(内存!白菜价)

worker–使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。

了解了这些个之后,怎么才能知道你的Apache服务器工作在什么状态呢?使用“apachectl-l”命令就可以显示出来。

由于PHP“至今无法保证其线程安全”,所以一般首选prefork模式。
我们看一下一个典型了prefork模式的参数设置:

<IfModuleprefork.c>
ServerLimit 10000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 1500
MaxRequestsPerChild 0
</IfModule>

有两个主要的参数,MaxClients代表了最大线程数,也就是最大并发连接数。ServerLimit表示连接数上限,默认的MaxClient最大是256个线程,假如想配置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。假如需要更大,则必须编译apache,此前都是无需重新编译Apache。

再说一下SYN_RECV连接状态。
如果Apache的连接数达到了极限,则有可能出现大量的SYN_RECV状态。
可以用
ps -ef|grep httpd|wc -l
来查看Apache的进程数。

netstat -an | grep SYN_RECV
来查看SYN_RECV连接状态。

好吧!万一真的是Apache不堪负重了,出现了SYN_RECV 怎么办?
我这里提供一个优化方法可能会化解这个问题,那就是设置
KeepAlive Off

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
这条语句返回结果如下
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057

SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: