2020-05-13 19:26:28
Web服务器的CPU指标和MEM指标异常,不稳定?可能是PHP-FPM进程重启机制的问题导致的,一同和百度外卖探索下如何优化吧。
通过优化PHP-FPM进程重启机制,改善线上服务器CPU_IDLE和MEM_USED波动的问题,使服务器资源利用率更加平滑可靠。
外卖交易服务集群报出在监控图上CPU_IDLE波动剧烈,如图所示。
事实上一直以来,不仅PU_IDLE存在一定的波动,MEM_USED的周期性断崖式下降再回升也早已司空见惯。那么CPU_IDLE与MEM_UESD的波动是否存在关联,追溯这种现象产生的原因,我们就必须理解PHP-FPM进程管理器的机制。
在PHP5.3.3版本中,PHP-FPM正式被官方收编,作为FastCGI管理器,支持平滑停止启动进程、slow-log、动态进程、运行状态等特性。
PHP-FPM进程管理支持三种方式:static、dynamic、ondemand。我们选用的是static方式,即PHP-FPM生成固定数量的FastCGI进程,这种方式比较简单,避免了频繁开启关闭进程的开销。(在线下虚拟机环境中,进程管理可以配置成ondemand,既降低了内存需求又避免了进程数量不够用)
回到面临的问题上,CPU_IDLE和MEM_USED的周期性波动是如何产生的。首先这是一种所有的集群都存在的现象,然后交易服务集群表现尤为突出。在排查了应用程序(比如日志采集程序、定时脚本)的影响后,思路落在了PHP-FPM的一个关键参数上:max_requests。
max_requests这个参数使FastCGI进程在处理一定数量的请求后自动重启,以此避免第三方扩展内存泄漏产生破坏性影响。打开线上配置,发现外卖交易服务集群中配置该参数过小,为1000,这便造成了在请求高峰期,FastCGI频繁重启,对CPU产生了负担。于是将max_requests参数调整为10000后,CPU_IDLE表现得到了改善,如图。
但是经过观察发现,CPU_IDLE和MEM_USED周期性波动的问题并没有根除,效果如图。
这很好理解,我们调大max_requests参数,但是FastCGI重启机制依然生效,每个请求都会计数,当计数到达max_request之后,cgi进程会执行 fcgi_finish_request退出进程,子进程退出,fpm-master进程会收到SIGCHLD信号,运行fpm_children_bury重启进程,重启的方式是fork一个子进程。
FastCGI进程通过unix socket承接Nginx请求,负载较为均衡,生产环境流量大,PHP进程数配置较大,数以百计的FastCGI会在同一时间到达 max_requests上限而进行重启,这便造成了CPU_IDLE和MEM_USED周期性波动。
max_requests的初衷是为了避免第三方扩展引起的内存泄漏问题,虽然线上环境使用的扩展经过分析和测试,并没有严重的内存泄漏问题,但是由于扩展内部使用的第三方库太多,并无法完全避免内存泄漏问题,同时max_requests机制很适合FastCGI多进程环境,以较小的代价,换取内存泄漏的长治久安。
为了避免CPU_IDLE和MEM_USED周期波动,同时保持max_requests机制,需要在PHP-FPM源码上稍作修改。FastCGI进程在启动时,设置max_requests,此时只要将max_requests配置参数散列开,使FastCGI进程分别配置不同的值,即可达到效果。
具体代码在sapi/fpm/fpm/fpm.c,修改如下:
php_mt_srand(GENERATE_SEED()); *max_requests=fpm_globals.max_requests+php_mt_rand()&8191;
经过修改上线,对比效果见下图
至此CPU_IDLE和MEM_USED已经告别了周期性波动,避免了CPU计算资源产生浪涌效果,内存占用数据也更加真实可靠。
25个Apache性能优化技巧推荐
06-24
php面试笔记(7)-php基础知识-文件及目录处理考点
05-31
CentOS-5 yum安装nginx php53 mysql55 lnmp环境
04-18
Fail2ban防止WordPress受到xmlrpc.php CC攻击
03-17
centos 7安装redis及php-redis扩展
05-09
centos系统安装配置phpMyAdmin数据库管理工具
04-27
使用fpm工具制作nginx的rpm包
06-26
9个常用iptables配置实例
03-29
php环境安全性能检查
03-20
AWK 两个文件字段合并处理实例
06-28
Apache优化:修改最大并发连接数
05-01
IdeaPad Y330系列改装XP后摄像头图像颠倒180度的案例分析
02-18
IdeaPadY470在win7系统下外接HDMI无法输出声音的案例分析
03-16
MBR与GPT分区格式(实例-创建大于2TB的分区)
03-19
MySQL性能调优技巧
04-05
MySQL线程处于Waiting for table flush状态的分析
07-05
Nginx使用教程(四):提高Nginx网络吞吐量之buffers优化
04-05
Redis优化建议
02-12
Redis出现Could not get a resource from the pool错误关于连接数的分析
02-15
Scheme 实现 GNU Guile 3.0.0 发布,性能大幅提升
05-09
365智能优化下载
7.9M
下载Alternate DLL Analyzer(DLL分析器) v1.870 最新版
543KB
下载Develve(数据统计分析软件) v4.5.0.0 绿色版
4.4MB
下载Disk Analyzer Pro(磁盘分析工具) v1.0.1100.1159 官方版
4.2M
下载Kainet LogViewPro(网站日志分析软件) v3.19.4 免费版
5.9M
下载Rank Tracker(网站数据分析工具) v8.32.5 破解版
308.1M
下载UserBenchmark(电脑性能测试软件) v2.9.1.0 官方版
5.3M
下载Win10优化大师下载
5.86MB
下载ashampoo winoptimizer 14(系统优化软件)免费版
26.9M
下载visio2003(分析辅助软件)2003 官方版
51.7M
下载内存优化专家下载
1.4M
下载协议分析工具下载
1.2M
下载印Plus分析诊断系统下载
55.3M
下载完美优化大师(系统优化工具) v31.8 中文版
2.2M
下载希沃班级优化大师下载
118.4M
下载智能内存优化下载
2.6M
下载软媒魔方(系统优化增强软件) v6.2.3.0 绿色版
41.2M
下载金花站长工具(网站优化工具)v8.8.19 绿色版
11.6M
下载php开发工具(php程序开发软件) V7.3.3.0 中文版
22.56 MB
下载AbyssMedia tuneXplorer
2.0M
下载