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 是怎么发生的
- 应用申请内存,内核发现物理内存 + swap 都不够
- 触发
oom_kill,按badness评分选牺牲者 - 默认挑占用最大、运行最久的进程下手
# 看 OOM 历史
dmesg -T | grep -i "out of memory"
journalctl -k | grep -i oom
三条实用建议
- 生产机适当留 swap(1–2GB),给内核回收的余地
- 关键进程设置
oom_score_adj = -500降低被杀概率 - 告警看
available低于 10%,而不是 free
内存用满不是问题,available 逼近 0 才是。