Pingora 把负载均衡从 600ms 降到 101ms
这是一篇把延迟敏感服务迁到 Rust 的迁移记录。作者所在团队用三年把核心路径从 Python、Go、JVM 和 C 逐步换成 Rust,新旧实现按服务、按区域并行,数据够了再切流量。月调用量约 3 万亿次。
负载均衡原先基于 nginx,平均耗时长期停在 600ms。换成 Cloudflare 的 Rust 代理框架 Pingora 后,同一台机器、同一流量、同一套路由决策下,耗时落到 101ms。切换分两段,中间短暂停在约 300ms。发布路径热路径从约 350µs 降到约 50µs,复制层稳态约 27–31µs。Presence 的 subscribe join 中位延迟从 1–3s 降到 200–250ms,Web heartbeat 从 700ms 降到 200ms,内部 heartbeat 从 1.5–2s 降到约 500ms。Presence 第一版 Rust 已经优于被替换的 Python 服务;后续改数据布局后又把峰值内存再降约 6 倍,新 ReplicaSet 落在约 256–512 MiB。作者在开篇还写到,无界 Tokio 工作负载曾把 100 MiB 的 pod 打到 3.7 GiB。分片峰值内存从约 95% 降到 20–40% 一带。滚动替换时单 pod CPU 从约 0.5 核降到约 0.22 核。复制层从自研 TCP 换成 gRPC 加先落盘再转发:先写副本再返回投递状态,应用层用幂等键消化重复尝试。
原文链接:https://www.reddit.com/r/rust/comments/1wuask9/three_years_migrating_latencysensitive_services/
rustc 在两个月里把平均编译墙钟时间降了 4.57%
这是 Nicholas Nethercote 对 2026-07-29 到 2026-09-28 rustc 性能工作的汇总。perf.rust-lang.org 上 629 项墙钟测量里,555 项变快、74 项变慢,平均墙钟时间下降 4.57%,部分基准有两位数降幅。
同期工作包括:Jakub Beránek 给 Clippy 打开 PGO,多数 Clippy 基准变快,最好一档约 18%;Nikita Popov 把编译器使用的 LLVM 升到 23,全部基准平均墙钟再降 1.2%。Nightly 打开了更精确的 Polonius Alpha 借用检查,以及新 trait solver;两者在少数 crate 上更慢,serde 等已有后续修补。新贡献者 xmakro 优化 specialization graph 的 impl 处理,全部基准平均周期数下降 1.58%。作者改了 dataflow 的 CFG 遍历:cranelift-codegen 里超过 1.8 万个基本块的大函数,EverInitializedPlaces 到达不动点的 apply_effects_in_block 调用从 150 万次降到 9 万次,check 构建墙钟约降 30%。Chris Denton 提高编译器默认栈大小并去掉 ensure_sufficient_stack,多项基准指令数下降,最好接近 3%。文末写到作者次日加入 Hexcat,做编译器性能优化项目目标。
原文链接:https://nnethercote.github.io/2026/09/30/how-to-speed-up-the-rust-compiler-in-september-2026.html
从零写一个 green thread 运行时
这是一篇用 Rust 从零实现 green thread 运行时的说明,配套仓库 dzania/rsroutine,完整可运行代码不到 1000 行。目标是搞清用户态线程切换,不作为生产运行时。
Green thread 由语言运行时而不是内核创建和调度,多个用户态线程跑在少量 OS 线程上。实现里每个任务栈 32 KiB,带 guard page:先 mmap 整段为 PROT_NONE,再 mprotect 打开可用区。开发在 Apple Silicon 上,按 AAPCS64 只保存 callee-saved 寄存器、栈指针和链接寄存器。切换写成独立 .S,经 global_asm! 编进 crate,Rust 侧用 extern "C" 声明 swap_context 和 bootstrap_entry。
原文链接:https://dzania.github.io/green-threads-from-scratch/
champagne:在 Linux 进程里手工加载 Windows PE DLL
champagne 是一个在 Linux 上手工映射并运行 Windows PE 的加载器,仓库 CertainLach/champagne。作者给 HTC Vive Pro 2 写 Linux SteamVR 驱动时,镜头畸变在 LibLensDistortion.dll 里,还链到约 80MB 的 opencv_world346.dll。原先用 Wine/Proton 跑一个 MinGW 编译的 stdio 服务做 postcard IPC,前缀架构、wineboot 耗时和 SteamVR watchdog 经常把进程杀掉。
champagne 用 CasualX/pelite 解析 PE,映射、重定位、填导入表、设页保护。内核拒绝给匿名映射加 PROT_EXEC,所以用 POSIX 共享内存:shm_open 后立刻 shm_unlink,再 ftruncate 和映射。加载器补了 TEB/PEB、静态和动态 TLS、可重入 loader lock、约 110 个 kernel32 函数,以及 x86_64 .pdata 展开。镜头栈按依赖顺序载入 ucrtbase.dll、vcruntime140.dll、msvcp140.dll、opencv_world346.dll、LibLensDistortion.dll,之后 distortUV 等导出就是普通函数指针,跑在 SteamVR vrserver 进程里,不再走 IPC。
原文链接:https://delta.rocks/blog/lach-stuff/champagne
From Rust中文社区 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论