我遇到了一个问题,但似乎不知道该如何解决;我有一个普通的 Ubuntu 12.04 服务器,上面运行着 apache 2.2 来运行一个网站。服务器时不时地会过载并开始变得无响应,简单的命令需要很长时间才能执行,直到服务器重新启动或 apache/mysql 重新启动。(网站本身也会完全关闭)
查看错误日志,我看到一个简单的
[error] server reached MaxClients setting, consider raising the MaxClients setting
随后出现一堆 mysqli 无法连接的情况
有人会简单地认为我需要增加 MaxClients,但我已经这样做了几次,我担心自己会通过将其设置得太高而导致服务器超载,下面是 mpm prefork 当前的设置方式:
<IfModule mpm_prefork_module>
StartServers 20
MinSpareServers 10
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 90
</IfModule>
正常情况下,我们大约1700 名用户/访客(24 小时内)。
服务器详细信息:
- 内存:3GB
- CPU:1 - 3300MHz
- 操作系统:Ubuntu 12.04
- Apache:2.2,带有 php 5.3.10 和 Mysql 5.5.41
我粗略地拍了几张照片,从中你可以看到 Apache 在 CPU 再次下降之前占用了大量 CPU:(这是在 Web 服务器上只有几个用户(5 到 20 个)的情况下)
我如何避免服务器崩溃/过载?(我愿意接受任何解决方案,甚至更改为 nginx 或其他可以更好地处理负载的东西)。
此外,我并不关心 RAM 的使用/消耗,因为我可以添加更多的 RAM,我关心的是 CPU。
答案1
下面是一篇很棒的文章的链接,它将有助于确定 mpm_prefork_module 的正确设置。
这个想法是运行一个脚本,它将向您显示每个 Apache 进程消耗了多少内存,然后使用该信息来配置设置。
http://cloudinservice.com/tune-apache-performance-using-mpm-prefork-module/
脚本: http://cloudinservice.com/wp-content/uploads/2011/03/ap.sh.zip
MaxClients 和 ServerLimit。
解压ap.sh.zip
sh ap.sh
输出将是这样的:
Apache 内存使用量(MB):1372.6 平均进程大小(MB):54.9041
尝试执行几次以比较数字;当服务器负载很重时,结果会比较好。现在,当您知道 Apache 消耗的平均内存量和服务器的总内存量时,就可以计算用于 MaxClients 设置的值。
例如,如果您的 Apache 进程平均消耗 50MB RAM,而服务器 RAM 为 2GB,并且您想为其余进程留下 512MB,那么:MaxClients = (2GB - 512MB)/50MB = 30.72 ~ 30。
据我所知,ServerLimit 是同样的东西,但是虽然 MaxClient 设置可以在无需重新启动 Apache 的情况下随时更改,但要使新的 ServerLimit 值生效,则需要重新启动 Apache。
MaxClients 应该始终 <= ServerLimit。为了方便起见,我设置 ServerLimit = 根据上述公式计算的 MaxClients。