先看一下PHP-FPM的配置参数:
pm = dynamic 如何控制子进程,选项有static和dynamic pm.max_children:静态方式下开启的php-fpm进程数量 pm.max_requests:php-fpm子进程能处理的最大请求数 pm.start_servers:动态方式下的起始php-fpm进程数量 pm.min_spare_servers:动态方式下的最小php-fpm进程数 pm.max_spare_servers:动态方式下的最大php-fpm进程数量
区别:
如果pm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
如果pm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。
pm.start_servers缺省值计算公式: min_spare_servers + (max_spare_servers - min_spare_servers) / 2。
选择哪种模式比较合适?
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。
如果内存稍微小点,比如1G,那么指定动态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。
开启多少个php-fpm进程才合适呢?
勒布朗飘说:看内存。简单三个字如雷贯耳。
也就是说,我们需要根据服务器的物理内存来决定最多能够开启多少个子进程。
一般php-fpm进程占用20~30m左右的内存就按30m算。如果单独跑php-fpm,子进程数量的最大值等于服务器物理内存Mem/30M,由于大家一般Nginx、MySQL都在一台机器上,于是预留一半给它们,即php-fpm进程数为$Mem/2/30。
比如,物理内存为2G的服务器,支持的最大的子进程数量为 2048M/2/30M = 34。开启100个子进程,一般要占用2~3G的内存。所以服务器的配置至少要8G了。
查看服务器物理内存,用free -h
如何查看当前子进程的数量?
ps -ef | grep php-fpm | egrep -v “master|grep” | wc -l
pstree | grep php-fpm
查看平均每个php-fpm进程的占用内存?以及所有进程占用的总内存?
查看平均每个php-fpm进程的占用内存:
ps -o “rss,cmd” -C php-fpm | awk ‘{ sum+=$1 } END { printf ("%d%sn", sum/NR/1024,“M”) }’
将php-fpm进程占用的平均大小,乘以进程的数量,就能得出进程的占用内存的总量。
其实上面的命令只要不除以NR(NR表示已经读出的记录数,就是行号,从1开始)就可以获取php-fpm进程占用的总内存:
ps -o “rss,cmd” -C php-fpm | awk ‘{ sum+=$1 } END { printf ("%d%sn", sum/1024,“M”) }’
也可以这样子写:
ps -aux | grep php-fpm | grep -v “grep” | awk ‘{sum += $6} END {print sum/1024}’
ps参数说明:
-C:指定进程名称
-o:指定显示的参数



