为什么分布式系统没有完美时钟:从Lamport到TrueTime的四十年博弈

1978年,Leslie Lamport在《Time, Clocks, and the Ordering of Events in a Distributed System》论文的开篇写道:“A distributed system can be described as one in which the failure of a computer you didn’t even know existed can render your own computer unusable.” 他当时大概没想到,这篇论文定义的"happened-before"关系,会成为分布式系统此后近五十年的基石。 ...

10 min · 4972 words

时序数据库如何用1.37字节存储一个数据点:从压缩算法到存储引擎的十五年演进

2015年,Facebook的监控团队面临一个看似无解的问题:每秒产生700万个数据点,如果按照传统方式存储,仅内存就需要16TB。这个数字意味着任何规模的集群都无法在经济上承受。但他们最终找到了答案——通过一种称为Gorilla的压缩算法,将每个数据点从16字节压缩到平均1.37字节,压缩比达到12倍。 ...

11 min · 5296 words

幂等性设计:为何一个请求被重复执行会产生数据灾难

2017年2月,一位开发者在Stripe官方博客下留言:他刚刚经历了一次"幽灵扣款"——用户点击支付按钮后页面超时,刷新重试,结果被扣了两次款。这不是技术故障,而是系统设计缺陷。在网络不可靠的世界里,重试是常态;如果没有幂等性设计,每一次重试都可能成为数据灾难的开始。 ...

9 min · 4020 words

NUMA架构下为什么你的多线程程序可能比单线程还慢

在一台双路服务器上,某个开发者写了一个简单的多线程程序来处理内存数据。原本以为增加线程数能线性提升性能,结果却发现:当线程数从1增加到16时,吞吐量不升反降,甚至比单线程还慢了40%。 ...

10 min · 4757 words

进程调度:为什么Linux放弃了O(1)的完美时间复杂度

2001年,Linus Torvalds在Linux内核邮件列表中写下了这样一句话:“你要意识到,很少有东西能像调度器那样经受住时间的考验。这恰好证明了调度是简单的。” ...

11 min · 5063 words

内存泄漏:为什么即使有垃圾回收,你的程序仍在悄悄泄漏内存

title: “内存泄漏:为什么即使有垃圾回收,你的程序仍在悄悄泄漏内存” date: “2026-03-05T16:36:29+08:00” description: “从2012年AWS宕机事件到Chrome DevTools堆快照分析,深入剖析内存泄漏的本质——不是技术缺陷,而是资源管理的系统性失误。本文涵盖手动内存管理语言(C/C++)与垃圾回收语言(Java、Go、JavaScript)的不同泄漏模式,对比Valgrind与AddressSanitizer的检测策略,揭示RAII、智能指针、弱引用等防御机制的设计哲学。” draft: false categories: [“系统架构”, “编程语言”, “技术原理”] tags: [“内存泄漏”, “垃圾回收”, “内存管理”, “RAII”, “Valgrind”, “AddressSanitizer”, “智能指针”, “性能优化”] 2012年10月22日,Amazon Web Services遭遇了一次看似普通的故障。一台数据收集服务器被更换后,DNS地址没有正确传播,导致部分服务器持续尝试连接这台已下线的机器。这个持续的重试行为触发了内存泄漏。更致命的是,负责监控内存的内部警报系统同时失效——所有仪表盘显示绿色,而系统正在走向崩溃。 ...

12 min · 5648 words

TCP 三次握手与四次挥手:从 SYN 到 FIN 的状态机演进

1981 年 9 月,Jon Postel 发布了 RFC 793,定义了传输控制协议(TCP)的核心规范。这份文档中有一张著名的 TCP 状态转换图,包含 11 个状态和错综复杂的箭头指向。四十多年后的今天,这张图依然是网络工程师面试的必考题,也是无数系统故障排查的起点。 ...

8 min · 4003 words