优化php-fpm进程池

最近好几次MySQL数据库挂掉,导致wordpress提示无法连接到DataBase。

之前也注意到linux服务器的内存会随着运行时间缓慢增加,有时候会自动降低,有时候不会。

以前手动用 top 命令查过进程情况,发现主要是php-fpm线程会出现好几个,然后随着服务器运行时间增加,php-fpm占用的内存也会增加,最后就可能出现爆内存的情况。

用top命令查看进程情况,可以看到有很多个php-fpm进程:

...
24317 root      20   0  326888  13336   7372 S  0.0  1.3   0:00.02 php-fpm 
24318 apache    20   0  351788  32992   3916 S  0.0  3.3   0:00.48 php-fpm 
24319 apache    20   0  343192  25516   3736 S  0.0  2.5   0:00.20 php-fpm
24320 apache    20   0  337404  18556   3924 S  0.0  1.8   0:00.24 php-fpm  
24321 apache    20   0  337388  18508   3912 S  0.0  1.8   0:00.24 php-fpm  
24322 apache    20   0  420556  26200   4672 S  0.0  2.6   0:00.23 php-fpm
...

网上查资料说, php-fpm闲置进程一直不释放,是由于FastCGI 进程一旦加载就不会释放,当其工作完成后,就休眠于 FastCGI 系统池中,等待下一次被唤醒,所以服务器运行时间一久,内存占用就变大。

之前经常用手机上服务器管理APP查看服务器状态,当发现服务器的内存占用较高的时候,每次都手动重启php的服务进程,把php-fpm的线程全部刷新。

service php-fpm restart

但最近发生了好几次服务器爆内存的情况,访问网站的时候,wordpress都提示无法连接到DataBase。

每次都是ssh登录服务器,用 top 命令查看进程情况。发现是linux系统把 mysql 进程给kill,导致wordpress无法连接数据库,网页打开异常。于是老样子,只要重新启动MySQL就可以打开wordpress网站了。

systemctl restart mysql

重启后,再用top命名查看进程,可以看到mysqld 占用的内存比较高,但比较稳定,每次linux内存不足,都杀它..

23164 mysql     20   0 1133392 200704   8872 S  0.0 19.8   0:01.34 mysqld  

优化过程

弄清楚wordpress报错的原因,准备优化php-fpm线程池数量。
首先,cd命令切换到php配置文件目录,ll查看配置文件名称,vim修改配置文件。

cd /etc/php-fpm.d/
ll
vim www.conf

通过vim命令打开php-fpm配置文件如下(修改php生成的进程数)。

pm = dynamic

; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI.
; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
; Note: This value is mandatory.
pm.max_children = 50

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 6

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 4

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 20

; The number of seconds after which an idle process will be killed.
; Note: Used only when pm is set to 'ondemand'
; Default Value: 10s
;pm.process_idle_timeout = 10s;

服务器php-fpm配置文件注释说明很多,后面的都是注释说明,只有少量几行是配置信息,可以直接看英文注释进行修改。
pm= dynamic表示使用dynamic(动态)线程;另外可以配置 static(静态),适合内存比较大的服务器。
pm.max_children:在动态方式下,php-fpm的最大进程数(pm.max_spare_servers只能小于等于pm.max_children),默认值50。
pm.start_servers:动态方式下的起始php-fpm进程数量,默认值6。
pm.min_spare_servers:动态方式空闲状态下的最小php-fpm进程数量,默认值4。
pm.max_spare_servers:动态方式空闲状态下的最大php-fpm进程数量,默认值20。

服务器只有1G的RAM,用php-fpm 默认配置,显然不太适用。

根据网络资料(正确未知?):

运行的PHP程序在执行完成后,或多或少会有内存泄漏。对于内存大的服务器(8G)以上,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。
对于小内存的服务器,动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。

所以直接把各个参数全部改到比较小,修改后参数如下(已省略文件中的注释内容)。

...
pm = dynamic
pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
...

再次手动重启php的服务进程,把php-fpm的线程全部刷新。

service php-fpm restart

用top命令查看进程情况

Tasks:  80 total,   2 running,  78 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1014092 total,   380596 free,   346644 used,   286852 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   480684 avail Mem 

用free -m命令查看内存占用

              total        used        free      shared  buff/cache   available
Mem:            990         338         371          50         280         469
Swap:             0           0           0

刚刚重启完php-fpm ,重启php进程内存占用得到优化,内存占用比较少。

具体效果还得观察一段时间才知道,不出意外应该可以比较稳定的运行了。

参考资料

参考CSDN网站两篇关于“优化php-fpm进程池”的资料:
链接1 https://blog.csdn.net/a5816138/article/details/53670597
链接2 https://blog.csdn.net/lxf0613050210/article/details/78192575