问题
最近博客服务器经常内存偏高,甚至内存占满,导致长时间持续报警,先查看下监控数据
最简单粗暴也是马上见效的方法是重启服务,干脆重启服务器,这个对于某些临时进程导致的内存虚高可能有效,这里显然是不行,不要问我怎么知道的。。。因为已经试过一次了,囧!趁着周末下午抽点时间解决下这个问题。
解决
查看服务器内存及进程状况
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_servers
和pm.max_spare_servers
之间,超过pm.max_requests
请求数重新生成子进程
ondemand:按需模式,相关参数:闲置进程持续pm.process_idle_timeout
设定数后杀掉进程,直到master进程
总结:
static:适合流量相对稳定的场景
dynamic:适合流量浮动大的场景
ondemand:适合流量浮动大的场景,而且流量变化比较规律,否则由于pm.process_idle_timeout
设置不准效果适得其反,过大会浪费资源,过小会导致频繁杀死进程