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_children
PHP-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
: