B+树索引的页分裂:从顺序插入的优雅到随机写入的代价

一个简单的测试揭示了令人困惑的现象:同样的硬件、同样的表结构、同样的索引设计,使用UUID作为主键的表插入速度只有自增主键的十分之一。更奇怪的是,存储空间的占用竟然相差接近一倍。 ...

10 min · 4619 words

API响应时间的长尾困境:为什么P99延迟总是比你想象的更糟糕?

一个API报告的中位响应时间是50毫秒,运维团队对此很满意。但用户持续投诉系统"卡顿"。监控面板显示P99延迟达到了2秒——这意味着每100个请求中就有1个需要等待2秒。如果这个系统每秒处理1000个请求,那么每分钟就有600个用户在经历糟糕的体验。 ...

13 min · 6014 words

上下文切换为何如此昂贵?从寄存器保存到TLB失效的完整技术解析

一台拥有32个CPU核心的服务器,为什么在运行200个线程时性能反而不如运行32个线程?数据库连接池从100扩展到300,为什么吞吐量反而下降了40%? ...

11 min · 5248 words

打开一个500MB的文件需要多久:从字符串到Piece Tree的文本编辑器数据结构进化史

2018年之前,Visual Studio Code用户经常报告一个奇怪的问题:打开某些文件会导致内存溢出崩溃。罪魁祸首是一个35 MB的文件——听起来不大,但它有1370万行。VSCode为每一行创建一个对象,每个对象占用40-60字节,结果光是行数组就消耗了约600 MB内存,是原文件大小的近20倍。 ...

14 min · 6527 words

一行正则如何拖垮全球服务:从Cloudflare事故看回溯灾难的技术本质

2019年7月2日,Cloudflare的全球网络在27分钟内完全瘫痪。原因不是黑客攻击,不是硬件故障,而是一行正则表达式:(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\|-|+)+[)];?((?:\s|-|~|!|{}||||+).(?:.=.*)))`。 ...

10 min · 4692 words

为什么一个JSON请求需要两次网络往返?CORS预检机制的设计权衡与优化路径

2019年,某电商平台在大促前夕发现一个诡异的现象:虽然后端API响应时间已经优化到10毫秒以内,但前端用户感知的延迟却高达300毫秒。排查后发现,罪魁祸首不是数据库、不是CDN,而是一个被大多数开发者忽视的HTTP方法——OPTIONS。 ...

9 min · 4134 words

为什么你的动画总是卡顿?从浏览器重排重绘到合成层的完整技术解析

2025年,一位前端开发者在优化个人作品集时遇到了一个诡异的问题:在Chrome和Firefox上运行流畅的圆形遮罩动画,到了Safari却明显卡顿。他尝试了缩小遮罩范围、简化逻辑、限制变量作用域——都没有效果。最后,一个看似毫无意义的transform: translateZ(0)居然让Safari变得丝般顺滑。 ...

9 min · 4237 words