Linux 内存管理:从 free 到 OOM

先看懂 free 的输出

$ free -h
              total   used   free   shared  buff/cache   available
Mem:           15Gi  3.2Gi  1.1Gi   210Mi        10Gi       11Gi

关键点:available 才是你该看的数,不是 free。

ℹ️
为什么 free 很小

Linux 会把空闲内存拿去做页缓存(buff/cache)加速磁盘读写。这部分内存随时可以被应用回收,所以「free 快满了」不代表内存紧张。

内存的去向

内存分配流 Mermaid

页缓存与 buffer

  • buffer:块设备的元数据缓存(inode、位图)
  • cache:文件内容本身的页缓存

现代内核两者早已统一,buff/cache 合并显示就够了,不用纠结。

OOM 是怎么发生的

  1. 应用申请内存,内核发现物理内存 + swap 都不够
  2. 触发 oom_kill,按 badness 评分选牺牲者
  3. 默认挑占用最大、运行最久的进程下手
# 看 OOM 历史
dmesg -T | grep -i "out of memory"
journalctl -k | grep -i oom

三条实用建议

  1. 生产机适当留 swap(1–2GB),给内核回收的余地
  2. 关键进程设置 oom_score_adj = -500 降低被杀概率
  3. 告警看 available 低于 10%,而不是 free
内存用满不是问题,available 逼近 0 才是。

目录

图表