硬件选型与调优:从CPU到网卡,每一纳秒都得抠
做市系统,说白了就是跟时间赛跑。别人快你1微秒,你的订单就可能排在后面,吃不到价差。我做了这么多年低延迟系统,最深的体会就是:硬件选型不是花钱买配置,而是每一分钱都要花在刀刃上。
今天咱们聊聊硬件的四个核心环节:CPU、内存、网卡,还有BIOS和内核参数。嗯,这里面的坑,我踩过不少。
CPU选型:高频 vs 多核,你怎么选?
很多人一上来就问:「核数越多越好,对吧?」
其实不一定。做市系统的核心逻辑是单线程事件循环,说白了就是一条流水线从头走到尾。你给它32个核,它也只用一个。那剩下的核干嘛?闲置。
我个人习惯是:优先选高频,再考虑核数。
- 高频CPU:比如Intel的i9-13900K,单核睿频能到5.8GHz。适合做市策略的主循环,一个核跑满,延迟最低。
- 多核CPU:比如AMD的EPYC 7763,64核128线程。适合做风控、日志、监控等并行任务。
我在项目中遇到过一件事:某团队买了64核的服务器,结果做市策略只用了1个核,剩下63个核全在跑「Hello World」。你说浪费不浪费?
内存架构: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微秒。嗯,那次排查花了我整整两天。
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加速场景。
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()把进程的内存锁住,不让它被换出。
知识体系总览
下面这张图,是我自己总结的硬件选型与调优的核心逻辑。你可以把它当作一个检查清单,每次搭建新系统时对照着来。
好了,硬件选型与调优就聊到这儿。记住一句话:没有最好的硬件,只有最适合你场景的硬件。下一章咱们聊聊操作系统和内核的进一步优化,到时候你会看到,软件层面的调优同样能挤出不少延迟。