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

求指点 PHP 内存泄露排查

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

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

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