Linux的Out Of Memory(OOM)机制是当系统内存严重不足时,内核选择性地终止某些进程以释放内存资源的保护机制。当系统无法通过常规途径(如页面回收)获得足够内存时,OOM killer会被触发。
OOM killer会在以下情况下被触发: - 系统物理内存耗尽 - 交换空间(swap)也已用尽 - 内核无法通过页面回收(page cache回收、slab回收等)释放足够内存 - 有进程尝试分配更多内存但无法满足
内核通过计算每个进程的"badness"分数来决定终止哪个进程:
badness_score = (memory_usage_in_pages ^ 2) / (cpu_time_used ^ 0.5)
考虑因素包括: - 进程使用的内存量 - 进程运行时间 - 进程优先级(nice值) - 进程角色(例如内核线程通常不会被选中) - 是否为特权进程 - 是否直接导致OOM
较新内核版本使用更复杂的策略: - 首先尝试终止消耗内存最多的进程 - 考虑进程的oom_score_adj值(用户可配置) - 避免终止关键系统进程 - 倾向于终止重复触发OOM的进程
控制内存过量使用策略: - 0(默认):启发式过量使用,允许合理过量 - 1:总是过量使用,不拒绝任何malloc() - 2:禁止过量使用,严格限制分配
控制OOM时的行为: - 0(默认):调用OOM killer - 1:系统panic - 2:强制系统panic
调整特定进程的OOM优先级(-1000到1000): - -1000:从不杀死该进程 - 0:默认值 - 正数:增加被杀死的可能性
dmesg | grep -i "out of memory"
grep -i "killed process" /var/log/messages
cat /proc/[pid]/oom_score
cat /proc/[pid]/oom_score_adj
vmstat 1
free -h
top/htop
现代Linux系统使用cgroups来更精细控制内存分配和OOM行为:
# 设置cgroup内存限制
echo 100M > /sys/fs/cgroup/memory/group1/memory.limit_in_bytes
# 设置OOM控制
echo 1 > /sys/fs/cgroup/memory/group1/memory.oom_control
Linux OOM机制是系统内存管理的最后防线,理解其工作原理有助于更好地管理系统内存资源,预防和处理内存不足的情况。通过合理配置和监控,可以最小化OOM对系统稳定性的影响。