硬件选型与部署:CPU vs FPGA vs ASIC、网卡选型、时钟同步

各位同学,今天我们来聊聊硬件选型。这个话题,说白了就是「你的钱该往哪儿砸」。我在低延迟交易这行摸爬滚打十几年,见过太多团队在硬件上踩坑。有的花大价钱买了顶级FPGA,结果业务逻辑根本不适合硬件实现;有的死磕CPU优化,却忽略了网卡和时钟同步这些「隐形杀手」。

嗯,咱们一个一个说。

CPU vs FPGA vs ASIC:三选一?不,是组合拳

很多人问我:「到底哪个最快?」我的回答是:没有银弹。这三者各有各的脾气,你得根据业务场景来搭配。

维度 CPU FPGA ASIC
灵活性 极高(软件可编程) 高(可重配置) 极低(固化)
延迟 微秒级(受OS调度影响) 纳秒级(流水线并行) 皮秒级(全定制)
开发周期 周级 月级 年级
成本(批量) 极高(NRE费用)
典型场景 策略逻辑、风控、订单管理 行情解析、信号生成、极速交易 超大规模、固定算法(如做市商)

我的个人经验:别一上来就想着用FPGA替代所有CPU逻辑。我见过一个团队,花半年把风控逻辑写进FPGA,结果监管规则一变,整个板子得重新烧录。亏大了。

我个人习惯的做法是:CPU做「大脑」,负责策略决策、订单管理、风控这些需要灵活性的部分;FPGA做「神经末梢」,处理行情解析、信号生成这些对延迟极度敏感的任务。至于ASIC,除非你的交易量达到每天几百万笔,否则别碰——那玩意儿流片一次够你买一屋子服务器。

网卡选型:Solarflare vs Mellanox

网卡这东西,很多人觉得「能用就行」。但做低延迟交易,网卡就是你的「耳朵」和「嘴巴」。听不清、说不快,再好的策略也白搭。

目前主流就两家:Solarflare(现属Xilinx/AMD)Mellanox(现属NVIDIA)。我两家都用过,说说感受。

Solarflare:低延迟的「老炮儿」

  • 核心优势:硬件时间戳精度极高(纳秒级),配合PTP能实现亚微秒级同步。我曾在项目中用Solarflare X2522,配合DPDK,将行情接收延迟从5微秒压到800纳秒。
  • 避坑指南:Solarflare的驱动对内核版本很敏感。我曾经因为升级了内核,导致网卡驱动不兼容,回滚花了整整一天。建议锁定内核版本,或者用他们官方推荐的发行版。
  • 适用场景:对时间同步要求极高的套利策略,比如跨交易所价差套利。

Mellanox:高吞吐的「猛将」

  • 核心优势:RDMA(远程直接内存访问)技术成熟,适合大规模数据分发。如果你需要同时接收多个交易所的行情,Mellanox的ConnectX系列是首选。
  • 个人经验:Mellanox的RoCE(RDMA over Converged Ethernet)在丢包率高的网络环境下表现不稳定。我建议在数据中心内部使用,跨机房还是走传统TCP/IP更靠谱。
  • 适用场景:高频做市商、需要大量数据交换的集群环境。

小技巧:无论选哪家,记得开启 RSS(接收端缩放)和 Flow Director,让不同数据流绑定到不同CPU核心,避免中断风暴。我一般会为行情和交易各分配一个独立核心,互不干扰。

时钟同步:PTP与硬件时间戳

做套利,最怕什么?怕你以为A交易所先报价,实际上B交易所先成交。时间不同步,一切策略都是扯淡。

传统的NTP精度在毫秒级,做高频交易根本不够看。我们需要的是PTP(精确时间协议),配合硬件时间戳,精度能达到亚微秒级。

PTP的部署要点

  1. Grandmaster时钟:必须用GPS或北斗驯服的原子钟。别省这个钱,我曾经见过有人用普通服务器当Grandmaster,结果漂移得亲妈都不认识。
  2. 边界时钟与透明时钟:交换机必须支持PTP。我推荐用Cisco Nexus或Arista的PTP交换机,它们能修正报文驻留时间,减少累积误差。
  3. 硬件时间戳:网卡必须支持硬件时间戳。软件时间戳的抖动太大,根本不能用。Solarflare和Mellanox的高端型号都支持。

警告:PTP的精度高度依赖网络拓扑。我曾经在一个项目中,因为交换机级联层数太多,导致PTP同步误差从100纳秒飙升到5微秒。后来我们改用星型拓扑,所有交易服务器直连核心交换机,问题才解决。

硬件时间戳的实现

说白了,就是在网卡芯片里打时间戳,而不是靠CPU软件打。这样能避免中断延迟和调度抖动。代码层面,你需要用 SO_TIMESTAMPING 套接字选项来获取硬件时间戳。

// 启用硬件时间戳示例(Linux)
#include <linux/net_tstamp.h>
#include <sys/socket.h>

struct hwtstamp_config hwconfig;
memset(&hwconfig, 0, sizeof(hwconfig));
hwconfig.tx_type = HWTSTAMP_TX_ON;
hwconfig.rx_filter = HWTSTAMP_FILTER_ALL;

setsockopt(sockfd, SOL_SOCKET, SO_TIMESTAMPING,
           &hwconfig, sizeof(hwconfig));

这段代码启用后,每次收发包都会带上硬件时间戳。你可以在应用层直接读取,用于计算延迟或对齐时间。

知识体系总览

下面这张图,是我自己总结的硬件选型与部署的核心逻辑。你可以把它当作一张「地图」,随时回来对照。

低延迟套利系统硬件选型与部署 计算单元 网络接口 时钟同步 CPU(策略/风控) FPGA(行情/信号) ASIC(超大规模) Solarflare(低延迟) Mellanox(高吞吐) PTP(亚微秒级) 硬件时间戳(纳秒级) 三者协同:CPU做决策,FPGA做加速,网卡做传输,PTP做对齐

好了,硬件选型这块儿就聊到这儿。记住一句话:没有最好的硬件,只有最合适的组合。下一章咱们聊聊操作系统和内核调优,那又是另一片天地。


专注资料整理