硬件选型与配置:CPU、内存、网卡与NUMA架构

做市商系统,说白了就是跟时间赛跑。我做了这么多年低延迟交易,最深的体会就是:硬件选型一旦错了,后面再怎么优化代码都是白搭。今天咱们就聊聊硬件选型里最关键的四个环节——CPU、内存、网卡和NUMA架构。

CPU选型:高频核心 vs 多核

很多人一上来就问:「我该买多少核的CPU?」其实这个问题问错了。做市商系统最核心的诉求是单线程延迟,而不是并行吞吐量。你想想看,行情来了,处理逻辑是一条线跑下来的,多核帮不上忙。

我个人习惯,选CPU只看三个指标:

  • 主频——越高越好,4.0GHz起步,5.0GHz不嫌多
  • 单核Turbo频率——比基础频率更重要
  • L3缓存大小——能塞下整个订单簿最好

我在项目中遇到过一家交易所,他们买了64核的服务器,结果行情处理延迟反而比32核的还高。为什么?因为核多了,跨核通信的开销也大了。做市商系统,核心数够用就行,剩下的预算全砸在频率上。

我的推荐配置:

  • Intel Xeon W系列或AMD Ryzen Threadripper Pro
  • 主频4.5GHz以上,单核Turbo 5.0GHz+
  • 核心数:8-16核足够,别超过32核
  • L3缓存:至少32MB,越大越好

避坑指南:我曾经见过有人为了省钱买了低频高核的服务器,结果行情尖峰时刻处理不过来,直接爆单。做市商系统,宁可核少,也要频率高。

内存选型:DDR5 vs DDR4

内存这块,争议挺大的。DDR5刚出来的时候,延迟比DDR4还高,很多人觉得是智商税。但现在情况不一样了。

我直接说结论:

指标 DDR4-3200 DDR5-5600 DDR5-6400+
带宽 25.6 GB/s 44.8 GB/s 51.2 GB/s+
CAS延迟 14-16 ns 36-40 ns 30-34 ns
实际访问延迟 ~70 ns ~85 ns ~75 ns
价格

你看,DDR5-6400的实际访问延迟已经接近DDR4了,但带宽翻了一倍。做市商系统里,内存带宽主要影响的是订单簿的批量更新和快照生成。如果你做的是高频做市,每秒要处理几万笔订单,带宽就是命。

我个人建议:直接上DDR5-6400。别省那点钱,延迟差个10纳秒,在微秒级的交易世界里,可能就是盈利和亏损的分界线。

小技巧:内存插法也有讲究。尽量插满所有通道,比如四通道主板就插4根,别插2根。带宽翻倍,延迟还能降一点。

网卡选型:Solarflare vs Mellanox

网卡这块,我踩过的坑最多。市面上做低延迟网卡的就两家:Solarflare(现在叫Xilinx/AMD)和Mellanox(现在叫NVIDIA)。

先说说各自的优势:

  • Solarflare/Xilinx:延迟最低,支持TCP offload和onload技术,能把网络延迟压到1微秒以内。我最早用Solarflare的时候,延迟直接从10微秒降到了2微秒,效果立竿见影。
  • Mellanox/NVIDIA:生态好,支持RDMA和GPUDirect,适合跟GPU配合做行情预测。如果你用NVIDIA的GPU做机器学习,Mellanox是首选。

怎么选?我有个简单的判断标准:

  • 如果你的系统是纯C++写的,主要做订单处理和风险管理 → 选Solarflare
  • 如果你的系统用了GPU做行情预测或统计套利 → 选Mellanox
  • 如果你两个都要 → 那就各买一块,各司其职

我的实际配置:

行情接收用Solarflare XtremeScale X2522,延迟1.2微秒;订单发送用Mellanox ConnectX-6 Dx,配合RDMA,延迟0.8微秒。两路分开,互不干扰。

避坑指南:我曾经贪便宜买了普通网卡,结果行情尖峰时刻丢包率高达5%。做市商系统丢一个包,可能就是几十万的损失。网卡这块,别省。

NUMA架构优化

NUMA(非统一内存访问)是现在多路服务器绕不开的话题。说白了,就是CPU访问本地内存快,访问远端内存慢。

我画个图你就明白了:

NUMA Node 0 CPU 0 内存 0 本地访问 ~70ns NUMA Node 1 CPU 1 内存 1 远端访问 ~140ns 本地内存访问延迟约70ns,远端内存访问延迟约140ns,差了一倍

你看,本地访问70纳秒,远端访问140纳秒,差了一倍。做市商系统里,每一纳秒都宝贵,所以NUMA优化是必须做的。

我总结了几条实战经验:

  1. 绑定CPU和内存——用numactl命令,把进程绑定到同一个NUMA节点上。比如:numactl --cpunodebind=0 --membind=0 ./trading_engine
  2. 网卡中断亲和性——把网卡的中断绑定到同一个NUMA节点的CPU上。Solarflare和Mellanox都支持这个配置。
  3. 内存池分配——用mmap分配内存时,指定MAP_HUGETLBMAP_ANONYMOUS,配合numa_alloc_local,确保内存分配在本地节点。
  4. 避免跨NUMA通信——行情接收、订单处理、风控检查,尽量放在同一个NUMA节点上。

NUMA绑定示例代码:

// 绑定到NUMA Node 0
numactl --cpunodebind=0 --membind=0 ./trading_engine

// 查看当前NUMA拓扑
numactl --hardware

// 检查进程绑定情况
numactl --show

小技巧:我习惯在启动脚本里加一行numactl --cpunodebind=0 --membind=0,这样就不用每次手动绑定了。另外,记得把系统的irqbalance服务关掉,不然它会自动把中断分配到不同CPU上,破坏你的绑定。

总结一下

硬件选型这件事,说白了就是「把钱花在刀刃上」。CPU要高频不要多核,内存要DDR5-6400,网卡看场景选Solarflare或Mellanox,最后别忘了NUMA绑定。这几步做好了,你的做市商系统就赢在了起跑线上。

嗯,今天就聊到这儿。硬件选型是基础,但光有硬件还不够,下一节咱们聊聊操作系统和内核调优,那才是真正拉开差距的地方。


专注资料整理