PHP5-FPM和“ondemand”

我build立了一个Nginx和PHP5-FPM的服务器,事情运行良好。 但是,随着我向服务器添加越来越多的站点,我发现内存使用率稳步增长,我得出的结论是PHP5-FPM是“责备”的。

我目前所做的是为每个站点设置单独的PHP5-FPM池,并根据预期的stream量configuration该池。 但是,如果有足够的网站,我最终会有一台服务器,它只是在等待工作的相当多的PHP5-FPM“孩子”上工作。

我刚刚发现了按需 PHP5-FPM模式,它允许我以某种方式configurationPHP5-FPM,以便subprocess只在实际需要时分叉,然后在给定的持续时间内保持活动状态以进行处理。

但是,我不能在这方面find太多的细节。 我最感兴趣的是variablespm.max_childrenpm.max_requests如何影响按需模式(如果有的话)。 我假设variablespm.start_serverspm.min_spare_serverspm.max_spare_servers不适用于onmand模式。

你是对的,start_servers,min_spare_servers和max_spare_servers不适用于onmand模式。 以下variables适用于按需模式:

  • pm.max_children
  • pm.process_idle_timeout
  • pm.max_requests

当你设置pm = ondemand时,FPM将会根据需要尽快分出儿童,总是让孩子小于或等于pm.max_children,所以这个variables是同时分出的儿童数的上限。

另外两个variables允许你指定一个孩子何时被销毁:

  • pm.process_idle_timeout设置一个孩子在没有工作的情况下等待多久才被销毁。 它是在几秒钟内定义的。

  • pm.max_requests定义了一个孩子在被销毁之前处理的请求数量(一次一个)。 例如,如果将此variables的值设置为50,则子代将处理50个请求并自行closures。 如果FPM主进程仍然需要另一个孩子,它将分叉一个新的。

在我们公司,我们在FPM上使用ondemand模式,我们使用pm.max_requests来强制回收fpm儿童,并避免使用高内存。

希望这可以帮助,

问候。

这可能是这个错误https://bugs.php.net/bug.php?id=72935

TLDR; 如果两个客户端在同一unix套接字上按需模式连接到PHP-FPM之前accept()发生在孩子中只有一个获得accept()。