温馨提示×

为什么dmesg出现oom信息

小樊
34
2026-10-18 04:48:57
栏目: 编程语言

dmesg 里出现 OOM(Out Of Memory) 信息,说明 Linux 内核在某一时刻发现可用内存耗尽,被迫触发 OOM Killer 杀掉某些进程,以保住系统不彻底崩溃。

下面分几块说明:为什么会出现、常见原因、怎么看、怎么处理。


一、OOM 是什么

OOM = Out Of Memory

当系统:

  • 物理内存 + Swap 都不够用
  • 又无法回收内存(page cache / slab 等都不行)

内核就会:

  1. 打印 OOM 信息到内核日志(dmesg / /var/log/messages)
  2. 选出“最该杀”的进程(OOM Killer)
  3. 杀掉它,释放内存

二、dmesg 中典型的 OOM 信息

示例:

Out of memory: Kill process 12345 (java) score 800 or sacrifice child
Killed process 12345 (java), UID 0, total-vm: 8192000kB, anon-rss: 6000000kB

关键信息:

  • Out of memory
  • Kill process
  • score(OOM 评分,越高越容易被杀)
  • total-vm / anon-rss(进程占用内存)

三、常见原因(重点)

1️⃣ 进程真的吃太多内存

  • Java / Python / 数据库 / 容器
  • 内存泄漏
  • 配置过大(如 JVM -Xmx 设太大)

2️⃣ 系统内存本身就小

  • 云服务器 1G / 2G
  • 同时跑多个服务

3️⃣ Swap 没开或太小

  • 没有 swap
  • swap 用完

4️⃣ 内存被 cache / slab 占满但不可回收

  • 文件系统缓存
  • 内核对象泄漏(较少见)

5️⃣ 容器 / cgroup 限制

  • Docker / k8s 设置了 memory.limit
  • 容器内 OOM,但宿主机 dmesg 也能看到

四、如何确认是谁导致的 OOM

1️⃣ 看 dmesg

dmesg | grep -i "out of memory"
dmesg -T | grep -i oom

2️⃣ 看被谁杀了

dmesg -T | grep -i "killed process"

3️⃣ 看系统内存历史(如果有监控)

  • free -h
  • sar -r
  • top / htop

五、怎么解决(按优先级)

✅ 1. 优化内存使用

  • 降低 JVM / 服务内存配置
  • 修复内存泄漏
  • 限制并发数

✅ 2. 增加内存或 Swap

# 创建 swap
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

✅ 3. 限制“危险进程”

  • systemd 限制内存
  • Docker 设置 --memory

✅ 4. 调整 OOM 行为(不推荐随便改)

# 让某个进程不容易被 OOM
echo -500 > /proc/PID/oom_score_adj

六、一句话总结

dmesg 出现 OOM,说明系统内存真的不够了,内核被迫杀进程保命。

如果你愿意,可以把 dmesg 的 OOM 片段贴出来,我可以帮你具体分析是哪个进程、为什么、怎么改最合适。

0 踩