• 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文件
     
    解决方法,就这么简单
     
    效果还是很好的,回复到正常值了
     
  • 相关阅读:
    I00038 自守数(Automorphic number)
    I00036 盈数(Abundant number)
    I00036 盈数(Abundant number)
    I00037 亏数(Deficient number)
    I00037 亏数(Deficient number)
    I00035 完美数(Perfect number)
    I00035 完美数(Perfect number)
    I00034 累加与累乘
    I00034 累加与累乘
    codeforces589J 简单dfs,队列
  • 原文地址:https://www.cnblogs.com/funsion/p/11301847.html
Copyright © 2020-2023  润新知