第二章:硬件加速——FPGA在交易系统中的应用、GPU vs FPGA vs ASIC的选择、网卡硬件卸载、固态硬盘与内存计算
各位同行,咱们直接进入正题。硬件加速这个话题,在低延迟交易领域里,可以说是「兵家必争之地」。我做了这么多年系统,见过太多团队在软件层面优化到极致,最后发现瓶颈其实在硬件上。说白了,软件能优化的东西是有天花板的,而硬件加速,就是捅破这层天花板的那根针。
2.1 FPGA在交易系统中的应用
FPGA,全称是现场可编程门阵列。你想想看,它本质上是一堆逻辑门和触发器,你可以通过编程把它们「焊」成你想要的电路。我习惯把它叫做「可以重新布线的芯片」。
在交易系统里,FPGA最核心的应用场景就是——把延迟从微秒级压到纳秒级。为什么能做到?因为FPGA是硬件并行执行的,没有操作系统的调度开销,没有CPU的指令流水线停顿。
核心应用场景:
- 行情解析与组播转发:直接从网线接收二进制行情,解析后推送给交易策略。我见过最快的FPGA方案,从网口收到数据到解析完成,只需要不到100纳秒。
- 订单检查与风控:在订单到达交易所之前,用FPGA做前置检查。比如检查价格是否在合理范围、持仓是否超限。这些逻辑在CPU上跑可能要几十微秒,在FPGA上就是几个时钟周期的事。
- 硬件撮合引擎:一些高频做市商会在自己的FPGA上实现简化版的撮合逻辑,用于快速计算最优买卖价。
我记得有一次,帮一个客户优化他们的行情网关。他们用CPU做UDP组播接收,延迟抖动有±5微秒。我们换成了FPGA直接接管网卡,把抖动压缩到了±200纳秒以内。嗯,这就是硬件加速的魅力。
避坑指南:我曾经犯过一个错误——试图在FPGA上实现过于复杂的业务逻辑。FPGA擅长的是固定流水线、确定性延迟的任务。如果你需要频繁修改策略,或者逻辑分支特别多,那FPGA可能不是最佳选择。开发周期长、调试困难,这是它的代价。
2.2 GPU vs FPGA vs ASIC:怎么选?
这个问题,几乎每个做交易系统的团队都会问。我的回答是:没有银弹,只有权衡。咱们来拆开看。
| 维度 | GPU | FPGA | ASIC |
|---|---|---|---|
| 延迟 | 微秒级(受PCIe和驱动影响) | 纳秒级(纯硬件路径) | 纳秒级(最优) |
| 吞吐量 | 极高(适合批量计算) | 中等(取决于逻辑规模) | 极高(定制化) |
| 灵活性 | 中等(CUDA生态好) | 高(可重配置) | 低(流片后无法修改) |
| 开发周期 | 几周到几个月 | 几个月到一年 | 一年以上 |
| 成本 | 中等 | 较高(单颗芯片贵) | 极高(NRE费用) |
| 典型场景 | 策略回测、风险计算 | 行情解析、订单路由 | 交易所核心撮合 |
我个人习惯这样选型:
- 如果你需要做复杂的数学计算,比如期权定价模型、蒙特卡洛模拟,GPU是首选。CUDA生态成熟,开发效率高。
- 如果你追求极致延迟,而且逻辑相对固定,FPGA是王道。比如行情解码、UDP组播转发、硬件风控。
- 如果你是大交易所或者顶级做市商,有足够的预算和量,ASIC是终极方案。但说实话,我见过的大多数团队,连FPGA都没用好,就别想ASIC了。
注意:别被厂商的宣传带偏了。GPU在交易系统里最大的问题是延迟不确定性。因为GPU的调度是由驱动控制的,你无法保证每个kernel的启动延迟是固定的。而FPGA和ASIC,从输入到输出的延迟是确定的,这是交易系统最看重的特性。
2.3 网卡硬件卸载:TOE与RDMA
网卡,是交易系统的第一道关卡。数据从网线进来,经过网卡、PCIe、内存,最后到CPU。每一步都有延迟。而网卡硬件卸载,就是把这些步骤中的一部分,直接交给网卡上的硬件来处理。
TOE(TCP/IP卸载引擎)
说白了,就是把TCP/IP协议栈的处理,从CPU搬到网卡上。为什么需要这个?因为TCP协议栈的处理很重——校验和计算、分段重组、滑动窗口管理,这些在CPU上跑会消耗大量内核时间。
我建议在交易系统中,如果必须用TCP(比如连接交易所的FIX网关),一定要用支持TOE的网卡。否则你会发现,CPU的20%以上都在处理网络协议,而不是你的交易逻辑。
RDMA(远程直接内存访问)
这个更狠。RDMA允许一台机器的应用程序,直接读写另一台机器的内存,不需要经过CPU和操作系统。延迟可以降到1-2微秒,而传统的TCP/IP通信,延迟通常在10-50微秒。
我在项目中遇到过这样的情况:两个交易节点之间需要同步订单状态。用TCP socket,来回延迟大约30微秒。换成RDMA后,直接降到了2微秒。你想想看,对于高频策略来说,这28微秒的差距,可能就是盈利和亏损的分界线。
RDMA的两种模式:
- InfiniBand:专用网络,延迟最低,但成本高,需要专用交换机和线缆。
- RoCE(RDMA over Converged Ethernet):在标准以太网上跑RDMA,成本低,但需要网卡和交换机支持流控。
我个人更倾向于RoCE,因为它可以复用现有的以太网基础设施。但要注意,RoCE对网络质量要求很高,丢包会导致性能急剧下降。
2.4 固态硬盘与内存计算
最后聊聊存储。很多人觉得交易系统就是纯内存的,不需要硬盘。其实不然。历史数据回放、日志记录、盘后分析,这些都需要持久化存储。
固态硬盘(SSD),尤其是NVMe SSD,已经可以做到微秒级的延迟。但要注意,SSD的延迟是有波动的——垃圾回收、写放大,都会导致延迟抖动。我建议在交易系统中,SSD只用于写日志和读历史数据,不要用于实时交易路径。
内存计算,才是实时交易的王道。所有需要快速访问的数据——订单簿、持仓、风险参数——都应该放在内存里。而且要用大页内存和内存绑定技术,避免TLB miss和NUMA跨节点访问。
一个小技巧:我曾经在项目中用DPDK的rte_malloc分配内存,并绑定到特定的CPU核心和内存通道上。这样做的目的是保证数据访问的延迟是确定的,不会因为内存控制器竞争而产生抖动。嗯,细节决定成败。
知识体系总览
下面这张图,是我对本章知识体系的总结。你可以把它当作一张地图,随时回来对照。
好了,这一章的内容就到这里。硬件加速不是银弹,但它是低延迟交易系统里不可或缺的一环。从FPGA到网卡卸载,从选型到存储,每一步都需要你根据实际场景做权衡。记住,没有最好的方案,只有最合适的方案。