2. 网络延迟的构成:传输延迟、处理延迟、排队延迟、序列化延迟

做高频交易的人,天天跟延迟较劲。你想想看,一笔订单从发出到成交,中间经历了什么?

我刚开始调优的时候,也以为延迟就是网线传输那点事。后来被现实狠狠教育了一回——有一次我们一个策略在芝加哥和纽约之间跑,明明光纤距离没变,延迟却突然飙升了30微秒。排查了整整两天,最后发现是交换机某个端口的队列满了。

嗯,从那天起,我就养成了一个习惯:把网络延迟拆成四个部分来看。每一部分都有它的脾气,你得摸透了才能对症下药。

核心公式:

总延迟 = 传输延迟 + 处理延迟 + 排队延迟 + 序列化延迟

这四个部分,缺一不可。任何一个环节出问题,你的交易速度就崩了。

2.1 传输延迟:光速是硬约束

传输延迟,说白了就是信号在物理介质上跑的时间。光在光纤里的速度大约是真空光速的2/3,也就是每秒20万公里左右。

举个例子:

  • 上海到北京,直线距离约1000公里
  • 理论最小传输延迟 = 1000km / 200,000km/s = 5毫秒
  • 但实际上,光纤要走实际路径,加上中继器,通常要6-7毫秒

我参与过一个项目,要把交易服务器从上海搬到嘉兴。距离只近了80公里,延迟就降了0.4毫秒。别小看这0.4毫秒,在高频交易里,这就是胜负手。

我的经验:传输延迟是物理定律,你改变不了光速。但你可以选择更近的数据中心,或者用微波链路替代光纤。微波在空气中的速度接近真空光速,比光纤快30%左右。

2.2 处理延迟:设备的大脑在想什么

处理延迟,指的是网络设备(交换机、网卡、路由器)处理数据包所花的时间。包括查路由表、做转发决策、校验数据完整性等等。

为什么会慢?我遇到过几种情况:

  • CPU处理能力不足:低端交换机的CPU处理不过来了,包就卡住了
  • 软件协议栈开销:Linux内核的网络协议栈,处理一个包要经过好几层,每层都有开销
  • 安全策略检查:防火墙、ACL规则越多,处理时间越长

我曾经帮一家量化基金调优,他们用的是一台企业级交换机,处理延迟标称是5微秒。但实际测下来,在满负载时飙到了50微秒。后来发现是开启了深度包检测(DPI),关掉之后立刻回到5微秒。

避坑指南:我曾经见过有人为了省成本,用普通千兆交换机做交易网络。结果处理延迟比专用交换机高了两个数量级。高频交易场景,请务必使用低延迟交换机(如Cisco Nexus 3000系列、Mellanox SN系列)。

2.3 排队延迟:最容易被忽视的杀手

排队延迟,是数据包在交换机或网卡的缓冲区里等待被处理的时间。这是四个延迟里最不可控的,也是我最头疼的。

你想想看,一个交换机有多个端口,所有端口共享背板带宽。如果某个瞬间,多个端口的数据都要发往同一个出口,那就会形成队列。队列越长,等待时间越久。

我画了一张图,帮你理解这个过程:

排队延迟形成示意图 输入端口1 输入端口2 输入端口3 队列(排队中) 队列(排队中) 队列(排队中) 交换核心 输出 多个输入端口同时向同一个输出端口发送数据时,形成排队 队列深度越大,排队延迟越高 排队延迟 = 队列长度 × 每个包的处理时间

排队延迟的公式很简单:排队延迟 = 队列长度 × 每个包的处理时间。但实际中,队列长度是动态变化的,受流量突发影响很大。

我的建议:在高频交易网络中,尽量使用无阻塞交换架构。另外,开启优先级队列,把交易流量标记为高优先级,确保它们不会被普通流量堵住。

2.4 序列化延迟:把数据变成比特流

序列化延迟,是把数据包从内存搬到物理线路上所需的时间。说白了,就是把一串0和1按顺序发出去。

这个延迟取决于两个因素:

  • 数据包大小:包越大,序列化时间越长
  • 链路速率:速率越高,序列化时间越短

计算公式:序列化延迟 = 数据包大小(比特) / 链路速率(比特/秒)

举个例子:

链路速率 64字节包 1500字节包
1 Gbps 0.512 微秒 12 微秒
10 Gbps 0.0512 微秒 1.2 微秒
40 Gbps 0.0128 微秒 0.3 微秒

看到了吧?同样的数据包,在1G链路上要12微秒,在40G链路上只要0.3微秒。这就是为什么高频交易都在往更高速率迁移。

避坑指南:我曾经见过有人为了减少序列化延迟,把交易数据包做得特别小。但别忘了,包越小,包头开销占比越大。比如一个64字节的包,以太网头就占了14字节,IP头20字节,UDP头8字节,真正有用的数据只有22字节。效率不到35%。

所以,不要盲目追求小包。合理的做法是:在满足业务需求的前提下,尽量合并数据,减少包的数量,同时使用高速链路。

2.5 四个延迟的实战对比

我整理了一个表格,方便你对比这四个延迟在实际环境中的典型值:

延迟类型 典型值范围 可控性 优化手段
传输延迟 5微秒(同城)~ 50毫秒(跨洲) 选择更近的数据中心、使用微波链路
处理延迟 0.5微秒(硬件转发)~ 50微秒(软件转发) 使用专用硬件、关闭不必要的功能
排队延迟 0微秒(空闲)~ 数毫秒(拥塞) 流量整形、优先级队列、无阻塞架构
序列化延迟 0.01微秒(40G)~ 12微秒(1G) 升级链路速率、优化数据包大小

你看,这四个延迟里,序列化延迟是最好优化的——花钱升级链路就行。排队延迟是最难搞的,因为它跟流量模式强相关,你永远不知道下一秒会不会有突发流量。

总结一下我的经验:

  • 先搞定序列化延迟——升级到10G或40G链路,立竿见影
  • 再优化处理延迟——换低延迟交换机,关掉不必要的功能
  • 然后控制排队延迟——做流量整形,设置优先级
  • 最后考虑传输延迟——如果预算够,搬机房或者上微波

这个顺序,是我在多个项目中验证过的。别一上来就想着搬机房,先把能做的低成本优化做了再说。

好了,这一章的内容就到这里。记住这四个延迟,后面我们会逐一深入,讲具体的测量方法和优化技巧。


公众号:蓝海资料掘金营,微信deep3321