php-fpm内存泄漏问题排查

生产环境内存泄漏问题排查,以下是排查思路
 
生产环境上有严重的内存溢出问题(红色框所示,正常值应为是 20M 左右)
同时系统有 Core Dump 文件产生
排查过程中还发现一个现象,如果关闭 OPcache ,则 RES值 恢复正常
 

生产环境的 core-php-fpm-7-502-502-29964-1563021407 文件,

从文件名中可知 php-fpm 进程有异常产生,

core文件是二进制格式,需要专门的工具进行分析。

yum -y install gdb 安装分析工具
 

 用工具分析后,得知粗略的报错信息。

Google 搜索了一下,基本上都是这个意思。
那么问题来,生产环境上,app_debug 是关闭的,模板是使用静态缓存的,opcache 也是启用的,为什么还会有这种情况呢?
初步怀疑,有可能是缓存文件失效了,先在测试环境验证下
 
查一下【Server模块】的Runtime目录
 发现Runtime目录下只有一个文件,访问不同页面的时候,这个文件会不断变化。
(也就是说,此模块下缓存文件实际上是无效的)
 
 再查一下【Marketing模块】的Runtime目录(说明缓存文件有效)
 
结合以上两图,说明了三件事:
1、缓存文件有生成
2、缓存文件不断被删除,又不断重新生成
3、一个模块正常,一个模块异常,说明问题应该在 BaseController.class.php 文件中
 

 比对两个模块的 BaseController.class.php 基类文件,发现多出了白色箭头处的代码

 
这段代码,“看起来挺正常”,
断点调试 dump( C('not_first') ) ,
发现每一次执行,得到的结果都是 null
难道是生产环境的配置文件没加载?
 
验证我的猜想 。
 
综合以上排查结果得知,生产环境内存泄漏主要由以下问题导致的:
1、用户每次访问页面,都会导致整个Runtime目录被清空
2、缓存不断的被创建,又不断的被删除
3、Opcache缓存了PHP解析文件,但该文件很快就失效了,下一次读取缓存的解析文件时,文件不存在,
导致了 【Program terminated with signal 7, Bus error. in lex_scan】 文件的产生,系统同时生成大量的 core文件
 
解决方法,就这么简单
 
效果还是很好的,回复到正常值了
 
posted @ 2019-08-05 11:13  Funsion Wu  Views(2082)  Comments(0Edit  收藏  举报