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

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

6 min · 2857 words

TCP Keepalive 为什么救不了你的长连接

一个运行良好的 WebSocket 服务,突然在凌晨三点开始大面积掉线。日志里只有 “connection reset” 的报错,没有任何其他线索。你检查了服务器状态——CPU 正常,内存充足,网络畅通。重启服务后一切恢复,但第二天凌晨同一时间,问题再次出现。 ...

9 min · 4061 words

虚假唤醒:为什么条件变量会"无缘无故"地返回

1974年10月,C.A.R. Hoare在《Communications of the ACM》上发表了一篇题为"Monitors: An Operating System Structuring Concept"的论文。这篇论文奠定了并发编程中monitor和条件变量的理论基础。六年后的1980年2月,Xerox PARC的Butler Lampson和David Redell发表了另一篇关键论文"Experience with Processes and Monitors in Mesa",他们在实践中发现了一个令人不安的现象:被唤醒的线程有时会发现条件并未满足。 ...

9 min · 4410 words

B+树与LSM-tree:为什么数据库存储引擎没有万能方案

1970年7月,波音研究实验室的 Rudolf Bayer 和 Edward McCreight 首次流传了一篇题为"Organization and Maintenance of Large Ordered Indices"的论文,两年后正式发表在 Acta Informatica 期刊。他们发明的 B-tree 在此后五十年里统治了数据库存储引擎的设计。 ...

9 min · 4508 words

分支预测:从CPU性能神器到被黑客武器化的二十年

2018年1月3日,安全研究员Jann Horn在Google Project Zero的博客上发布了一篇技术报告。报告描述了一种攻击方式,可以读取任意进程的内存内容,包括密码、加密密钥和隐私数据。这台机器没有运行任何恶意软件,操作系统内核没有漏洞,应用程序也没有被入侵。 ...

15 min · 7137 words

TLS握手为何需要两轮往返:从协议设计到性能优化的十年演进

2014年,IETF TLS工作组收到了一份来自Eric Rescorla的提案。这份题为《draft-rescorla-tls13-new-flows》的文档开宗明义地提出了TLS 1.3的两大设计目标:减少往返次数、移除不安全特性。四年后,RFC 8446正式发布,TLS 1.3将握手延迟从2-RTT压缩到1-RTT,会话恢复场景更是达到了0-RTT。 ...

7 min · 3463 words

内存对齐:为什么你的结构体可能比预期大三倍

一个看似简单的面试题:在64位系统上,下面的结构体占多少字节? struct Example { char a; // 1字节 int b; // 4字节 char c; // 1字节 double d; // 8字节 }; 把所有成员的大小加起来:1 + 4 + 1 + 8 = 14字节。但实际答案是24字节——比预期多了71%。 ...

10 min · 4802 words