跳转到内容

computer-science / systems

系统剖析

Git、PostgreSQL、Redis、Kubernetes、Linux 容器——真实系统内部到底怎么运作

24

当代

Git 的对象模型:为什么分支是廉价的

Git's Object Model — Why Branches Are Cheap

在一个二十年历史、上百万次提交的仓库里敲 git branch feature-x,回车之后光标立刻就回来了。同一台机器上复制一份工作目录要等几十秒,而 Git 建分支的耗时与仓库大小完全无关。 这不是优化出来的,是数据模型的直接推论。要看懂它,得先看清 .git/objects 里到底躺着什么。

Git · 内容寻址 · 哈希

当代

SQLite:世界上部署最广的数据库

SQLite: The World's Most Widely Deployed Database

你从来没有安装过它,但你身上大概带着几十份它。 手机里的短信、通话记录、相册索引、每一个应用的本地缓存;浏览器的历史记录、Cookie、书签;桌面系统的字体缓存与照片库;汽车的导航数据、机上娱乐系统的片单、医疗设备的日志。这些东西背后往往是同一段 C 代码。SQLite 官方的估计是:全世界处于活跃使用状态的 SQLi…

SQLite · 嵌入式数据库 · 预写日志

当代

PostgreSQL 的 MVCC:读不阻塞写的代价

PostgreSQL MVCC: The Price of Readers Never Blocking Writers

一个再普通不过的场景:财务在跑一份要花八分钟的月度报表,与此同时,几百个用户正在下单、改地址、退款。报表读的是账户表,用户写的也是账户表。 在很多数据库的早期设计里,这两件事只能排队:要么报表把表锁住,写入全部堵在门外;要么写入拿到锁,报表被迫等待或者读到改了一半的数据。

PostgreSQL · 并发控制 · 事务隔离

当代

Redis 的单线程模型:为什么不并行反而更快

Redis's Single-Threaded Model: Why Refusing Parallelism Made It Fast

买一台 32 核的服务器,装上 Redis,打开监控——你会看到 31 个核几乎在闲着。 这不是配置错了。Redis 由 Salvatore Sanfilippo(网名 antirez)在 2009 年发布,名字是 REmote DIctionary Server 的缩写,最初只是为了给他自己的实时分析产品 LLOOG…

Redis · 事件循环 · I/O 多路复用

操作系统 · 虚拟化 · 系统安全

Linux 容器:它不是虚拟机

Linux Containers: Not a Virtual Machine

在一台跑着 Debian 的机器上敲 docker run --rm -it ubuntu:24.04 bash,一秒之内你会拿到一个 Ubuntu 的 shell。cat /etc/os-release 说这是 Ubuntu,apt 能用,/usr/lib 里躺着 Ubuntu 版本的 libc。可是敲一句 unam…

容器 · 命名空间 · cgroups

当代

Kubernetes 的控制器模式:声明式系统怎么收敛

The Kubernetes Controller Pattern: How Declarative Systems Converge

敲下 kubectl apply -f deployment.yaml,命令一秒返回,三个容器过一会儿就跑起来了。直觉会告诉你:这条命令去创建了三个容器。 它没有。它只做了一件事——往一个数据库里写了一行记录,内容大意是"这个集群里应该有三个这样的副本"。写完就结束了。真正把容器起起来的,是一群完全不认识 kubect…

Kubernetes · 调谐循环 · 声明式配置

消息系统 · 分布式日志

Kafka:把消息队列还原成一个日志

Kafka: Reducing the Message Queue to a Log

2011 年,LinkedIn 的 Jay Kreps、Neha Narkhede、Jun Rao 在 NetDB 研讨会上发表了《Kafka: a Distributed Messaging System for Log Processing》。这篇论文里没有新算法,也没有新协议。它真正的主张只有一句:不要把消息系统…

Kafka · 仅追加日志 · 分区

当代

LLVM 的中间表示:编译器生态的枢纽

LLVM IR — The Hub of the Compiler Ecosystem

Rust、Swift、Julia、C++、Fortran 是五门差异极大的语言;x86-64、AArch64、RISC-V、NVIDIA 的 PTX、WebAssembly 是五套差异同样极大的指令集。今天这两侧的绝大多数组合都能编译成功,而世界上并没有二十五个独立的编译器。 中间夹着同一样东西:一种叫 LLVM IR…

编译器 · 中间表示 · 静态单赋值

当代

Nginx 的事件驱动架构:一个进程如何扛住十万连接

