上周有一次公司一个服务器有问题,跟系统部一起调试,留下了一些关于Apache服务器最大连接数设置的经验。把其中干货记录一下。
现象是,
- uptime中系统负载极高
- vmstat的cpu数据中,idle为0,sys占用大部分cpu,又是有wa
- vmstat的swap数据中出现大量的si/so,vmstat的IO量激增
- free,内存耗尽
- 分析:Apache连接数达到上限后服务器物理内存用尽,导致大量的内存和磁盘交换,进而导致CPU负载上升,服务器整体响应下降。
解决方法,
- 将这台服务器的apache最大连接数设低,保证进来的请求都处理好。(估算一个机器该设置多少apache连接见下面)
- 新增一台内存更大的服务器跑apache
- 将不同的业务分散到两天机器上
根据内存估算服务器apache最大连接数设置的方法:
- ps aux|grep httpd,先看看每个apache进程消耗的内存是否平均(第六列)
- ps aux|grep -v grep|awk ‘/httpd/{sum+=$6;n++};END{print sum/n}’,计算每个apache连接平均耗多少内存
- 最大连接数 = (物理内存/单apache进程平均内存)*2,这个设置比较保守,据说可以设到“*3”。看实践。
影响apache连接数设置的还有:CPU、服务器上的其他服务、网络IO、磁盘IO、系统网络连接数限制等等,每个都可能是瓶颈。连接数上限应取上述参数中短板的数值。