这是最迷惑人的一类。free -h 显示 available 还有 3G,进程被杀。

原因通常是这几个:

  1. cgroup 限制

容器有自己的内存上限,宿主机 free 看不到。看 /sys/fs/cgroup/memory.max 或者 docker stats。

  1. 内存碎片

长时间运行的程序,物理内存够但没有连续大块。表现出来是申请大内存失败。

  1. 页缓存被算进使用量

buff/cache 会在需要时回收,但如果 cgroup 把页缓存算进限制,就会提前触发 OOM。

  1. swap 关闭

没 swap 的时候,稍微超一点就直接杀,没有缓冲。

排查顺序:先看 cgroup 限制,再看 dmesg 里的 OOM 记录(会写明是哪个 cgroup 超了),最后看进程自己的内存曲线。

dmesg | grep -i 'killed process' 能看到被杀进程的 RSS 和总内存,比猜有用。

主楼