PHP-FPM的配置,参数详解以及性能优化

上一篇《PHP-FPM的原理及使用》,介绍了关于php-fpm的今生前世以及如何与nginx交互的全过程。这一篇主要是说明php-fpm在服务器上是如何配置,对应的参数说明以及该怎么去优化

一 参数配置以及说明

这个配置是我们一个团队设置在测试环境里面的,主要参数说明如下:

pm = dynamic; 

这个配置有两个参数:1 dynamic; 2 static;

dynamic表示php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers;

static表示php-fpm进程数是静态的,进程数自始至终都是pm.max_children指定的数量,不再增加或减少。

以上图为例说明,

pm.start_servers = 2; (dynamic方式)起始php-fpm进程数量

pm.min_spare_servers = 1; (dynamic方式)最小php-fpm进程数量

pm.max_spare_servers = 6; (dynamic方式)最大php-fpm进程数量

需要说明的是,

如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

二 参数调优

每个子进程同时只能服务一次连接,如果过少会导致很多不必要的重建和销毁的开销,如果过多又会占用过多的内存,影响其他服务使用。所以控制同时存在多少个进程数就很重要。在实际生产中,一开始,一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M。原因是,PHP程序在执行完成后,或多或少会有内存泄露的问题。无论是dynamic还是static(选择哪种方式,要看服务器CPU的配置),需要设置最大进程数。那么这个进程数要怎么设置呢?看到网上有个公式是: 总内存/30M。那为什么是30M呢?这个我没有找到具体出处。在实际的工作中,我们其实是可以查看当前服务器中fpm进程大小的,然后根据实际的大小来设置进程数目。

三 查看FPM进程命令

1 按 FPM 进程实际占用内存大小排序

ps -ylC php-fpm --sort:rss

这样的结果是按 KB 大小显示的, 而 ps 命令本身不支持将其转换为按 MB 显示, 所以需要使用 awk

ps -ylC php-fpm --sort:rss | awk 'NR>1 {$8=int($8/1024)"M";}{ print;}'

这个是获取所有FPM进程的大小;我们也可以获取FPM进程的平均大小值

2 所有 FPM 进程占用内存的平均值

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

得到这些值之后就可以根据服务器内存的大小设置合适的进程数目了。

Sea Bridge

古之立大志者,不惟有超世之才 亦必有坚韧不拔之志!

发表评论