我有一台 128 GB 内存的机器,使用 Apache2 作为 Web 服务器(这台机器没有数据库服务器,数据库机器是一台 64 GB 内存的机器,最多可处理 2000 个连接)。我用监控工具看到目前大约有 44 个繁忙的工作线程和 12 个空闲的工作线程,我的 prefork 模块的最佳理论值是什么?
我在网站高负载时加载网站时有时会出现空白页,并且在我的 Apache 错误日志中收到此错误:
[通知] 子进程 pid 13595 退出信号分段错误 (11)
如何解决这个问题?
我的 Apache2 Prefork 模块配置:
StartServers 3
MinSpareServers 3
MaxSpareServers 5
ServerLimit 3200
MaxClients 3100
MaxRequestsPerChild 0
在 www 机器上释放 -h:
总计:128 G 可用:97GB(运行 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
答案1
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
- 除 Apache 之外的所有内存占用 -10%: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 进程的共享使用量,并将其添加到韋斯(比例设置大小)
最后,用这个数字除以 115 GB,得到MaxClients/ServerLimit
。从这里你可以相对计算其他数字,例如
StartServers
MaxClients 的 30%MinSpareServers
MaxClients 的 5%MaxSpareServers
MaxClients 的 10%ServerLimit
== 最大客户数MaxConnectionsPerChild
10000(作为解决内存泄漏应用程序可能出现的问题的保守替代方案)