Apache 2.2(mod_event) + php-fpm + apc + fastcgi 已达到最大客户端数

Apache 2.2(mod_event) + php-fpm + apc + fastcgi 已达到最大客户端数

我目前在 Debian Wheezy 上运行带有 mod_event、php-fpm 和 apc 的 apache2.2。我托管了 3 个正常网站和 1 个非常糟糕的网站,该网站的代码非常糟糕,有时需要 2 分钟才能加载一个页面。数据库已经在 RDS 上运行,应该不是问题,而是代码执行低效的数据库查找。但是,我们不再有 PHP 开发人员,因此无法修复代码。

在访问该站点的某个时候,apache 也会达到 MaxClients 和 FPM。

apache2ctl -M 输出

  Loaded Modules:
  core_module (static)
  log_config_module (static)
  logio_module (static)
  version_module (static)
  mpm_event_module (static)
  http_module (static)
  so_module (static)
  actions_module (shared)
  alias_module (shared)
  authz_host_module (shared)
  deflate_module (shared)
  dir_module (shared)
  env_module (shared)
  expires_module (shared)
  fastcgi_module (shared)
  mime_module (shared)
  negotiation_module (shared)
  reqtimeout_module (shared)
  rewrite_module (shared)
  setenvif_module (shared)
  ssl_module (shared)
  status_module (shared)
  Syntax OK

Mod_Event 配置

  <IfModule mpm_event_module>
  StartServers          2
  MinSpareThreads      25
  MaxSpareThreads      75
  ThreadLimit          64
  ThreadsPerChild      25
  MaxClients          150
  MaxRequestsPerChild 0
  </IfModule>

保活设置:

  Keepalive On
  MaxKeepAliveRequests 100
  KeepAliveTimeout 5

FPM配置:

 pm = dynamic
 pm.max_children = 5
 pm.start_servers = 2
 pm.min_spare_servers = 1
 pm.max_spare_servers = 3

装甲运兵车:

extension=apc.so
apc.enabled=1
apc.shm_size=128M
apc.ttl=3600
apc.user_ttl=7200
apc.gc_ttl=3600
apc.max_file_size=1M

Fastcgi apache 配置:

<IfModule mod_fastcgi.c>
 AddHandler fastcgi-script .fcgi
 AddHandler php5-fcgi .php
 #FastCgiWrapper /usr/lib/apache2/suexec
 FastCgiIpcDir /var/lib/apache2/fastcgi
 Action php5-fcgi /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-   header Authorization -idle-timeout 250
 </IfModule>

您能给我一些关于如何优化此设置的建议吗?谢谢您的帮助。

服务器负载非常低(0.00 0.01 0.05 1/169 4823)

内存看起来不错:

               total       used       free     shared    buffers     cached
 Mem:          2011        431       1580          0         74        229
 -/+ buffers/cache:        126       1885

答案1

事件模块设置应根据您的内存使用情况进行设置。查看您的内存负载,这些设置设置得太低了。您需要使用许多命令之一来估计每个进程的使用情况:

ps aux | grep 'apache2' | awk '{print $6/1024;}' | awk '{avg += ($1 - avg) / NR;} END {print avg " MB";}'

请注意,Google 上有数百万个网站具有类似的命令。

由于您正在运行 PHP-FPM,您可能也必须对其进行测量(只需更改 grep 部分)。最好的方法是在负载下进行测量。您可以使用 ab 测试或其他类似的解决方案来执行此操作。

例如,如果您的内存使用量是每个连接 20mb(这是上述命令的输出)。由于您的总内存为 2011mb,因此您需要减去 Linux 的开销、任何缓存机制等... 建立一些空间,然后取该数字(例如 1800mb)并除以 apache 进程。

例如,如果您的结果是每个进程 20mb,则可以将 MaxClients 设置为 90。如果命令的结果是 1mb,则可以将其设置为 1800 MaxClients。同时,我会确保建立一个缓冲区,因为所有应用程序都不相同。您的一个站点可能使用 1mb,而其他站点使用 40mb。您要确保建立一个合理的缓冲区,否则您的 Apache 服务器将一直崩溃。我通常根据服务器设置 10%-20%。

许多人认为你应该将其设置为 PHP 内存限制。这是一个安全选择,并且可能是一个不错的选择,具体取决于你的设置。需要高级管理员才能调整服务器使其超出该点,并且几乎没有失败的风险。

另外我通常会关闭 KeepAlive,我发现这样做可以获得更好的性能。

相关内容