顺晟科技
2021-06-16 10:32:32
236
默认情况下,php-fpm.conf有以下配置(如果php-fpm.conf没有找到这个配置,那么这个配置在www.conf) :
pm=动态
pm.max_children=50
pm.start_servers=20
pm.min_spare_servers=10
pm.max_spare_servers=30
Pm表示使用哪种过程数量管理方法
当值为动态时,表示FastCGI进程数是动态的,由pm.start_servers在开始时指定。如果有更多的请求,它将自动增加,以确保空闲进程的数量不小于pm.min_spare_servers。如果有更多的进程,它将被相应地清理,以确保冗余进程的数量不超过pm。max _ spare _ servers。
当值为静态时,表示php-fpm进程数是静态的,进程数是pm.max_children从头到尾指定的数,不会增减
Pm.max_children配置在静态模式下打开的FastCGI进程数
Pm.start_servers以动态模式配置启动FastCGI进程的数量
Pm.min_spare_servers在动态模式下配置最小数量的FastCGI进程
动态模式下FastCGI进程的更大数量由pm.max_spare_servers配置
数值设置参考你的实际硬件配置,参考总内存/30M计算。
如果dm设置为静态,只有参数pm.max_children实际生效。系统将打开FastCGI进程来设置该号码。
如果dm设置为动态,参数pm.max_children无效,最后三个参数生效。在php-fpm运行之初,系统会启动pm.start_servers FastCGI进程,然后根据系统需求动态调整pm.min_spare_servers和pm.max_spare_servers之间的FastCGI进程数。
如何选择“pm=动态”或“pm=静态”
事实上,就像Apache一样,运行的PHP程序在执行后或多或少都会有内存泄漏的问题。
这也是为什么一个php-fpm进程在一开始只占用3M左右的内存,运行一段时间后会上升到20-30M。
对于内存大的服务器(比如8G以上),使用static max_children其实更合适,因为不需要控制额外的进程数,这样会提高效率。因为php-fpm进程频繁开关机会延迟,内存足够大的时候静态效果会更好。量也可以根据总内存/30M得出。比如8GB的内存可以设为100,那么php-fpm消耗的内存就可以控制在2G-3G。
对于内存小的服务器,比如1~2G,指定静态进程数更有利于服务器的稳定。这样可以保证php-fpm只得到足够的内存,不会给其他应用分配太多的内存,这样会让系统运行的更顺畅。
对于内存小的服务器,比如内存256M的VPS,即使按照20M的内存量计算,10个FastCGI进程也会消耗200M的内存,所以系统崩溃应该是正常的。
所以FastCGI进程的数量要尽量控制,在其他应用占用的内存一般已知后,再分配一个静态的小数量给它,这样会让系统更加稳定。
或者使用动态模式,因为动态模式会结束冗余进程,可以回收释放部分内存,所以建议在内存较少的服务器或者VPS上使用,具体更大数量可以按照总内存/20M来获得。
例如,对于512M VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,建议根据服务器的负载情况进行设置,比较合适的值在5-10之间。
总结:建议小内存使用动态(pm=动态),大内存使用静态(pm=静态)。
使用以下命令查看平均内存状况
ps - no-headers -o 'rss,cmd '-C PHP-fpm | awk ' { sum=$ 1 } END { printf(' % d % s \ n ',sum/NR/1024,' M') } '
使用以下命令确定每个PHP-FPM子进程(即FastCGI)使用的内存:
ps -ylC php-fpm - sort:rss
08
1972-02
17
2022-03
03
2021-08
16
2021-06
16
2021-06
16
2021-06