我们有一个用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: Connection reset by peer(104)"。我还提高了文件描述符的最大数目。
我想知道是否有apache大师可以为我指出这种类型的设置(大量轻量级连接)的正确方向。StartServers, Min/MaxSpareServers等的最优值是什么?工人MPM值得研究吗?
我可以给你一些提示:
- 尝试在工作模式下使用Apache而不是预分叉。要做到这一点,要么将PHP置于fastcgi模式(PHP -fpm),要么冒险将其保存在线程apache worker中的mod_php中(风险是一些外部库可能会发生冲突,例如区域设置,但如果您的PHP跟踪代码很小,您可以控制所有启用多线程的东西-没有任何外部库的PHP5是启用多线程的)
- 如果你的MaxClient是600,那么把600放在
StartServers
,MinSpareServers
和MaxSpareServers
。否则Apache正在以非常低的速度创建一个新的分支:
父进程以每秒1个的最大速率创建新的子进程。
如果您认为您的服务器可以处理600个分叉,那么就占用RAM,创建600个分叉,并可能将MaxRequestsPerChild
设置更改为3000之类的东西,以便有时删除旧的分叉并重新创建(避免memleaks)。你不会在fork的创建速率上浪费任何时间,Apache也不会在管理创建和删除children上浪费任何时间。
- 禁用KeepAlive在你的情况下是一件好事,因为你做了 要知道MaxLients的正确值,无论是在prefork还是worker模式下,只需测试它,跟踪一个fork使用的内存并将可用RAM的大小除以这个数字。注意,php也会使用一些内存,在mod_php中,这些内存将在apache fork中使用,在php-fpm中,它将在php-fpm进程中使用,检查php中
memory_limit
设置中一个php进程的最大大小。减少你的PHP内存使用,这样你就可以并行运行更多的PHP脚本。不要构建大数组,保持会话轻等。使用APC操作码可以减少内存占用(并做其他好事情),使用PHP 5.3而不是5.2。