记一次php服务调优

yuyu888 于 2020-12-23 发布

背景

刚入职时,就发现我们的某一台服务器内存非常高,而且在不断的增长, 另一台服务器很正常

问题服务器

故障原因

经过排查发现 php-fpm 设置项为:pm=static,未开启pm.max_requests配置;导致php进程长期存活,由于存在内存泄漏问题,垃圾内存无法释放,内存消耗持续升高!

另一台正常的机器配置为:

pm=static
pm.max_requests=5000

参考阅读:php-fpm 三种运行方式:static,dynamic,ondemand

解决方案

修改php-fpm设置项:pm = dynamic

设置:

pm.max_children = 500

pm.start.servers = 100

pm.min_spare_servers = 20

pm.max_spare_servers = 100

pm.max_requests=2000

另外新增配置:

pm.status_path=pmstatus

并且新增nginx配置

location = /pmstatus {

    include fastcgi_params;

    fastcgi_pass 127.0.0.1:9000;

   fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

}

访问:http://192.144.176.65/pmstatus 可以查看phpfpm状态

pool:                 www
process manager:      dynamic
start time:           15/Jul/2020:11:15:09 +0800
start since:          13937213
accepted conn:        77203116
listen queue:         0
max listen queue:     129
listen queue len:     128
idle processes:       99
active processes:     1
total processes:      100
max active processes: 500
max children reached: 3
slow requests:        0

参数说明:

pool – fpm池子名称,大多数为www
process manager – 进程管理方式,值:static, dynamic or ondemand. dynamic
start time – 启动日期,如果reload了php-fpm,时间会更新
start since – 运行时长
accepted conn – 当前池子接受的请求数
listen queue – 请求等待队列,如果这个值不为0,那么要增加FPM的进程数量
max listen queue – 请求等待队列最高的数量
listen queue len – socket等待队列长度
idle processes – 空闲进程数量
active processes – 活跃进程数量
total processes – 总进程数量
max active processes – 最大的活跃进程数量(FPM启动开始算)
max children reached - 进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。
slow requests – 启用了php-fpm slow-log,缓慢请求的数量

经过系统升级以及参数调整后,机器内存使用显著降低,经过一段时间运行后,内存又升起来了,高达8.5G, 开始怀疑人生了

free -g 统计实际并不大

free -g

经过ops同事排查,是exporter版本的问题导致了监控图表不准确,已经修复, 实际内存使用情况如下,符合预期

监控

机器内存变化如图所示,说明我们的调整是正确的, 实际效果符合预期

监控

结语

两台服务器的pm配置,一个使用static策略, 一个使用dynamic;经过对比发现使用dynamic实际内存消耗要小一些,cpu变化也不大,但是cache占用要多一些