文件描述符为何会耗尽:从内核内存到OOM Killer的三层陷阱

2024年4月,Amazon EKS的一个GitHub issue报告了一个诡异现象:Elixir应用容器频繁被OOMKilled,但监控显示容器的内存使用量远低于限制。排查发现,真正的元凶是容器被配置了过高的文件描述符限制(1048576),每个文件描述符在内核中都会分配相应的数据结构,累积起来消耗了大量的内核内存,最终触发了OOM Killer。 ...

12 min · 5548 words

OOM Killer 的评判算法为何总是杀错进程?从启发式评分到生产环境的生存指南

凌晨三点,线上告警。你打开监控面板,发现主数据库进程消失了,而那个只占用几兆内存的后台日志收集进程却安然无恙。dmesg 的输出冷酷而简洁: Out of memory: Kill process 18472 (postgres) score 891 or sacrifice child 这不是电影情节,而是无数运维工程师的真实经历。Linux 内核的 OOM Killer 本应是系统安全的最后一道防线,但它那套基于启发式评分的选杀机制,在过去二十多年里"误杀"了无数关键进程。问题来了:这套机制到底是怎么工作的?为什么数据库进程总是第一个被选中?又该如何让关键服务在内存危机中存活下来? ...

6 min · 2857 words