警告:[pool www]似乎很忙(你可能需要增加pm.start_servers,或者pm.min/max_spare_servers),产生

Çağ*_*urt 27 php nginx

我有一个CentOS服务器.系统是nginx/php-fpm.它有16GB RAM.CPU:8

CPU频率:2660.203 MHz

为什么我的错误日志中出现此错误?

php-fpm/error.log:

[02-Aug-2014 17:14:04]警告:[池www]似乎很忙(你可能需要增加pm.start_servers,或者pm.min/max_spare_servers),产生8个孩子,有0个空闲,总共21个孩子

这是我的www池的php-fpm配置:

php-fpm/www.conf:

pm =动态

pm.max_children = 32768

pm.start_servers = 10

pm.min_spare_servers = 10

pm.max_spare_servers = 10

pm.max_requests = 5000

如何解决问题?

Rij*_*ael 91

这是一个艰难的cookie,因为可能涉及许多因素.配置的第一个问题是max_children非常高.如果每个子进程使用50MB,那么50 x 32768很容易耗尽16GB.

确定max_children的更好方法是找出每个子进程使用了​​多少,然后考虑你想要php-fpm使用的最大RAM,然后除以值.例如,如果我有一个16GB的服务器,我可以运行以下命令来确定每个php-fpm子项消耗多少ram:

ps -ylC php-fpm --sort:rss
Run Code Online (Sandbox Code Playgroud)

注意!如果php-fpm在不同的下运行,则可能需要显式指定用户.

ps -ylC php-fpm --sort:rss -u www-data
Run Code Online (Sandbox Code Playgroud)

其中www-data是运行php-fpm的用户.

您正在寻找RSS专栏; 它表示驻留内存并以KB为单位.如果我每个进程平均有50MB,并且我想在php-fpm进程中使用最大10GB,那么我所做的只是10000MB\50MB = 200.所以,在此基础上,我可以使用200个孩子来表示我的记忆消耗量.

现在,关于服务器,您需要将max_spare_servers设置为x2或x4核心数.因此,如果您有一个8核CPU,那么您可以从max_spare_servers的值16开始,然后上升到32.

start_servers值应该是max_spare_servers值的一半左右.

您还应该考虑将max_requests丢弃到500左右.

此外,除了动态之外,pm值还可以设置为静态或按需.静态将始终在任何给定时间运行固定数量的服务器.如果您拥有一致数量的用户,或者您希望保证不会超出最大内存,那么这很好.按需只会在需要时启动进程.缺点显然是必须不断启动/终止进程,这通常会导致请求处理的延迟很小.好处是,您只需在需要时使用资源."动态"始终启动在start_servers选项中指定的X数量的服务器,并根据需要创建其他进程.

如果您仍然遇到内存问题,请考虑将pm更改为按需.

这是一般指导原则,您的设置可能需要进一步调整.实际上是使用设置和运行基准测试来获得最佳性能和最佳资源使用情况.这有点单调乏味,但这是确定这些类型设置的最佳方法,因为每个设置都不同.

  • max_requests不是关于可以处理多少并发请求.这意味着在php子进程500请求(当时一个)之后,它被杀死然后重新生成为一个全新的未使用进程.它有助于对抗内存泄漏. (7认同)
  • 这是一个很好的解释,但是ps命令中的RSS值将包含已加载的共享库使用的内存(/sf/ask/551654911/ -管理)。在测试中,基于上述发现,我发现max_children应该为50,我可以毫无问题地将其设置为150。我想说这是一种调整的设置,而不是使用固定公式进行设置。 (3认同)
  • `pm.max_requests` 根据 [php.net](https://www.php.net/manual/en/install.fpm.configuration.php#pm.max-requests): _每个子进程应该请求的数量重生前执行。这对于解决第 3 方库中的内存泄漏非常有用。对于无休止的请求处理指定“0”。相当于“PHP_FCGI_MAX_REQUESTS”。默认值:0._ (2认同)