为亚微秒级延迟而设计 (link)

发布: (2025年12月31日 GMT+8 00:03)
4 min read
原文: Dev.to

Source: Dev.to

Lessons from Building a Minimal Execution Engine

大多数框架都在优化吞吐量、开发者速度或水平可扩展性。当你关注尾部延迟、确定性以及亚微秒级关键路径时,这些抽象往往会成为负担。我构建了 SubMicro Execution Engine 来探索当延迟——而不是功能——成为主要设计约束时会发生什么。下面是塑造该系统的几个实用经验教训。

Latency Lives in the Edges, Not the Core Logic

系统实际执行的“工作”很少是瓶颈。延迟隐藏在:

  • 内存分配
  • 缓存行争用
  • 分支错误预测
  • 调度器切换
  • 同步原语

关键实践

  • 保持热点路径无分配
  • 倾向使用平坦、缓存友好的数据布局
  • 避免隐式同步
  • 设计能够装入 L1/L2 缓存的执行流

如果你无法从内存中描绘出热点路径,就说明你并未掌控延迟。

Determinism Beats Raw Throughput

一个每秒执行 1 M 操作的系统,有时不如一个始终保持每秒 200 k 操作的系统有用。

设计选择的指导原则

  • 稳定的执行顺序
  • 可预测的调度
  • 热点路径中的最小动态行为

这会以峰值吞吐量为代价,换取紧凑的延迟分布——在实时系统和交易系统中,这一点更为关键。

Abstractions Have a Cost — Measure Them Ruthlessly

抽象本身并不坏,但未被测量的抽象是危险的。

在低延迟系统中:

  • 虚函数调用的开销可能超过实际逻辑本身
  • 通用容器会隐藏内存访问模式
  • “干净”的接口常常会把执行路径碎片化

相反,应追求

  • 对执行的显式控制
  • 可见的数据移动
  • 简单、可检查的组件

通过 移除 层而不是添加层来保持代码的可读性。

Scheduling Is a Latency Feature

调度器决定 何时 执行工作——这与 做什么 同样重要。

设计考虑因素包括

  • 最小化上下文切换
  • 可选的忙轮询策略
  • 避免在热点路径中受操作系统干扰的执行模型

目标是让执行尽可能贴近 CPU,而不是在队列和线程之间来回跳转。

Measure the Tail, Not the Average

平均延迟是误导性的。

该引擎的设计假设是:

  • p99 与 p99.9 的重要性高于均值
  • 偶发的峰值会破坏实时系统
  • 监控必须轻量到足以在生产环境中使用

如果不测量尾部延迟,你的优化就是盲目的。

Closing Thoughts

本项目刻意保持极简。它 不是 一个框架;而是一次探索——在每一个设计决策都要回答同一个问题的前提下,你能将延迟控制推向多远:

这会降低还是增加不可预测性?

Repository: submicro-execution-engine
Demo site: https://submicro.krishnabajpai.me/

Back to Blog

相关文章

阅读更多 »