调优Apache2 prefork MaxClients ServerLimit


22

我有一台具有128 GB Ram的计算机,该计算机使用Apache2作为Web服务器(在这台计算机上没有数据库服务器,数据库计算机是一台64 GB Ram计算机,可以处理2000个最大连接)。我通过监视工具看到,目前大约有44名忙碌的工人和12名闲置的工人,对于我的前叉模块来说,什么是最佳理论值?

我有时会在高负载时间加载网站时出现空白页面,并且在我的Apache错误日志中看到此错误:

[注意]子pid 13595退出信号分段错误(11)

怎样才能解决这个问题呢?

我的Apache2 Prefork模块配置:

StartServers          3
MinSpareServers       3
MaxSpareServers       5
ServerLimit           3200
MaxClients            3100
MaxRequestsPerChild   0

在www机器上的Free -h

总计:128 G可用:97 GB(运行apache2)共享的0b缓冲区1.9G缓存23G

Apache2和其他程序使用的Ram:

Private  +   Shared  =  RAM used    Program

 96.0 KiB +  61.0 KiB = 157.0 KiB   sh
176.0 KiB +  26.0 KiB = 202.0 KiB   atd
176.0 KiB +  35.5 KiB = 211.5 KiB   acpid
208.0 KiB +  19.5 KiB = 227.5 KiB   mdadm
204.0 KiB +  30.0 KiB = 234.0 KiB   init
248.0 KiB +  62.0 KiB = 310.0 KiB   sendmail
376.0 KiB +  36.0 KiB = 412.0 KiB   dbus-daemon
388.0 KiB + 285.5 KiB = 673.5 KiB   cron (2)
820.0 KiB +  42.0 KiB = 862.0 KiB   gam_server
920.0 KiB + 108.0 KiB =   1.0 MiB   ntpd
968.0 KiB + 243.0 KiB =   1.2 MiB   getty (6)
  1.3 MiB + 351.5 KiB =   1.6 MiB   udevd (3)
  1.5 MiB + 343.0 KiB =   1.8 MiB   sendmail-msp
  2.0 MiB + 910.0 KiB =   2.9 MiB   plugin-localresources2
  3.4 MiB +  50.0 KiB =   3.4 MiB   rsyslogd
  3.6 MiB +  68.5 KiB =   3.7 MiB   bash
  1.9 MiB +   2.1 MiB =   4.0 MiB   sendmail-mta (4)
  3.8 MiB + 556.0 KiB =   4.3 MiB   sshd (2)
  3.7 MiB +   1.2 MiB =   4.8 MiB   plugin-apache2
  5.1 MiB +   1.2 MiB =   6.3 MiB   agent-service
  7.0 MiB + 654.0 KiB =   7.6 MiB   fail2ban-server
  9.6 MiB +   2.6 MiB =  12.2 MiB   proftpd (8)
 59.2 MiB +  70.0 KiB =  59.3 MiB   miniserv.pl
 96.8 MiB +   3.6 MiB = 100.4 MiB   php5-cgi (2)
196.4 MiB +  35.9 MiB = 232.3 MiB   apache2 (40)
---------------------------------
                     tot 450.0 MiB

2
Web服务器中正在运行的应用程序代码是什么?这很可能是罪魁祸首。
Shane Madden

请发送一些apache2ctl状态的样本;error_log中可能有任何内容吗?
HrvojeŠpoljar2014年

Answers:


63

Apache prefork设置(根据Apache性能调整指南)

引用:

The single biggest hardware issue affecting webserver performance is RAM.
A webserver should never ever have to swap, as swapping increases the latency
of each request beyond a point that users consider "fast enough". 
This causes users to hit stop and reload, further increasing the load.
You can, and should, control the MaxClients setting so that your server does
not spawn so many children it starts swapping. This procedure for doing this
is simple: determine the size of your average Apache process, by looking at
your process list via a tool such as top, and divide this into your total 
available memory, leaving some room for other processes.

您应该根据以下输入内容将其设置为:

  • 总内存:128 GB
  • -10%的内存(apache除外):115 GB
  • 现在我们需要弄清楚单个apache进程正在使用多少。

要计算此值,可以使用以下脚本:

pgrep apache2 | xargs -n1 -I{} cat /proc/{}/smaps | \
  awk '{if ($0 ~ /stack/) {pids+=1} else if ($0 ~/^Shared_/) 
    {shared+=$2} else if ($0 ~ /^Pss:/) {priv+=$2}} END {
      printf "%.2f MB\n",(priv+shared/(pids*pids))/1024}'

这是对单个apache进程正在使用内存的最佳估计,同时尝试按活动apache进程的数量按比例划分共享使用并将其添加到Pss(比例集大小)之上

最后,您将115 GB与此数字相除,得到MaxClients/ServerLimit。从这里您可以相对计算其他数字,例如

  • StartServers 30%的MaxClients
  • MinSpareServers MaxClients的5%
  • MaxSpareServers MaxClients的10%
  • ServerLimit == MaxClients
  • MaxConnectionsPerChild 10000(作为解决内存泄漏应用程序可能出现问题的保守选择)

2
我希望代表比我多的人会给你投票给这个答案,非常感谢!
User-N

2
您的计算脚本给了我842.13 MB。这大约比我要高一个数量级(CentOS 6.7上的Apache 2.2)。
Quinn Comendant 2015年

1
它处于前叉模式。输出/server-info如下:i.imgur.com/SS2gIXI.png
Quinn Comendant 2015年

1
@QuinnComendant的恶作剧,但是,如果有可用的前叉模块,IfModule将为true(实际上),并且两个选项都可用,worker和MPM ...我在worker上的服务器和系统上的内存使用量相同,约为850 MB。prefork无法用于1个进程800 MB的内存。您更改了脚本中的行,该行将进程名称apache2引用到httpd正确吗?
HrvojeŠpoljar2015年

1
@shawn为什么这么说?您认为应该如何计算?
HrvojeŠpoljar17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.