硬件选型:CPU、网卡、交换机、FPGA的延迟特性对比与选型策略
做微结构交易这些年,我最大的感触就是:硬件选型不是技术问题,是哲学问题。你想想看,每一纳秒的延迟都意味着真金白银,但每一分钱又得花在刀刃上。今天我就把CPU、网卡、交换机、FPGA这四类核心硬件的延迟特性掰开揉碎了讲,顺便聊聊我踩过的坑。
一、CPU:通用计算的“慢郎中”
CPU的延迟特性,说白了就是“什么都能干,但什么都不精”。我见过不少团队上来就砸钱买顶级Xeon Platinum,结果发现延迟瓶颈根本不在CPU上。
核心延迟数据(实测均值):
- L1缓存命中:~1ns
- L2缓存命中:~4ns
- L3缓存命中:~12ns
- 内存访问(NUMA本地):~80ns
- 系统调用(如sendmsg):~500ns-1μs
我个人习惯把CPU选型分成三个维度:主频、缓存架构、NUMA拓扑。主频当然越高越好,但别只看Boost频率——全核满载频率才是关键。我记得有一次测试,某款CPU单核能跑到5.2GHz,但四核全开直接掉到4.0GHz,这种“虚标”在交易场景里特别坑。
避坑指南:我曾经在选型时忽略了L3缓存的slice架构。有些CPU的L3是分布式的,跨slice访问延迟会翻倍。如果你跑的是多线程策略,务必确认缓存一致性协议(如MESIF)的延迟表现。
二、网卡:从PCIe到线缆的每一纳秒
网卡是延迟优化的主战场。我常说,网卡选型就是选“数据搬运工”——搬运工腿脚利索,数据才能跑得快。
先看一张我整理的对比表:
| 网卡类型 | 典型延迟(线速下) | 关键特性 | 适用场景 |
|---|---|---|---|
| 普通千兆网卡 | ~50μs | 标准TCP/IP卸载 | 管理网络 |
| 10G/25G网卡(如Mellanox CX5) | ~5-10μs | RoCEv2、DPDK支持 | 中频交易 |
| Solarflare X2522 | ~1-2μs | 硬件时间戳、TCP直连 | 高频交易 |
| Exablaze(Cisco)FPGA网卡 | ~100ns-500ns | 用户态网络栈、FPGA卸载 | 超高频交易 |
为什么Solarflare这类网卡能跑到1-2μs?说白了就是绕开了操作系统内核。普通网卡收包要走中断、协议栈、socket缓冲区,这一套下来几百纳秒就没了。而Solarflare的TCP直连技术,让用户态应用直接操作网卡硬件队列——嗯,这里要注意,这种模式需要应用层自己处理TCP状态机,开发成本不低。
警告:别迷信“硬件时间戳”这个功能。我遇到过一款网卡,宣称支持PTP硬件时间戳,但实际精度只有±100ns——在微结构交易里,这误差足以让你错过行情。选型时一定要实测PTP同步精度,别只看datasheet。
三、交换机:网络中的“红绿灯”
交换机延迟,说白了就是数据包在交换机里“等红灯”的时间。我见过最夸张的案例:某团队用了三层交换机做行情分发,结果延迟比二层多了2μs——就因为多了一次路由查找。
选型时我重点关注三个指标:
- Cut-through vs Store-and-forward:Cut-through延迟低(~300ns-1μs),但会转发坏包;Store-and-forward延迟高(~3-10μs),但保证数据完整性。交易场景我无脑选Cut-through。
- 端口密度与背板带宽:别只看单端口延迟,当所有端口同时跑满时,背板带宽不够会导致丢包。我习惯留30%的带宽余量。
- 流表大小:OpenFlow交换机如果流表满了,会回退到软件转发——延迟直接飙到毫秒级。我曾经在测试中踩过这个坑,后来强制限制了流表条目数。
实测数据(某主流25G交换机):
- Cut-through模式(64字节包):~450ns
- Store-and-forward模式(64字节包):~3.2μs
- 启用ACL后:~800ns(增加约350ns)
你想想看,如果行情链路里串了3台交换机,每台多花500ns,整体就多了1.5μs——这还没算线缆延迟。所以我的原则是:能用直连就别用交换机,必须用交换机就选最低延迟型号。
四、FPGA:硬件的“手术刀”
FPGA的延迟优势,说白了就是把软件逻辑变成了硬件电路。我做过一个对比:同样的行情解析逻辑,在CPU上跑需要2μs,在FPGA上只需要50ns——差了40倍。
但FPGA选型有个大坑:不是所有FPGA都适合交易。我见过有人用Xilinx Artix-7做行情解码,结果逻辑资源不够,只能降频运行——延迟反而比CPU还高。
选型时我关注这几点:
- SerDes速率:至少支持10G/25G,否则网口会成为瓶颈
- DSP Slice数量:做行情解码(如解码、校验)需要大量DSP
- BRAM/URAM容量:行情数据缓存、查找表都需要片上存储
- 开发工具链:Vivado vs Quartus vs Libero,我个人更习惯Vivado,但Intel的Arria系列在延迟一致性上表现更好
个人经验:我曾经用Xilinx Kintex-7做了一版行情解码,延迟做到80ns。但后来发现,当行情数据包长度超过1500字节时,内部FIFO会溢出——因为BRAM配置小了。后来换用UltraScale+,BRAM翻倍,问题才解决。所以选型时一定要留足余量。
五、选型策略:从延迟预算倒推
说了这么多,到底怎么选?我的方法是先定延迟预算,再倒推硬件。
举个例子:你的策略要求从行情到达网口到发出订单,总延迟不超过5μs。那么:
- 网卡+驱动:预留1μs(用Solarflare或Exablaze)
- 交换机:预留0.5μs(用Cut-through模式,直连最好)
- CPU处理:预留2μs(用DPDK+用户态协议栈)
- FPGA加速:预留1μs(如果行情解码复杂)
- 余量:0.5μs
你看,这样一算,每个环节的选型目标就清晰了。如果预算不够,就砍FPGA,把CPU处理时间压缩到3μs——但代价是开发难度翻倍。
我的选型优先级(从高到低):
- 网卡:延迟最低的(Solarflare/Exablaze)
- 交换机:Cut-through + 低端口延迟
- CPU:高主频 + 大L3缓存 + 低NUMA延迟
- FPGA:按需选型,不盲目上
最后说一句:硬件选型没有银弹。我见过用FPGA把延迟压到100ns的团队,也见过用普通网卡+DPDK做到2μs的团队——关键是你对延迟的理解有多深。嗯,今天就聊到这,下次我们讲讲如何用DPDK把网卡延迟再砍一刀。