用 Rust 重写一个 C 网络服务器,编译器拦了我五次
拿仓库里现成的 io_uring echo server 做基线,一行一行往 Rust 翻。记录编译器拦下来的五个瞬间——每一个都对应 C 版本里一个真实的 crash 或泄漏风险。Rust 的价值不在更快,在更难把雷带到线上。
发布来自土法炼钢兴趣小组的知识、笔记、进展和应用。主题包括数据结构和算法、编程语言、网络安全、密码学等。
拿仓库里现成的 io_uring echo server 做基线,一行一行往 Rust 翻。记录编译器拦下来的五个瞬间——每一个都对应 C 版本里一个真实的 crash 或泄漏风险。Rust 的价值不在更快,在更难把雷带到线上。
从源码级别拆解 Go runtime 的 GMP 调度器:G/M/P 结构体、schedule() 调度循环、work stealing、协作式到异步抢占的演进、netpoller 与 syscall 处理,以及与 Linux CFS 调度器的正面对比。
C++ 的 RAII 有五个逃生舱门:use-after-move、悬垂引用、共享可变、异常安全、裸指针逃逸。Rust 的所有权模型把它们全部焊死了。从 C++ 侧拆解 RAII 的根本缺陷,看 Rust 如何在每个分叉点做出不同选择。
我们的迷你运行时有 500 行,runc 有 15000 行。多出来的代码在干什么?本文拆解 runc 的核心流程:从 runc create 到容器 init 进程,libcontainer 的设计,nsenter 里那段神秘的 C 代码,以及 Go runtime fork 的天坑。
组装完整 LSM-Tree 存储引擎:DB 接口(Open/Put/Get/Delete/Iterator/Snapshot)、单写多读并发控制、启动恢复,然后用 Rust 重写核心模块,记录 5 个编译器不让我过的故事,最后三方 benchmark 对比。从零写一个 LSM-Tree 存储引擎系列第 5 篇。
容器网络为什么比裸机慢?veth + bridge 每个包经过两次 netfilter,macvlan 跳过了 bridge,Cilium 用 eBPF 替掉了 iptables。到底慢多少?我们用 iperf3、wrk 和自定义 echo server 实测。
容器用 namespace 隔离,microVM 用硬件虚拟化。AWS Lambda 背后的 Firecracker 去掉了 BIOS、ACPI、PCI,只用 virtio-mmio,125ms 启动一个 VM。两种隔离模型到底差在哪?安全性差多少?开销差多少?
容器运行时需要 root 权限?不一定。User namespace 让普通用户也能创建容器——容器内是 root,容器外是你自己。Podman 就是这么干的。但 rootless 不是免费午餐,限制比你想象的多。
你的容器能调用 reboot()。是的,现在就能。除非有人拦住它。Capabilities 拆分 root 权限,Seccomp-BPF 过滤系统调用——两道防线,缺一不可。本文用 C 代码拆解这两套机制,看看 Docker 到底替你挡住了什么。
我们的迷你容器运行时能跑了,但没人能用它——因为 containerd、Kubernetes 不认识它。OCI Runtime Spec 就是容器世界的通用语言。本文拆解规范的每个关键字段,把迷你运行时改造成 containerd 能调用的标准运行时。
五篇文章攒了一堆内核积木:namespace、netns、rootfs、cgroup、overlayfs。现在是时候用 Go 把它们拼成一个能跑的容器运行时了。不到 500 行代码,create/start/exec/kill/delete,五个命令走完容器的一生。
Docker 镜像为什么能分层?pull 一个 100MB 的镜像为什么只下载 3MB?答案是 OverlayFS 的 copy-on-write。本文手工构建分层镜像,实测 COW 的性能代价。
从零实现 LSM-Tree Compaction:最小堆多路归并迭代器、Level 分层与 Compaction 打分、Tombstone 下推、Version/VersionEdit/MANIFEST 版本管理,以及 Leveled/Size-Tiered/Universal 三种策略的量化对比。从零写一个 LSM-Tree 存储引擎系列第 4 篇。
你给容器设了 512MB 内存限制,结果宿主机上的数据库被 OOM-kill 了。Cgroups 不是'加个限制'那么简单 — v1 的设计是个历史错误,v2 才是正确答案。本文用 C 代码从 mkdir 开始,手动创建 cgroup,设 CPU/内存/IO 限制,压测,看它怎么把进程关进笼子。
chroot 不是安全边界——10 行 C 就能逃出去。本文用 pivot_root 构建真正隔离的容器根文件系统:从 Alpine minirootfs 到设备节点,从 mount propagation 到只读根,一步步把容器的'地基'打牢。