解决PHP-FPM进程数导致的服务器内存耗尽

问题

最近博客服务器经常内存偏高,甚至内存占满,导致长时间持续报警,先查看下监控数据
@内存占满 | center | 0
最简单粗暴也是马上见效的方法是重启服务,干脆重启服务器,这个对于某些临时进程导致的内存虚高可能有效,这里显然是不行,不要问我怎么知道的。。。因为已经试过一次了,囧!趁着周末下午抽点时间解决下这个问题。

解决

查看服务器内存及进程状况

14031 www       20   0  558712  42888  23616 S   0.0  1.1   0:05.37 php-fpm
14036 www       20   0  547752  41536  20504 S   0.0  1.1   0:04.36 php-fpm
14030 www       20   0  548040  40772  19436 S   0.0  1.1   0:04.29 php-fpm
14193 www       20   0  546488  38768  19024 S   0.0  1.0   0:01.80 php-fpm
14188 www       20   0  557020  36404  16932 S   0.0  0.9   0:01.91 php-fpm
...

php-fpm进程多达几十个,导致占用大量内存,考虑设置php-fpm进程相关参数:
配置文件地址/usr/local/php/etc/php-fpm.conf
查看原始pm进程相关配置:

pm = dynamic    # 静态static,动态dynamic,按需ondemand
pm.max_children = 50    #静态方式下开启的php-fpm进程数量
pm.start_servers = 30   #动态方式下的起始php-fpm进程数量
pm.min_spare_servers = 20   #动态方式下的最小php-fpm进程数量
pm.max_spare_servers = 50   #动态方式下的最大php-fpm进程数量
pm.max_requests = 2048  #超过这个请求数量重生子进程
pm.process_idle_timeout = 10s #按需方式下多长时间杀掉php-fpm子进程,直到master进程

修改后的配置:

pm = dynamic
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 10
pm.max_requests = 1024

刚开始查看单个php-fpm进程占用内存为80M多,重启php-fpm后单个进程占用内存42M左右,为何会相差如此之多确实有点纳闷。。。

pm模式

pm的模式有三种:静态static、动态dynamic、按需ondemand

static: 静态模式,顾名思义,一旦设置好,不能更改,相关参数:pm.max_children
dynamic: 动态模式,相关参数:启动进程数pm.start_servers,启动后进程数在pm.min_spare_serverspm.max_spare_servers之间,超过pm.max_requests请求数重新生成子进程
ondemand:按需模式,相关参数:闲置进程持续pm.process_idle_timeout设定数后杀掉进程,直到master进程

小结:
static:适合流量相对稳定的场景
dynamic:适合流量浮动大的场景
ondemand:适合流量浮动大的场景,而且流量变化比较规律,否则由于pm.process_idle_timeout设置不准效果适得其反,过大会浪费资源,过小会导致频繁杀死进程

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注