Go 服务常驻内存 4G,pprof 里 inuse_space 只有 300M,监控按 RSS 报警已经持续一周,重启才能压下去。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,释放的对象还留在堆上等回收,运行时也不急着把页还给系统,RSS 包含这部分未归还的内存,和活跃堆不是一个口径,拿 heap 数字去解释 RSS 永远对不上。
「Go 内存未归还」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
GODEBUG=gctrace=1 ./app go tool pprof http://localhost:6060/debug/pprof/heap GOMEMLIMIT=3GiB ./app
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
具体做法是,同时看 inuse 和 released 两个指标;调整回收目标或主动归还内存;告警阈值改成按活跃堆计算。
最后用这个标准收尾,RSS 回落到 1G 以内,活跃堆和告警阈值能对上。
