我已经用 Nginx 和 PHP5-FPM 设置了一个服务器,一切运行良好。然而,随着我向服务器添加越来越多的网站,我发现内存使用量稳步增加,我得出结论,PHP5-FPM 是“罪魁祸首”。
我目前的做法是为每个网站设置一个单独的 PHP5-FPM 池,并根据预期流量配置该池。但是,如果网站数量足够多,我最终会拥有一个服务器,该服务器仅驻留大量 PHP5-FPM“子进程”,等待工作。
我刚刚发现一经请求PHP5-FPM 模式,它允许我以某种方式配置 PHP5-FPM,以便仅在实际需要时才分叉子进程,然后在给定的时间内保持活动状态以进行处理。
然而,我找不到太多关于这方面的细节。我最好奇的是变量pm.max_children和pm.max_requests影响一经请求模式(如果有的话)。我假设变量pm.start_servers,pm.min_spare_servers,pm.max_spare_servers不适用于一经请求模式。
答案1
您说得对,start_servers、min_spare_servers 和 max_spare_servers 不适用于 ondemand 模式。以下变量适用于 ondemand 模式:
- pm.max_children
- pm.process_idle_timeout
- pm.max_requests
当你设置 pm = ondemand 时,FPM 会在需要时立即 fork 子进程,始终保持子进程数量小于或等于 pm.max_children,所以这个变量是同时 fork 的子进程数量的上限。
另外两个变量允许您指定何时必须销毁子项:
pm.process_idle_timeout 设定子进程在被销毁前等待的空闲时间。以秒为单位。
pm.max_requests 定义子进程在被销毁之前将处理多少个请求(一次一个)。例如,如果您将此变量的值设置为 50,则子进程将处理 50 个请求并自行关闭。如果 FPM 主进程仍需要其他子进程,它将分叉一个新的子进程。
在我的公司,我们在 FPM 上使用 ondemand 模式,并使用 pm.max_requests 强制回收 fpm 子进程并避免高内存使用率。
希望这可以帮助,
问候。
答案2
可能是这个错误 https://bugs.php.net/bug.php?id=72935
TLDR;如果两个客户端在子进程中发生 accept() 之前,在同一个 unix 套接字上以按需模式连接到 PHP-FPM,则只有一个客户端会被 accept()。