Nginx's Event-Driven Architecture: How One Process Holds a Hundred Thousand Connections

2002 年,Igor Sysoev 在俄罗斯门户站点 Rambler 做系统管理。他遇到的不是"服务器慢",而是一个更硬的墙:Apache 的连接数一旦爬到几千,机器就开始换页、卡顿、拒绝服务,而此时 CPU 使用率并不高,磁盘也没跑满。资源明明还在,服务却已经不能用了。 他花了两年写出 nginx,2004 年 1…

Nginx · 事件驱动架构 · I/O 多路复用

网络安全 · 信任基础设施

TLS 与证书生态:陌生人之间如何建立信任

TLS and the Certificate Ecosystem: How Strangers Establish Trust

你在地址栏敲下一个域名,几十毫秒之后,你的浏览器和一台从未见过的机器已经共享了一串只有它们两个知道的字节。中间隔着你家的路由器、运营商的骨干网、若干个数据中心的负载均衡器,任何一环都能读到全部流量,也能篡改全部流量。 这里其实是两个完全不同的问题被塞进了同一次握手。

TLS 握手 · 证书链 · 证书透明度

当代

etcd:把 Raft 变成能用的东西

etcd: Turning Raft Into Something Usable

Raft 论文只有十六页。读完之后你会有种错觉:这东西我能实现。选举、日志复制、安全性约束,每一条都写得清清楚楚,伪代码就在图 2 里。 然后你开始写,很快撞上一堆论文没打算回答的问题。日志要写到哪儿去?写完要不要 fsync?日志涨到几百万条怎么办?往集群里加一台机器的那一瞬间,"多数派"这个词指的是旧的三台还是新的…

etcd · Raft 共识 · 预写日志

当代

Linux 调度器:从 CFS 到 EEVDF

The Linux Scheduler: From CFS to EEVDF

你的笔记本上现在大概跑着一千多个线程,而 CPU 只有八到十六个逻辑核。每过几毫秒,内核就要回答一次同一个问题:下一微秒,这个核给谁? 这个问题看起来像个排序题,其实是个不可能三角。三个目标同时压在同一段代码上:

Linux 内核 · 进程调度 · 公平共享

浏览器架构 · 系统安全

Chromium 的站点隔离:把进程边界当作安全边界

Chromium's Site Isolation: Making the Process Boundary the Security Boundary

在 Chrome 里按 Shift+Esc 打开自带的任务管理器,然后只开一个标签页去看一个普通的新闻网站。你大概率会看到不止一行:主文档一行,广告位的 iframe 一行,社交分享按钮的 iframe 又一行,统计脚本所在的 iframe 再一行。一个标签页,四五个操作系统进程。 这不是浪费。这是 2018 年之后浏…

站点隔离 · 进程模型 · 沙箱

对象存储 · 分布式存储

对象存储:S3 如何改变了存储的形状

Object Storage: How S3 Reshaped What Storage Is

2006 年 3 月 14 日,Amazon 上线了一个只有四个主要动词的存储服务:PUT、GET、DELETE、LIST。定价是每 GB 每月 0.15 美元,外加每 GB 传出 0.20 美元。它没有目录,没有文件句柄,不能定位到文件中间某个字节去改写,也不能把一个名字改成另一个名字。 按 1970 年代以来的存储…

对象存储 · 纠删码 · 一致性模型

当代

xz 后门:一次针对开源信任结构的社会工程

The xz Backdoor — Social Engineering Against the Trust Structure of Open Source

2024 年 3 月下旬,微软的 PostgreSQL 开发者安德烈斯·弗罗因德在自己那台 Debian sid 机器上跑数据库基准测试。他注意到一件不该发生的事:ssh 登录变慢了,而且慢在 CPU 上——即使用户名是错的、连接立刻被拒,sshd 进程也要多烧掉大约半秒的 CPU 时间。同时 Valgrind 在 s…

供应链攻击 · 后门 · 开源维护

当代

构建系统:从 Make 到可复现构建

Build Systems — From Make to Reproducible Builds

一个几乎所有程序员都干过的动作:改了代码,make,跑起来行为没变,怀疑人生半小时,最后敲了 make clean && make,一切正常。 这半小时不是手滑,是构建系统给了一个错误的答案。它告诉你"没有需要更新的东西",而这句话是假的。更值得注意的是行业的应对方式——我们没有去修这条判定规则,而是发明了一个叫 ma…

构建系统 · 增量构建 · 内容寻址

