硬件选型与配置: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访问本地内存快,访问远端内存慢。
我画个图你就明白了:
你看,本地访问70纳秒,远端访问140纳秒,差了一倍。做市商系统里,每一纳秒都宝贵,所以NUMA优化是必须做的。
我总结了几条实战经验:
- 绑定CPU和内存——用
numactl命令,把进程绑定到同一个NUMA节点上。比如:numactl --cpunodebind=0 --membind=0 ./trading_engine - 网卡中断亲和性——把网卡的中断绑定到同一个NUMA节点的CPU上。Solarflare和Mellanox都支持这个配置。
- 内存池分配——用
mmap分配内存时,指定MAP_HUGETLB和MAP_ANONYMOUS,配合numa_alloc_local,确保内存分配在本地节点。 - 避免跨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绑定。这几步做好了,你的做市商系统就赢在了起跑线上。
嗯,今天就聊到这儿。硬件选型是基础,但光有硬件还不够,下一节咱们聊聊操作系统和内核调优,那才是真正拉开差距的地方。