4. 网络延迟优化:低延迟交换机选型、多播与单播的延迟权衡、NIC调优(中断合并、Ring Buffer)、物理层优化(光纤 vs 铜缆)
网络延迟,说白了就是数据在网线上跑的时间。很多人觉得这玩意儿是物理定律,没法改。其实不然。我在交易系统里摸爬滚打这么多年,见过太多因为网络配置不当,白白多出几十微秒延迟的案例。几十微秒,在交易世界里可能就是几百万的差距。
这一节,我们就把网络延迟这块硬骨头啃下来。从交换机、协议、网卡,一直到物理介质,一层层往下挖。
4.1 低延迟交换机选型:别只看带宽
很多人选交换机,上来就问“千兆还是万兆”?我告诉你,这问题问错了。带宽只是吞吐量,跟延迟是两码事。你想想看,一个万兆交换机,如果内部处理逻辑复杂,转发延迟可能比一个精心调优的千兆交换机还高。
我个人习惯,选交换机看三个核心指标:
- 端口到端口延迟:这是硬指标。一般低延迟交换机能做到 300-500 纳秒。普通交换机动辄几微秒。
- Cut-through 转发模式:普通交换机用 Store-and-Forward,要收完整个包才转发。Cut-through 只看个包头就开始转,能省不少时间。
- 内部架构:尽量选基于 FPGA 或 ASIC 的交换机。软件交换机的延迟不可控。
核心观点:低延迟交换机不是“功能多”的交换机,而是“功能少”的交换机。去掉不必要的 QoS、ACL、流控,延迟自然就下来了。
我在项目中遇到过一件事。某团队买了个高端品牌交换机,功能齐全,结果延迟比预期高了 30%。后来发现是默认开启了“风暴控制”和“流量整形”。关掉之后,延迟直接腰斩。嗯,这里要注意,买回来第一件事,就是进管理界面,把能关的优化功能全关了。
4.2 多播与单播的延迟权衡
行情数据分发,到底用多播还是单播?这个问题争论了很久。我直接说结论:多播是行情分发的首选,单播是不得已的备选。
为什么会这样?多播有个天然优势:一份数据,交换机复制给所有订阅者。延迟是恒定的,不管你有 10 个还是 100 个接收端。单播呢?你得给每个接收端单独发一份。交换机要处理 N 倍的包,延迟自然就上去了。
但多播也有坑。我踩过最大的坑,就是 IGMP Snooping。交换机默认开启这个功能,用来优化多播流量。但问题是,它需要维护组播成员表,处理查询和报告报文。这些操作本身就会引入延迟。
避坑指南:我曾经在一个高频交易项目中,发现行情延迟忽高忽低。排查了三天,最后发现是 IGMP Snooping 的查询间隔设置得太短,导致交换机频繁处理查询报文,影响了转发性能。解决方案?直接关闭 IGMP Snooping,或者把查询间隔调到 60 秒以上。
单播什么时候用?我建议只在两种场景下用:一是网络规模很小(比如 2-3 个接收端),二是需要加密传输。多播不支持加密,如果你有合规要求,只能走单播。
4.3 NIC 调优:中断合并与 Ring Buffer
网卡调优,是很多人容易忽略的环节。默认配置下,网卡为了降低 CPU 占用,会做很多“好心办坏事”的优化。我们做交易系统的,要的就是低延迟,CPU 占用高一点无所谓。
4.3.1 中断合并(Interrupt Coalescing)
中断合并,说白了就是网卡攒一批包再通知 CPU。这样 CPU 中断次数少了,吞吐量上去了,但延迟也上去了。你想想看,本来一个包到了就能处理,现在要等一批包到齐。这不就是拿延迟换吞吐吗?
我建议:直接关闭中断合并。在 Linux 下,用 ethtool 工具:
# 查看当前中断合并设置
ethtool -c eth0
# 关闭中断合并
ethtool -C eth0 rx-usecs 0 tx-usecs 0
# 或者设置成极小的值(比如 1 微秒)
ethtool -C eth0 rx-usecs 1 tx-usecs 1
小技巧:有些网卡不支持完全关闭中断合并,那就设成最小值。我一般设 1 微秒,效果跟关闭差不多。
4.3.2 Ring Buffer 大小
Ring Buffer 是网卡和驱动之间的缓冲区。包到了网卡,先放 Ring Buffer,然后等 CPU 来取。Ring Buffer 太小,流量突发时容易丢包。Ring Buffer 太大,包在缓冲区里排队,延迟就上去了。
怎么调?我个人的经验是:不要用默认值。默认值通常偏大,为了兼容各种场景。我们做交易系统,流量相对稳定,可以适当调小。
# 查看当前 Ring Buffer 大小
ethtool -g eth0
# 设置 RX Ring Buffer 为 1024
ethtool -G eth0 rx 1024
# 设置 TX Ring Buffer 为 512
ethtool -G eth0 tx 512
我在项目中遇到过一个问题。某次行情数据偶尔出现几毫秒的延迟尖峰。排查下来,发现是 Ring Buffer 满了,网卡触发了流控,导致数据被丢弃。后来我把 Ring Buffer 从 4096 调到 2048,延迟尖峰消失了。为什么?因为缓冲区小了,CPU 必须更频繁地来取数据,反而减少了排队时间。
4.4 物理层优化:光纤 vs 铜缆
物理层,很多人觉得没什么好优化的。线嘛,能通就行。其实不然。光纤和铜缆的延迟差异,在微秒级别,但累积起来就很可观了。
直接给结论:短距离(10 米以内)用铜缆,长距离用光纤。
| 介质 | 延迟(每米) | 优势 | 劣势 |
|---|---|---|---|
| 铜缆(Cat6a) | 约 4.5 纳秒 | 成本低,连接简单 | 距离受限,易受干扰 |
| 光纤(单模) | 约 5.0 纳秒 | 距离远,抗干扰 | 成本高,需要光电转换 |
| 光纤(多模) | 约 5.5 纳秒 | 比单模便宜 | 距离不如单模 |
你可能会问,光纤延迟不是比铜缆高吗?为什么还要用?因为光纤的延迟是稳定的,铜缆受电磁干扰影响,延迟会有抖动。在交易系统里,稳定的低延迟比偶尔更低但会抖动的延迟更重要。
我个人习惯,机柜内部连接全部用铜缆。机柜之间,哪怕只有 20 米,我也用光纤。为什么?因为铜缆在长距离下,信号衰减会导致重传,重传的延迟是不可控的。
一句话总结:物理层优化的核心,不是追求最低的理论延迟,而是追求最稳定的实际延迟。
4.5 本章知识体系
下面这张图,把网络延迟优化的几个层面串起来了。从交换机到物理介质,每一层都有优化空间。
这张图从下往上看,就是数据从网线到应用层的完整路径。每一层都有优化空间,但要注意,优化是层层叠加的。你交换机再好,网卡没调优,延迟照样高。反过来,网卡调得再好,物理介质不行,延迟也会抖动。
我的建议:先从网卡调优入手,成本最低,效果最明显。然后是物理层,换线比换交换机便宜。最后才是交换机选型。别一上来就砸钱买高端交换机,先把基础工作做好。
好了,网络延迟优化这块,核心要点就这些。记住一句话:延迟不是测出来的,是设计出来的。从架构层面就把延迟考虑进去,比事后优化要有效得多。