根据可用 RAM 确定正确的 php-fpm max_children 值

jsj*_*sjw 6 php linux memory system-administration

我正在尝试进行基准测试并找出正确的 PHP-FPMpm.max_children设置。

我使用以下公式计算 PHP-FPM 进程的平均大小:

ps -ylC php-fpm --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'
Run Code Online (Sandbox Code Playgroud)

这会返回 31MB。我在有问题的系统上只有大约 2GB 可以使用 - 所以理论上,如果我将pm.max_childrenPHP-FPM 配置文件内部更改为 2048MB / 31MB = 66。

然后我用ab它来进行基准测试 - 我很快就达到了pm.max_children极限([06-Oct-2021 10:32:37] WARNING: [pool www] server reached pm.max_children setting (66), consider raising it),但我可以看到我有足够的空闲内存。

使用免费检查时:

# free -m
              total        used        free      shared  buff/cache   available
Mem:           1954         914         756          15         284         869
Swap:             0           0           0
Run Code Online (Sandbox Code Playgroud)

于是我pm.max_children就以200——来进一步测试,一次又一次触及极限:

[06-Oct-2021 10:34:46] WARNING: [pool www] server reached pm.max_children setting (200), consider raising it
Run Code Online (Sandbox Code Playgroud)

通过 free 获得的内存使用量较低,但根据计算仍然没有达到我的预期:

# free -m
              total        used        free      shared  buff/cache   available
Mem:           1954        1595          74          15         285         188
Swap:             0           0           0
Run Code Online (Sandbox Code Playgroud)

根据上面的计算,如果每个进程使用 31MB,如 RSS 列所示:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
apache   17558  0.3  1.5 859324 31820 ?        R    10:16   0:02 php-fpm: pool www
apache   17577  0.3  1.5 859468 31848 ?        R    10:16   0:02 php-fpm: pool www
apache   17603  0.3  1.5 859464 31836 ?        R    10:16   0:02 php-fpm: pool www
Run Code Online (Sandbox Code Playgroud)

PHP-FPM进程数为:

ps aux | grep php-fpm | grep -v grep | wc -l
Run Code Online (Sandbox Code Playgroud)

= 200

如果我乘以 RSS 中的值(平均 31000KB)* 200 = ~ 6GB 内存。

但是,如果我使用该ps_mem.py实用程序,PHP-FPM 的总体使用率会低很多:

882.4 MiB +  26.9 MiB = 909.4 MiB   php-fpm (201)
Run Code Online (Sandbox Code Playgroud)

在计算出正确的值方面我错过了什么?

似乎利用可用内存/平均 php-fpm 进程内存(由ps上面的命令计算)的建议给出了不一致的结果。


以下是推荐此方法计算的一些文章供参考pm.max_children