温馨提示×

为什么dmesg显示内存不足

小樊
41
2026-10-21 00:47:02
栏目: 编程语言

dmesg 里出现“内存不足(Out of memory / OOM)”相关提示,通常说明 Linux 内核在某一时刻无法为进程分配所需内存,于是触发了 OOM 机制。下面从原因、常见表现和排查思路三个方面说明。


一、为什么会显示内存不足

1. 物理内存 + Swap 都被用光

Linux 内存包括:

  • 物理内存(RAM)
  • Swap 空间(磁盘模拟内存)

当两者都耗尽,内核无法分配新内存,就会:

  • 打印 Out of memory
  • 杀掉占用内存最多的进程(OOM Killer)

典型日志:

Out of memory: Kill process 1234 (java) score 800 or sacrifice child

2. 内存被“看起来不多但已占满”

即使 free 显示还有内存,也可能不够,因为:

  • 内核缓存(cache/buffer)不能直接释放
  • 某些内存被锁定(mlock)
  • 连续大块内存申请失败(碎片问题)

3. 进程内存泄漏

某个程序持续申请内存不释放,例如:

  • Java / Python / C++ 服务
  • 容器(Docker)未限制内存

最终拖垮整个系统。


4. 内存被限制(cgroup / 容器)

在:

  • Docker
  • Kubernetes
  • systemd 服务

中如果设置了内存上限,超出后:

  • 容器被杀
  • dmesg 显示 OOM

5. 内核参数或配置问题

例如:

  • vm.overcommit_memory=2 且内存紧张
  • Swap 未开启或太小
  • nr_hugepages 占用过多

二、dmesg 中常见的内存不足信息

信息 含义
Out of memory 内存彻底不够
oom-kill OOM Killer 已杀进程
page allocation failure 内存分配失败(可能是碎片)
GFP flags 申请内存的类型

三、如何排查和解决

1. 查看当前内存状态

free -h
top
htop

2. 看是谁被 OOM 杀掉

dmesg | grep -i oom
dmesg | grep -i "killed process"

3. 检查 Swap

swapon --show

如果没有或太小,可考虑增加。

4. 检查进程内存使用

ps aux --sort=-%mem

5. 容器 / 服务限制

  • Docker:docker stats
  • K8s:kubectl describe pod
  • systemd:
systemctl show <service> | grep Memory

6. 长期解决方案

  • 修复内存泄漏
  • 增加物理内存 / Swap
  • 限制进程内存(cgroup)
  • 调整内核参数(谨慎)

四、一句话总结

dmesg 显示内存不足,说明 系统或某个限制域内内存已被耗尽,内核被迫杀进程以保护系统。

如果你愿意,可以把 dmesg 相关日志贴出来,我可以帮你具体分析是哪类问题。

0 踩