首页/系统/Linux 内核与性能调优速查/内存分配失败的分层排查
内存与 OOM58 条

内存分配失败的分层排查

ENOMEM/EAGAIN 报错按层排查:进程地址空间限制(ulimit -v)→ cgroup 限额 → overcommit 模式 → max_map_count → 碎片/大页。

分配失败分层排查

应用报 ENOMEM 或 EAGAIN 并不代表物理内存真的耗尽,要按层核对:进程地址空间限制(ulimit -v 与 /proc/<pid>/limits)→ cgroup 限额(memory.max、pids.max)→ overcommit 模式与 CommitLimit → 映射数量与碎片(vm.max_map_count、大页)。每一层都会以「分配失败」的形式暴露,从最外层的进程限制逐层向内核对,比直接怀疑应用代码更快定位。

基本信息

进程限额层ulimit -v、/proc/<pid>/limits 的地址空间项
cgroup 限额层memory.max、pids.max
overcommit 层vm.overcommit_memory 与 CommitLimit
映射数量层vm.max_map_count
碎片与大页层buddyinfo、大页配额

典型使用场景

  • Java、内存数据库等大内存应用启动失败
  • 容器内报内存不足但宿主看起来空闲
  • 日志报 ENOMEM 而 free 显示可用内存充足
  • mmap 失败且应用日志没有明确线索
  • 排查地址空间限制与映射数量限制的影响

分层排查命令

分层排查命令
ulimit -v; grep -iE 'address space' /proc/<pid>/limits
grep -E 'CommitLimit|Committed_AS|MemAvailable' /proc/meminfo
sysctl vm.overcommit_memory vm.max_map_count
cat /sys/fs/cgroup/<组>/memory.max 2>/dev/null
wc -l < /proc/<pid>/maps            # 映射段数量,与 max_map_count 对比
pmap -x <pid> | tail -3             # 映射总量概览
cat /proc/buddyinfo                 # 高阶空闲块,判断碎片情况

各层与典型现象

层次检查项典型现象
进程限额ulimit -v 与 limits 地址空间ENOMEM 但系统内存充足
cgroup 限额memory.max、pids.max容器内 OOM 或创建进程失败
overcommitovercommit_memory=2 与 CommitLimit大额分配被直接拒绝
映射数量vm.max_map_countmmap 失败,常见于大量映射的程序
碎片与大页buddyinfo 与大页配额高阶连续分配失败
报错点在应用层,根因却常在限额层;先纵向核对各层阈值,再去改应用代码,能省下大量无效排查。
部分应用(如某些内存数据库)官方文档建议放宽 overcommit 策略,这属于全局变更,变更前应阅读其部署要求并评估对整机的影响。

快速判断技巧

  • MemFree 与 MemAvailable 都充足却报错,问题多半在限额层或映射数量层
  • 容器内先读 cgroup 的 memory.max 与 memory.events,再去看宿主内存
  • 报 ENOMEM 且进程映射段数量很大时,优先核对 vm.max_map_count

容易被忽略的两项

  • 线程栈与映射总量:线程数量多会同时消耗地址空间与映射配额,两个上层限制都容易被撞到
  • 大页配额:应用要求使用大页但预留不足时,报错现象也是内存不足,需要单独核对大页相关配置

易错点

  • 只盯应用代码:把限额层的失败当成内存泄漏去查,方向完全跑偏
  • 忽略 max_map_count:映射数量上限常被内存数据库与大页应用撞到
  • 在容器里只看宿主内存:cgroup 限额先于宿主可用内存生效
  • 盲目放开 overcommit:严格模式的设计目的是让失败发生在分配阶段,放开会改变失败位置
  • 忘记多层限制可叠加:ulimit 与 cgroup 都核对才算完整

数据来源与参考

  • Linux 内核 Documentation/mm/overcommit-accounting.rst
  • man-pages mmap(2)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