golang 项目,每隔几个月就 oom 一次,来不及打印内存占用,谁有好的排查方法啊? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ng001
V2EX    程序员

golang 项目,每隔几个月就 oom 一次,来不及打印内存占用,谁有好的排查方法啊?

  •  
  •   ng001 2023-05-15 14:52:07 +08:00 3192 次点击
    这是一个创建于 887 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 1.项目比较大,数万行代码,平稳运行几个月才突发一次 oom
    • 2.从内存监控看,从 300M 到内存上限( 12G )仅用时 3s
    • 3.起协程每秒监控内存,大内存时自动保存 pprof 内存占用,但发现在事发时来不及打印就 oom 了
    第 1 条附言    2023-11-24 17:53:01 +08:00

    好像有了结论,在这里记录下,希望能帮到人

    原因

    代码在多协程下命中了竞态条件 (Race Conditions),在fasthttp.Clone(header)时,数组存在并发的读写,导致Clone时读到了一个超大值,申请了超大空间,瞬间OOM。

    效果

    消除竞态条件后已稳定运行1+月,期望别打脸

    12 条回复    2023-05-15 22:48:08 +08:00
    mxT52CRuqR6o5
        1
    mxT52CRuqR6o5  
       2023-05-15 14:55:01 +08:00
    golang 没有那种程序崩溃时自动把内存 dump 到硬盘的工具吗?
    void00000
        2
    void00000  
       2023-05-15 15:01:05 +08:00
    定时用 pprof dump ,硬盘上只保存最近 10 次 dump 记录,如果 oom ,就分析最近 10 次使用 pprof dump 的记录
    opengg
        3
    opengg  
       2023-05-15 15:19:16 +08:00 via Android
    某个请求触发了大量申请内存吧?
    拿真实流量,按二分法压一下,确定大概的范围。
    aw2350
        4
    aw2350  
       2023-05-15 15:23:13 +08:00
    最好罗列一下系统内使用了哪些第三方包,有可能是第三方包有 bug,导致堆栈溢出
    lysS
        5
    lysS  
       2023-05-15 15:23:52 +08:00
    oom 不也有日志吗?
    676529483
        6
    676529483  
       2023-05-15 15:44:53 +08:00
    网关看看请求日志
    应用日志里面找找
    oom 本来就很难排查,我们以前 oom 开会从头到尾 review ,找出来的也不对,最后没办法线上 debug ,终于找到第三方包引用 c 库导致的
    tiedan
        7
    tiedan  
       2023-05-15 15:56:47 +08:00
    排查一下 cgo
    aw2350
        8
    aw2350  
       2023-05-15 16:03:11 +08:00
    排查一下系统有无加载数据到内存的操作,诸如导出数据,预加载、内存缓存等。一下子干到 12G 用时 3s,这么大的加载量看起来只能像是那种静态数据压到内存里去了
    lecher
        9
    lecher  
       2023-05-15 17:34:31 +08:00
    启用 vm.overcommit_memory=1 ,系统将会在 OOM kill 时保留一份 core dump
    触发后去查对应目录中拿当时的 core dump 文件 *.core 。跑 gdb 分析
    hefish
        10
    hefish  
       2023-05-15 18:10:08 +08:00
    几个月一次,一年也有四五次。。。我觉着。。不是那种天问一号,神州系列的任务。。。就凑合着过吧。。哈哈
    sadfQED2
        11
    sadfQED2  
       2023-05-15 19:18:26 +08:00 via Android   3
    @hefish 哈哈哈,我们线上就是。刚开始发现问题,大家连夜排查,查了几天都查不出来,然后分给一个人单独排查。后来几个月了,也找不到原因,大家一合计,反正线上有自动重启,挂一台机器问题也不大,于是屏蔽报警就当解决了
    brookegas
        12
    brookegas  
       2023-05-15 22:48:08 +08:00
    1 、找一台内存 1G 的测试机压力测试一下,这样就不需要等几个月才 OOM
    2 、将虚拟内存加到 100G ,这样 OOM 的时候有足够的反应时间来打印
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2608 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:52 PVG 20:52 LAX 05:52 JFK 08:52
    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