量化竞争的军备竞赛打到今天,柜台到交易所的往返延迟从毫秒压进了微秒。很多人以为低延迟是"代码写快点",翻完延迟预算才发现:应用逻辑往往只占零头,钱和时间都花在操作系统和网络上。这篇把军备清单按成本从低到高过一遍,讲清每一项到底在买什么。
延迟解剖:时间都去哪了
先看一笔委托的传统内核路径开销(Linux,10G 网卡):
| 环节 | 典型成本 |
|---|---|
| 网络传输(机房内一跳) | < 5 μs |
| 网卡中断 + 上下文切换 | 5 ~ 15 μs |
| 内核 TCP/IP 协议栈(两次内存拷贝) | 10 ~ 30 μs |
| 应用读处理写 | 1 ~ 10 μs |
| 回程对称 | 同上再来一遍 |
内核路径往返轻松过 50μs。这笔账里有几个固定的"税":中断驱动的收包要走软中断、协议栈、socket 缓冲区,数据在网卡 DMA、内核空间、用户空间之间拷两三次;每次系统调用是一次用户态/内核态切换,TLB 和缓存冷一遍。
一个容易忽略的物理下限:串行化延迟。数据不是瞬间到达的,一个 64 字节帧在 10G 链路上要
$$ t_{ser} = \frac{64 \times 8}{10 \times 10^9} = 51.2\ \text{ns} $$
1500 字节的标准包是 1.2μs。这条曲线只随带宽涨而下降,换 25G/100G 网卡、FPGA 贴网卡部署,争的就是这几个纳秒到微秒。
军备清单:逐级拆解
第一级:操作系统的便宜优化。 CPU 绑核(消除调度抖动)、NUMA 本地内存(跨节点访问延迟差一倍)、关闭节能调频、TSC 时钟、忙轮询收包代替中断。成本几乎为零,收益能把 P99 抖动压掉一半。所有后续的优化都默认这一级已经做完。
第二级:内核旁路(DPDK 等)。 思路简单粗暴:网卡直接 DMA 到用户态内存池,协议栈自己写,应用自己轮询。省掉的是中断、上下文切换和拷贝三笔税,收发包延迟从 20μs 级压到 2~5μs。代价是:你要自己实现 TCP 或改用 UDP 加重传,防火墙、网管工具全部失效,运维难度上一个台阶。买的是确定性——轮询模式没有"中断恰好没来"的尾巴。
第三级:RDMA。 远程直接内存访问:一端网卡直接读写对端内存,CPU 不参与数据搬运,内核不参与传输路径。单边操作(one-sided READ/WRITE)下,对端 CPU 使用率是零。InfiniBand 端到端可以到 1μs 出头,RoCE 走以太网稍差但不用专用交换机。真正值钱的是配合 kernel bypass:数据面完全不进操作系统,延迟进入亚微秒区间。成本:专门的网卡和交换机、复杂的内存注册与队列对管理、排障工具链基本归零——出了问题靠厂家。
第四级:FPGA。 把行情解析、风控检查、订单编码直接烧进硬件,报文从网卡进来在 FPGA 芯片里走完逻辑再出去,CPU 全程不参与。可以做到几百纳秒的确定性延迟,抖动近乎为零。代价也最硬:逻辑一旦烧进去,改规则要重新综合、验证、回板,迭代周期从"改代码重启"变成"数周";容量规划按门数算,不是按内存算。所以 FPGA 更多出现在交易所侧(撮合本身就是规则固定的)和顶级自营,柜台侧多是"FPGA 做行情网关 + CPU 做撮合"的混合架构。
为什么最后拼的是 P99 而不是 P50
军备清单打到 RDMA 这一级,P50 的均值已经没有多少肉了,竞争转向尾延迟。原因在排队论(内存撮合篇给过公式):
$$ W = \frac{1}{\mu - \lambda} $$
均值只反映"队列不拥挤"的那段时间。真实交易里,两笔委托的到达间隔服从重尾分布,偶发的并发碰撞让某笔委托撞上前面所有未处理事件的队尾——P99 反映的是这种碰撞的代价,而碰撞概率由系统的最大扰动(一次 GC、一次中断风暴、一次跨 NUMA 访问)决定,不由均值决定。所以你会看到高频团队花大钱做两件事:消灭一切不确定性来源(绑核、隔离、关中断聚合、禁用 swap),以及把 P50 和 P99 的差距写进监控看板——均值的稳定性是系统健康度最诚实的指标。
另一个经济学视角:军备的边际收益递减很快。从 100μs 压到 10μs 改变策略形态(能抢到队列前面的单子),从 10μs 压到 2μs 只改善排队位次,从 2μs 压到 500ns 只剩理论优势——因为交易所的撮合本身也要时间,你省出来的微秒在对方的串行队列里只是几个位置。清单买到哪一级,取决于策略的超额收益能覆盖到哪一级。
一句话收束:低延迟优化是减法的艺术——每上一级军备,都是把"不可控的环节"换成"可控的环节",直到剩下不可约的物理极限。买到哪一级停手,是一道经济题,不是技术题。