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 排队延迟:最容易被忽视的杀手
排队延迟,是数据包在交换机或网卡的缓冲区里等待被处理的时间。这是四个延迟里最不可控的,也是我最头疼的。
你想想看,一个交换机有多个端口,所有端口共享背板带宽。如果某个瞬间,多个端口的数据都要发往同一个出口,那就会形成队列。队列越长,等待时间越久。
我画了一张图,帮你理解这个过程:
排队延迟的公式很简单:排队延迟 = 队列长度 × 每个包的处理时间。但实际中,队列长度是动态变化的,受流量突发影响很大。
我的建议:在高频交易网络中,尽量使用无阻塞交换架构。另外,开启优先级队列,把交易流量标记为高优先级,确保它们不会被普通流量堵住。
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