求指点 PHP 内存泄露排查 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
well775397252
V2EX    PHP

求指点 PHP 内存泄露排查

  •  
  •   well775397252 2024-01-18 10:59:17 +08:00 3618 次点击
    这是一个创建于 711 天前的主题,其中的信息可能已经有所发展或是发生改变。
    线上 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
    xaxb
        29
    xaxb  
       2024-01-19 20:25:09 +08:00 via iPhone
    Php 被发明时就有内存泄漏,7 以后已经好很多了。需要 max request 参数定期杀进程,不然多大的内存都能慢慢吃完
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5382 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 37ms UTC 07:58 PVG 15:58 LAX 23:58 JFK 02:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86