内存使用率高不一定是泄漏。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.limit 和 lastState.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 峰值。生产环境首先要保留证据,再决定重启、限流或扩容。
处理顺序
- 保存 OOM 日志、进程映射和应用堆快照。
- 临时限制并发或扩大安全余量。
- 对照发布和流量变化确认增长起点。
- 在压测环境复现,并验证修复后的内存曲线。