V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
well775397252
V2EX  ›  PHP

求指点 PHP 内存泄露排查

  •  
  •   well775397252 · 342 天前 · 2829 次点击
    这是一个创建于 342 天前的主题,其中的信息可能已经有所发展或是发生改变。
    线上 php-fpm 内存占用越来越高,运行 1 个月都占用 1 个多 G 的内存了,使用的是 php8.1+yii2 框架,看起来应该是有内存泄漏存在,想请教一下这种怎么排查?
    brader
        1
    brader  
       342 天前
    一个月才膨胀到 1G 内存,可以不用理。看下开启一下多少个请求就重启的配置应该就行了
    996635
        2
    996635  
       342 天前
    FPM 直接设置 max_requests 低一些, 会自动销毁并新建。
    phpfpm
        3
    phpfpm  
       342 天前
    你们一个月不上线?
    ZeekChatCom
        4
    ZeekChatCom  
       342 天前
    @phpfpm 上线也不一定要重启啊
    well775397252
        5
    well775397252  
    OP
       342 天前
    @996635 感觉没解决根本问题,想排查一下原因
    well775397252
        6
    well775397252  
    OP
       342 天前
    @brader 每个 worker 大到 200m ,按道理几十 M 才正常吧
    ben1024
        7
    ben1024  
       342 天前
    . 排查:
    如果知道是哪个业务线, 就用 Xdebug 逐步看执行内存情况, 主要在于静态或内存变量相互依赖
    如果不知道用 Tideways 试试
    . 直接点 max_requests 设置小一些, 精神压力小很多
    markgor
        8
    markgor  
       342 天前
    如果没使用到 fastcgi_finish_request 理论上不会有代码级别的内存泄漏问题。
    至于 php-fpm ,我记得申请后的内存就算使用完,也不会放出给系统,避免下次使用重新申请,
    另外还有第三方扩展等的原因
    brader
        9
    brader  
       342 天前
    @well775397252 这个不一定,看业务的,二三十 M 比较常见,几百 M 可能是有些接口有大数组,或者像 excel 导入导出之类的业务
    ucando
        10
    ucando  
       342 天前
    其实我更想知道要怎么操作才会内存泄漏?
    well775397252
        11
    well775397252  
    OP
       342 天前
    @ucando
    @phpfpm 对啊,几个月才更新一次
    well775397252
        12
    well775397252  
    OP
       342 天前
    @ben1024 哎,都试试吧,先压测一下瞧瞧
    QlanQ
        13
    QlanQ  
       342 天前
    不认为你这存在内存泄露,如果是有问题,1 个月才到 1G ?流量多一点,分分钟都能爆了吧
    Logtous
        14
    Logtous  
       342 天前
    xhprof 分析看看
    woshicixide
        15
    woshicixide  
       342 天前
    你这问题有点问的有点不清不楚,这 1 个多 G 是单个 worker 还是全部加起来,另外 fpm 大概率不会有这种问题,可以看看你装的扩展有没有可能
    encro
        16
    encro  
       342 天前
    yii2 的 10 年老用户了。。。

    修改 fpm 配置,跑完 1000 个请求就销毁,永远不会有问题的。。。

    你首先得找到是那个进程的问题。内存持续增加,那么是命令行程序?
    encro
        17
    encro  
       342 天前
    @well775397252
    每个 work200m ,可能是因为你 php 装了一些没用的扩展。开启了没必要的缓存。
    encro
        18
    encro  
       342 天前
    很可能是你开启了 xdebug
    well775397252
        19
    well775397252  
    OP
       342 天前
    @encro #16 php-fpm,现在没开启自动重启进程那个配置
    well775397252
        20
    well775397252  
    OP
       342 天前
    @woshicixide 全部加起来,平均每个进程 200 多 M
    encro
        21
    encro  
       342 天前
    php 开启了 xdebug ,结巴词库,ip 地址库之类,为了提高性能,有些程序会将字典之类的加载的内存,很正常。
    zhangqilin
        22
    zhangqilin  
       342 天前   ❤️ 1
    内存满了不一定不会回收,你放到一台内存小点的机器上或者 pod 上,
    比如 1 个月 1g ,你放到 500m 的上,然后压测看会不会 OOM
    说不定内存占用过多了就会回收了
    coderzhangsan
        23
    coderzhangsan  
       342 天前
    @well775397252 #20 平均每个进程 200 多 M ,fpm 配置里 pm.max_requests 设置的多少,如果设置的比较大,那有可能会增长到这个两级,把这个值适当降低就可以了;正常来讲 fpm 进程很难会内存溢出,除非一些占用内存的比较大的场景才会,例如大数据的导入和导出,又或者开启了 debug 等扩展,静态内存占用较大。
    hahamy
        24
    hahamy  
       341 天前
    每个 fpm 进程 200 多兆,200 多兆看的是哪个值? top 命令的内存有几个指标
    Rorysky
        25
    Rorysky  
       341 天前
    不是什么关键业务就定时重启,有时间关注现实生活
    NjcyNzMzNDQ3
        26
    NjcyNzMzNDQ3  
       341 天前
    xhprof +1 , 这个工具用堆栈排查每个方法占用内存大小、耗时、cpu 用量,我之前有 curl_util 忘记 close 就用的他
    yc8332
        27
    yc8332  
       341 天前
    要看你怎么重启 fpm 的,一直开着的话,如果你的请求中有需要大内存的,很正常。
    lairdnote
        28
    lairdnote  
       341 天前
    xhprof. 或者跟踪进程 xstrace
    alex8
        29
    alex8  
       341 天前 via iPhone
    Php 被发明时就有内存泄漏,7 以后已经好很多了。需要 max request 参数定期杀进程,不然多大的内存都能慢慢吃完
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3067 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:52 · PVG 20:52 · LAX 04:52 · JFK 07:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.