正确理解 pm.max_children 调优

Too*_*ion 8 memory nginx web-server php-fpm php7

我做了一些调查,发现这个可以计算和调整pm.max_children

https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/

但例如:

  • 我的服务器上有 8Gb
  • 我正在托管 30 个网站
  • php-fpm 平均进程大小约为 40mb
  • php-fpm 最大进程大小约为 80mb
  • 我想为 php-fpm 进程分配最大 5Gb 的内存

如果我应用这个:

pm.max_children = 专用于 Web 服务器的总 RAM / 最大子进程大小

所以在我的情况下:

pm.max_children = 5120 / 80 = 64

但是如果我在每个 php-fpm 网站 conf 文件上添加pm.max_children = 64,这意味着每个网站都可以使用64个子进程X 1 个进程的大小(例如40mb)= 2560Mb

如果我们想象,同时所有 30 个网站都达到了 pm.max_children 值,我们将有:2560Mb(每个网站的最大值)x 30 个网站 = 76 800 Mb

我对么?

Si 是的,这意味着当许多网站托管在同一台服务器上时,我们必须将计算结果pm.max_children = 5120 / 80 = 64除以托管网站的数量(这里是 30)。

所以每个网站64 / 30 = 2,1 和pm.max_children = 2

正确与否?

谢谢

Oli*_*ver 9

根据我收集的信息,您的计算是正确的。

只有在并非所有网站都同时使用所有可用资源的情况下,在同一服务器上拥有多个网站才能工作。这就是人们通常所说的过度配置。

但是,我建议不要简单地计算pm.max_children可用 RAM,而是计算Web 正常运行实际上需要多少工人。从较低的东西开始并监视php-fpm.log. 如果max_children达到设置,您会在日志中找到它,您可以增加它。

此外,请确保 PHP 工作人员只在必要时存活。例如,如果出现大量请求,以下配置将允许池使用多达 32 个 PHP 工作线程,但每个工作线程将在 3 秒不活动后退出并释放宝贵的 RAM:

pm = ondemand
pm.max_children = 32
pm.process_idle_timeout = 3s
Run Code Online (Sandbox Code Playgroud)

ondemand如果 RAM 不足,请使用进程管理器。它比dynamicpm慢一点,但不会为不活动的网站浪费 RAM。

如果你想控制 PHP 进程的总数,process.maxphp-fpm.conf. 我从未使用过它,但在我看来,无论池是如何配置的,您都可以使用它来确保永远不会超过一定数量的工作人员。

顺便说一句,为属于不同用户的不同网站使用不同的池是一个很好的主意。这样您就不会在用户权限或从其他网站缓存的数据方面遇到任何问题。

  • 我认为您应该尝试一下,看看它的表现如何。比较`ondemand` 和`dynamic`,不要忘记你也可以混合使用它们(例如`dynamic` 用于繁忙的网络,`ondemand` 用于不太重要的网络)。 (2认同)