适用于大量轻量级连接的Apache2优化技巧

时间:2011-11-10 22:38:44

标签: php apache apache2 benchmarking worker

我们有一个用PHP编写的非常轻量级的跟踪脚本,运行在Apache / 2.2.14(Ubuntu)上。该脚本将接收大量并发连接,但每个连接都会很快。目前,我们正在使用prefork,配置如下:

StartServers          5
MinSpareServers       5
MaxSpareServers      10
ServerLimit         600
MaxClients          600
MaxRequestsPerChild   0

我们也有KeepAlive Off

我已经玩了很多这些设置,并且已经使用apache基准测试了。无论何时我用ab引发并发连接,我都会得到“apr_socket_recv:对等连接重置(104)”。我还提出了文件描述符的最大数量。

我想知道是否有任何阿帕奇大师可以指出我正确的方向进行这种类型的设置(大量的轻量级连接)。 StartServers,Min / MaxSpareServers等的最佳值是多少?工人MPM值得研究吗?欢迎任何想法。

1 个答案:

答案 0 :(得分:4)

我可以给你一些提示:

  • 尝试在工作模式下使用Apache而不是prefork。要做到这一点,要么将PHP置于fastcgi模式(php-fpm),要么冒险将其保存在线程apache worker中的mod_php中(风险是siome外部库可能会发生冲突,如区域设置,但如果你的PHp跟踪代码是小你可以控制所有有多线程启用的东西 - 没有任何外部库的PHP5是多线程启用的)
  • 如果MaxClient为600,则将{600}放入StartServersMinSpareServersMaxSpareServers。否则Apache正在very low speed创建一个新的分支:
  

父进程以每秒1的最大速率创建新子进程。

如果您认为您的服务器可以处理600个分叉,那么请使用RAM,创建600个分支,并可能将MaxRequestsPerChild设置更改为3000,以便有时删除并重新创建旧分叉(避免使用memleaks) 。您不会在fork创建速率中随时丢失,并且Apache不会在管理创建和删除子项时随时丢失。

  • 在您的情况下禁用KeepAlive是一件好事,就像你做的那样
  • 要知道MaxLients的正确值是什么,无论是在prefork还是在worker模式下,只需测试它,跟踪一个fork使用的内存,并用这个数字划分可用RAM的siez。小心,php也会使用一些RAM,用mod_php这个RAM会在apache fork内存中使用,在php-fpm中它会在php-fpm进程中,检查PHP中的memory_limit设置为一个PHP进程的最大大小。
  • 减少PHP RAM使用量,以便您可以并行运行更多PHP脚本。不要构建大数组,保持会话光等。使用APC操作码可以减少你的内存占用(并做其他好事),使用PHP 5.3而不是5.2。