这是最迷惑人的一类。free -h 显示 available 还有 3G,进程被杀。
原因通常是这几个:
- cgroup 限制
容器有自己的内存上限,宿主机 free 看不到。看 /sys/fs/cgroup/memory.max 或者 docker stats。
- 内存碎片
长时间运行的程序,物理内存够但没有连续大块。表现出来是申请大内存失败。
- 页缓存被算进使用量
buff/cache 会在需要时回收,但如果 cgroup 把页缓存算进限制,就会提前触发 OOM。
- swap 关闭
没 swap 的时候,稍微超一点就直接杀,没有缓冲。
排查顺序:先看 cgroup 限制,再看 dmesg 里的 OOM 记录(会写明是哪个 cgroup 超了),最后看进程自己的内存曲线。
dmesg | grep -i 'killed process' 能看到被杀进程的 RSS 和总内存,比猜有用。
主楼- 暂无回复
继续逛逛