Ubuntu 服务器的 Apache 2.2 / MySQL 过载

Ubuntu 服务器的 Apache 2.2 / MySQL 过载

我遇到了一个问题,但似乎不知道该如何解决;我有一个普通的 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 个)的情况下)

高负荷 1 高负荷2

我如何避免服务器崩溃/过载?(我愿意接受任何解决方案,甚至更改为 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。

相关内容