我们有一个非常轻量级的跟踪脚本,用PHP编写,可在Apache / 2.2.14(Ubuntu)上运行.该脚本将接收大量并发连接,但是每个连接都将很快.当前,我们正在使用prefork,其配置如下:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 600
MaxClients 600
MaxRequestsPerChild 0
我们还关闭了KeepAlive
我已经在这些设置上进行了很多尝试,并且一直在使用apache基准测试.每当我提高与ab的并发连接时,都会收到“ apr_socket_recv:对等方重置连接(104)”.我还提高了文件描述符的最大数量.
我想知道是否有任何apache专家可以为这种类型的设置(大量轻量级连接)指出正确的方向. StartServer,Min / MaxSpareServers等的最佳值是什么?工人MPM值得研究吗?任何想法都欢迎.
解决方法:
我可以给你一些提示:
>尝试在工作人员模式下使用Apache,而不要使用prefork.为此,请将PHP置于fastcgi模式(php-fpm)或冒着将其保留在线程化的Apache工作者内部的mod_php中的风险(风险是siome外部库可能会发生冲突,例如语言环境设置,但是如果您的PHp跟踪代码是很小,您可以控制所有启用多线程的功能-没有任何外部lib的PHP5启用多线程)
>如果您的MaxClient是600,则在StartServers,MinSpareServers和MaxSpareServers中放入600.否则Apache将在very low speed处创建一个新的fork:
the parent process creates new children at a maximum rate of 1 per second.
如果您认为您的服务器可以处理600个分叉,则占用RAM,创建600个分叉,并可能将MaxRequestsPerChild设置更改为3000,这样有时会删除并重新创建旧的分叉(避免内存泄漏).您不会在分叉创建率上有任何损失,并且Apache也不会在任何时候管理子项的创建和删除方面有所损失.
>与您一样,禁用KeepAlive对您而言是一件好事
>要知道在前叉模式或工作模式下MaxLients的正确值是什么,只需对其进行测试,跟踪一次前叉使用的内存,然后将可用RAM的大小除以该数字即可.请注意,php也会使用一些RAM,与mod_php一起,该RAM将在apache fork内存中使用,在php-fpm中它将在php-fpm进程中,检查PHP中的memory_limit设置是否为最大大小PHP过程.
>减少您的PHP RAM使用量,以便您能够并行运行更多PHP脚本.不要构建大型数组,保持会话状态良好,等等.使用APC操作码可以减少内存占用(也可以做其他一些不错的事情),同时使用PHP 5.3而不是5.2.