当代

V8 的分层 JIT:动态语言如何跑得快

V8's Tiered JIT: How a Dynamically Typed Language Runs Fast

在 C 里写 p->x,编译出来是一条指令:从 p 指的地址往后数固定的字节数,取值。偏移量是编译期算好的常数,因为结构体的布局写在类型里,类型在编译期就定死了。 换成 JavaScript 的 p.x,语言规范说这是一次字符串键查找:先在对象自身的属性里找 "x",找不到就沿原型链一路往上找,中途可能撞上 gette…

即时编译 · V8 · 隐藏类

当代

Rust 的借用检查器:把内存安全变成编译期问题

Rust's Borrow Checker: Turning Memory Safety into a Compile-Time Problem

C 语言里有一类 bug,它的特征是出错的位置和崩溃的位置没有关系。你在某处 free(p),程序继续跑了两毫秒、经过了三十个函数,某个完全无辜的地方读到一块已经被别人重新分配走的内存,返回一个看似合理的数字。没有信号、没有异常、没有栈回溯指向真凶。等它终于崩溃时,现场早已被清理干净。 这类问题的规模不是学术性的。微软…

内存安全 · 所有权 · 借用检查

网络传输 · 协议演化

QUIC:把传输层搬进用户态

QUIC: Moving the Transport Layer into User Space

一个网页有 80 个资源要下载。HTTP/2 说:不用开 6 条连接了,一条就够,80 个请求在同一条 TCP 连接上并行跑,互不阻塞。 然后网络丢了一个包。一个 1400 字节的 TCP 段,装着第 37 号资源的一小片数据。

队头阻塞 · 用户态传输 · 协议僵化

当代

Envoy 与服务网格:把网络逻辑从应用里搬出来

Envoy and the Service Mesh: Moving Network Logic Out of the Application

2015 年前后的 Lyft 正处在一段很典型的迁移里:一个 PHP 单体被拆成几十个 Python 和 Go 服务。拆完以后出现了一类新的故障——请求失败了,但没有任何一个服务认为自己出了错。 超时是在哪一层触发的?重试是谁发的、发了几次?某个实例已经病了,为什么流量还在往它身上打?这些问题的答案分散在七八种语言的客…

Envoy · 服务网格 · sidecar 代理

当代

ZFS:不覆盖写,与端到端校验

ZFS: Never Overwrite, Always Verify

有一类故障,比磁盘冒烟难对付得多。 磁盘没坏,SMART 全绿,读请求正常返回,没有任何一层报错——但返回的那 4 KiB 不是你当年写进去的内容。可能是固件把数据写到了错误的扇区,可能是控制器的 DMA 传输翻了一个比特,可能是缓存声称"已经落盘"其实没有。这类错误有个名字:静默数据损坏(silent data co…

文件系统 · 写时复制 · 数据完整性

当代

Lucene:搜索引擎内部的倒排索引

Lucene: The Inverted Index Inside a Search Engine

一个装了两千万篇文档的系统,你输入"量子纠缠",两百毫秒之内屏幕上出现十条结果,还按相关度排好了序。 如果换成逐篇读过去——两千万篇文档、平均每篇几千字,那是几十 GB 的文本。哪怕全部装在内存里、每秒扫十几 GB,一次查询也要好几秒;落到磁盘上则是几分钟。这个数量级差距不是靠"服务器更快"补上的,它必须靠换一种数据组…

Lucene · 倒排索引 · 全文检索

当代

Prometheus:拉模型与时序数据的代价

Prometheus: The Pull Model and the Price of Time Series

2012 年 11 月 24 日,Prometheus 仓库收到第一个公开提交。写下它的 Matt T. Proud 和 Julius Volz 刚刚离开 Google 加入 SoundCloud,手里带着一套用惯了的东西的记忆——Borgmon,Google 内部那个基于时间序列做告警的监控系统。SoundCloud…

Prometheus · 拉模型 · 时序数据库

当代

curl:一个人维护的全球基础设施

curl — Global Infrastructure Maintained by One Person

手边任何一台联网设备,多半正在用 curl 说话。手机应用拉一张图、机顶盒检查固件更新、车机后台下载地图、打印机去查耗材余量、游戏主机同步存档——这些请求里有相当一部分不是应用自己写的网络代码,而是一个叫 libcurl 的 C 库替它们发出去的。curl 项目在 2025 年给出的估算是:全球约三百亿份装机。 这个数…

开源维护 · 网络传输库 · 向后兼容