Linux 内存泄漏与 OOM:从现象定位到进程证据

区分页缓存、进程泄漏和 cgroup 限额,使用系统与进程级指标定位 OOM 的真实触发原因。

文章目录 · 4 节

内存使用率高不一定是泄漏。Linux 会主动使用空闲内存作为页缓存,判断容量时应关注 MemAvailable,而不是只看 free

先确认 OOM 来源

free -h
grep -E 'MemAvailable|Cached|Slab' /proc/meminfo
journalctl -k --since '-2h' | grep -iE 'oom|killed process'

内核日志会给出被杀进程、内存占用和 OOM 域。容器被杀但节点没有 OOM 日志时,应检查 Pod 的 memory.limitlastState.terminated.reason

找到持续增长的对象

ps -eo pid,comm,rss,vsz --sort=-rss | head
pidstat -r -p ALL 5
cat /proc/<PID>/smaps_rollup

连续采样 RSS,区分稳定高占用和持续增长。匿名内存持续增加通常指向堆泄漏;Slab 增长则可能是内核对象或文件系统缓存问题。

不要急着清缓存

drop_caches 只会暂时释放可回收缓存,不能修复泄漏,还可能造成新的 I/O 峰值。生产环境首先要保留证据,再决定重启、限流或扩容。

处理顺序

  1. 保存 OOM 日志、进程映射和应用堆快照。
  2. 临时限制并发或扩大安全余量。
  3. 对照发布和流量变化确认增长起点。
  4. 在压测环境复现,并验证修复后的内存曲线。