步骤 6 / 6
超卖的代价:OOM killer
因为是按需分配,Linux 敢“超卖”内存;真不够时只能杀进程。
既然大部分申请的内存用不到,Linux 默认允许大家申请的总量超过实际内存,这叫超额承诺(overcommit)。 万一大家真的都来用,缺页时找不到空闲内存,内核就启动 OOM killer,挑一个占用大的进程杀掉。 所以服务“莫名其妙被杀”,常常要去 dmesg 里找 OOM 记录。
操作系统
Linux 不会提前把内存给足,等程序真正用到时再补上,内存紧张时还可能“超卖”。
以程序 malloc 一大块内存、之后第一次写入为例。
步骤 6 / 6
因为是按需分配,Linux 敢“超卖”内存;真不够时只能杀进程。
既然大部分申请的内存用不到,Linux 默认允许大家申请的总量超过实际内存,这叫超额承诺(overcommit)。 万一大家真的都来用,缺页时找不到空闲内存,内核就启动 OOM killer,挑一个占用大的进程杀掉。 所以服务“莫名其妙被杀”,常常要去 dmesg 里找 OOM 记录。
| 当前状态 | 发生了什么 |
|---|---|
| 用户态 | 内核只记账,不分配真实内存 |
| 进入内核态 | 访问未映射的页,陷入内核 |
| 内核态 | 确认地址合法,只是尚未分配 |
| 内核态 → 用户态 | 新页映射进页表,重试成功 |
| 缺页 | 写时复制或文件页读入 |
| 内核态 | OOM killer 选中并终止进程 |