3. 网络架构设计:低延迟网络拓扑、交换机选型、网卡调优(DPDK/RDMA)、机房部署策略

行情网络,说白了就是整个集群的「血管」。

我见过太多团队,服务器配置拉满,软件优化做到极致,结果网络延迟一测,直接崩了。为什么?因为网络拓扑没设计好,交换机选型踩了坑,网卡调优根本没碰。

这一章,咱们就把这些硬骨头啃下来。

3.1 低延迟网络拓扑:别让数据在路上堵车

行情数据从交易所出来,到你的策略服务器,中间每多一跳,延迟就多几微秒。这几微秒,可能就是盈亏的分水岭。

我个人习惯用 Spine-Leaf 架构。 为什么不用传统的三层架构?你想想看,传统架构里流量要经过接入层、汇聚层、核心层,每一层都在排队。Spine-Leaf 不一样,任何两台服务器之间最多经过两跳——一个 Leaf 交换机,一个 Spine 交换机。延迟直接砍半。

核心原则: 行情数据流路径 = 最短路径。不要做任何不必要的路由聚合或 NAT 转换。

我在项目中遇到过一件事:某团队用了传统的「核心-汇聚-接入」架构,行情源在 A 机房,策略服务器在 B 机房,中间绕了四跳交换机。延迟从 5μs 直接飙到 18μs。后来改成 Spine-Leaf,延迟降到 7μs。嗯,这就是拓扑的力量。

具体部署时,我建议这样搞:

  • 行情接入层: 直接连接交易所行情源,用独立的 Leaf 交换机,不混用其他业务流量。
  • 行情分发层: 用 Spine 交换机做无阻塞转发,所有 Leaf 都连接到所有 Spine。
  • 策略执行层: 策略服务器挂在另一个 Leaf 上,与行情接入 Leaf 通过 Spine 直连。

说白了,就是让行情数据走「专线」——物理上的专线,而不是逻辑上的 VLAN。

3.2 交换机选型:别只看端口数

选交换机,很多人上来就问「多少口?千兆还是万兆?」。但做行情集群,你要问的是另外三个问题:

  1. 端口到端口的延迟是多少? 普通交换机 10μs 起步,好的低延迟交换机可以做到 300ns 以内。
  2. 支持 PFC(优先级流控制)吗? RDMA 必须用这个,否则丢包重传会让你崩溃。
  3. 缓冲区多大? 行情爆发时,瞬间流量可能是平时的 10 倍。缓冲区太小直接丢包。
参数 普通交换机 低延迟交换机
端口延迟 5-10 μs 300-500 ns
PFC 支持 可选 必须
缓冲区 4-8 MB 32-64 MB
价格 高(约 3-5 倍)

我曾经踩过一个坑: 贪便宜买了某品牌的「数据中心级」交换机,参数看着不错。结果上线第一天,行情爆发时交换机缓冲区瞬间打满,丢包率 2%。策略服务器拿到的行情数据全是残缺的,回放时发现延迟抖动超过 50ms。后来换了 Mellanox(现 NVIDIA)的低延迟交换机,问题才解决。

注意: 不要用家用或企业级交换机做行情网络。它们的设计目标是「不丢包」,而不是「低延迟」。在行情场景下,低延迟比不丢包更重要——当然,最好两者都要。

3.3 网卡调优:DPDK 与 RDMA 实战

网卡是数据进入服务器的最后一关。默认配置下,Linux 内核协议栈会引入 10-50μs 的延迟。这谁能忍?

所以我们要上 DPDK 和 RDMA。

3.4.1 DPDK:绕过内核,直接干

DPDK 的原理很简单:让用户态程序直接接管网卡,绕过内核协议栈。数据从网卡到应用,中间不经过任何系统调用。

配置 DPDK 时,我习惯这样做:

# 1. 绑定网卡到 DPDK 驱动
dpdk-devbind.py -b vfio-pci 0000:03:00.0

# 2. 分配大页内存
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

# 3. 启动 DPDK 应用(示例:l2fwd)
./build/l2fwd -l 0-3 -n 4 -- -p 0x1

嗯,这里要注意:DPDK 需要独占 CPU 核心。我一般会预留 2-4 个物理核心专门给 DPDK 轮询线程,不和业务线程混用。否则 CPU 上下文切换会把延迟拉高。

我在项目中遇到过一个问题: 某次升级内核后,DPDK 的 vfio-pci 驱动加载失败。查了半天,原来是 BIOS 里没开 IOMMU。所以,部署前一定要检查 BIOS 设置:

  • 开启 VT-d(Intel)或 IOMMU(AMD)
  • 关闭 C-State 和 P-State(防止 CPU 降频)
  • 关闭超线程(行情场景下,超线程反而有害)

3.4.2 RDMA:零拷贝,真·低延迟

RDMA 比 DPDK 更进一步。它允许一台机器的内存直接读写另一台机器的内存,不需要 CPU 参与。延迟可以降到 1μs 以下。

RDMA 有两种主流实现:InfiniBand 和 RoCEv2。我个人更倾向 RoCEv2,因为它跑在标准以太网上,不需要专用交换机。但前提是——交换机必须支持 PFC 和 ECN。

小技巧: 如果预算有限,可以先上 DPDK。等业务量上来后,再逐步迁移到 RDMA。两者可以共存,但要注意网卡资源的分配。

配置 RDMA 时,关键参数是这些:

# 查看 RDMA 设备状态
ibstat

# 设置 PFC(在交换机上配置)
mlnx_qos -i eth0 --pfc 0,0,0,1,0,0,0,0

# 验证延迟
ib_write_bw -d mlx5_0 --report_gbits

我曾经见过一个团队,RDMA 配好了,但延迟死活降不下来。最后发现是网卡的 PCIe 插槽插在了 x4 的槽位上,带宽不够。RDMA 必须用 x16 的 PCIe 3.0 或 4.0 插槽,否则性能直接腰斩。

3.4 机房部署策略:距离就是延迟

光速在光纤中大约是 20 万公里/秒。每 100 米光纤,理论延迟增加 0.5μs。所以,机柜之间的距离,直接决定了物理延迟的下限。

我的部署原则是:

  • 行情源服务器 放在离交易所接入点最近的机柜。
  • 策略服务器 和行情服务器放在同一个机柜,或者相邻机柜。
  • 风火水电 要独立。行情集群不能和普通业务混用电源和空调,否则一旦故障,全盘皆输。

具体到机柜内部,布线也有讲究:

  1. 使用有源光缆(AOC),比铜缆更轻、更细、延迟更低。
  2. 线缆长度精确到厘米,不要留多余的盘线。多余的线缆会增加信号衰减和延迟。
  3. 服务器网卡到交换机的距离 控制在 3 米以内。

一句话总结: 物理距离 = 延迟。能放一个机柜,就别放两个。能放一个机房,就别跨机房。

好了,网络架构这部分就聊到这儿。下一节咱们会深入行情数据的处理流程,看看数据到了服务器之后,怎么才能最快地变成可用的信号。

行情集群网络架构拓扑图 交易所行情源 Spine 交换机(低延迟,无阻塞) Leaf 交换机(行情接入) Leaf 交换机(策略执行) Leaf 交换机(备份/管理) 行情源服务器(DPDK/RDMA) 策略执行服务器(DPDK/RDMA) 备份/监控服务器 端到端延迟目标:< 5μs Spine-Leaf 架构,最多两跳