优化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