硬件选型与调优:从CPU到网卡,每一纳秒都得抠

做市系统,说白了就是跟时间赛跑。别人快你1微秒,你的订单就可能排在后面,吃不到价差。我做了这么多年低延迟系统,最深的体会就是:硬件选型不是花钱买配置,而是每一分钱都要花在刀刃上

今天咱们聊聊硬件的四个核心环节:CPU、内存、网卡,还有BIOS和内核参数。嗯,这里面的坑,我踩过不少。

CPU选型:高频 vs 多核,你怎么选?

很多人一上来就问:「核数越多越好,对吧?」
其实不一定。做市系统的核心逻辑是单线程事件循环,说白了就是一条流水线从头走到尾。你给它32个核,它也只用一个。那剩下的核干嘛?闲置。

我个人习惯是:优先选高频,再考虑核数

  • 高频CPU:比如Intel的i9-13900K,单核睿频能到5.8GHz。适合做市策略的主循环,一个核跑满,延迟最低。
  • 多核CPU:比如AMD的EPYC 7763,64核128线程。适合做风控、日志、监控等并行任务。

我在项目中遇到过一件事:某团队买了64核的服务器,结果做市策略只用了1个核,剩下63个核全在跑「Hello World」。你说浪费不浪费?

我的建议:主策略服务器用高频CPU(比如Intel的Xeon W系列或消费级的i9/K系列),辅助服务器用多核CPU。别混着用,否则你会被NUMA问题搞疯。

内存架构:NUMA绑定,别让数据「串门」

NUMA(非统一内存访问)是现代服务器的标配。说白了就是:每个CPU有自己的「本地内存」,访问快;访问别人的内存,慢

你想想看,如果你的策略线程跑在CPU 0上,但数据分配在CPU 1的内存里,那每次读写都要跨CPU走一遍QPI总线。延迟直接翻倍。

怎么解决?NUMA绑定

# 把进程绑定到CPU 0和它的本地内存
numactl --cpunodebind=0 --membind=0 ./market_maker

# 查看NUMA拓扑
numactl --hardware

我曾经犯过一个低级错误:写了个多线程策略,每个线程都绑定到不同CPU,但没绑内存。结果线程A在CPU 0上跑,数据却在CPU 1的内存里。每次读写都跨NUMA节点,延迟从5微秒飙到15微秒。嗯,那次排查花了我整整两天。

避坑指南:如果你用DPDK或SPDK,记得在初始化时调用rte_malloc()并指定socket_id。否则默认分配在socket 0上,你的线程如果跑在socket 1上,那就悲剧了。

网卡选型:Solarflare vs Mellanox,谁更懂低延迟?

网卡是数据进入系统的第一道门。选错了,后面再怎么优化都白搭。

市面上主流的两家:Solarflare(现属Xilinx/AMD)Mellanox(现属NVIDIA)。我两家都用过,说说我的感受。

特性 Solarflare Mellanox
延迟(硬件层面) 极低,约1-2微秒 极低,约1-2微秒
用户态网络栈 OpenOnload(成熟稳定) libvma(性能不错)
FPGA可编程 支持(Xilinx平台) 不支持(纯ASIC)
生态与社区 金融领域老牌,文档丰富 HPC领域强势,RDMA支持好
价格 较贵 中等

我个人习惯:做市系统首选Solarflare + OpenOnload。为什么?因为OpenOnload可以直接绕过内核协议栈,把网络数据直接送到用户态。延迟能降到1微秒以内。

如果你需要RDMA(远程直接内存访问),比如做分布式订单簿同步,那Mellanox的ConnectX系列是更好的选择。它的RoCE(RDMA over Converged Ethernet)延迟极低,而且支持GPUDirect,适合GPU加速场景。

注意:不要买消费级网卡(比如Intel i350)来做低延迟系统。它们的硬件队列少,中断处理慢,延迟动不动就10微秒以上。省那几百块钱,亏的是几百万的收益。

BIOS与内核参数调优:把「省电模式」关掉

服务器出厂默认的BIOS设置,都是冲着「省电」和「稳定」去的。但做市系统要的是「性能」和「低延迟」。所以,第一件事就是进BIOS,把那些省电功能全关掉。

BIOS调优清单

  • 关闭C-States:CPU深度睡眠状态。关了它,CPU永远跑在最高频率,不会因为空闲而降频。
  • 关闭Turbo Boost?等等,这个要分情况。如果你追求稳定延迟,建议关掉;如果你追求峰值性能,可以开着。我个人习惯是关掉,因为Turbo Boost的电压和频率波动会导致延迟抖动。
  • 关闭Hyper-Threading:超线程会引入资源竞争,导致延迟不稳定。做市系统建议关掉。
  • 设置Power Profile为Performance:别用「Balanced」或「Power Saver」。

内核参数调优

BIOS调完,还得调内核。以下是我常用的参数:

# 减少中断合并,降低延迟
echo 0 > /sys/class/net/eth0/device/sriov_numvfs
ethtool -C eth0 rx-usecs 0 tx-usecs 0

# 设置CPU频率为performance模式
cpupower frequency-set -g performance

# 关闭透明大页(THP),减少TLB miss
echo never > /sys/kernel/mm/transparent_hugepage/enabled

# 设置进程优先级
chrt -f 99 ./market_maker

我曾经遇到过一个诡异的问题:系统跑着跑着,延迟突然从2微秒跳到50微秒。排查了半天,发现是内核的kswapd在后台做内存回收。解决方案?用mlockall()把进程的内存锁住,不让它被换出。

避坑指南:调优不是一次性的。每次硬件升级或内核更新,都要重新验证一遍。我见过有人升级了内核,结果之前的调优参数全失效了,延迟直接崩了。

知识体系总览

下面这张图,是我自己总结的硬件选型与调优的核心逻辑。你可以把它当作一个检查清单,每次搭建新系统时对照着来。

做市系统低延迟硬件选型与调优 CPU选型 内存架构 网卡选型 BIOS/内核调优 高频 vs 多核 单线程事件循环 NUMA绑定 本地内存 vs 远端内存 Solarflare vs Mellanox OpenOnload / libvma 关闭C-States / Turbo Performance模式 目标:端到端延迟 < 5微秒,抖动 < 1微秒 四个环节环环相扣,任何一个短板都会成为延迟瓶颈

好了,硬件选型与调优就聊到这儿。记住一句话:没有最好的硬件,只有最适合你场景的硬件。下一章咱们聊聊操作系统和内核的进一步优化,到时候你会看到,软件层面的调优同样能挤出不少延迟。


专注资料整理