文件描述符为何会耗尽:从内核内存到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

网络连接断开的深度解析:从TCP状态机到多层超时配置

凌晨3点,你被电话叫醒——生产环境的核心服务大面积报错,错误日志里全是Connection reset by peer和ETIMEDOUT。你花了四个小时排查,发现罪魁祸首是一个从未被关注的超时配置:某台负载均衡器的空闲超时从60秒被改成了30秒,而你的数据库连接池配置的是55秒心跳间隔。 ...

14 min · 6755 words

你的SSD为什么比你想象中更脆弱?从闪存物理特性到写入放大的完整技术解析

你买了一块标称TBW(总写入字节数)600TB的SSD,心想这块盘就算每天写100GB,也能用16年。结果不到两年,SMART数据就开始报警,剩余寿命直线下降。你查看写入量统计,发现实际只写了不到50TB——按照官方参数,这连十分之一都不到。 ...

11 min · 5116 words