网络硬件选型:Solarflare vs Mellanox 网卡对比、PCIe通道优化、CPU与网卡亲和性绑定
做高频交易的人都知道,网卡选型这件事,说白了就是「抢时间」。我见过太多团队,代码优化到极致,结果被一块不合适的网卡拖了后腿。今天咱们就聊聊Solarflare和Mellanox这两家的网卡,以及怎么把PCIe通道和CPU亲和性玩明白。
一、Solarflare vs Mellanox:两大阵营的硬碰硬
这两家我都用过,各有各的脾气。先看个对比表,心里有个底:
| 对比维度 | Solarflare | Mellanox |
|---|---|---|
| 典型型号 | SFN8522、X2522 | ConnectX-5、ConnectX-6 |
| 延迟表现 | 极低,约1-2微秒 | 低,约2-3微秒 |
| 用户态网络栈 | OpenOnload(成熟稳定) | VMA(性能不错,但配置稍复杂) |
| FPGA可编程性 | 内置FPGA,可自定义逻辑 | 部分型号支持,但生态不如Solarflare |
| 驱动成熟度 | 非常成熟,文档齐全 | 成熟,但社区支持略弱 |
| 价格 | 偏高 | 中等 |
我个人习惯,如果做期权做市,首选Solarflare。为什么?因为它的OpenOnload库可以直接绕过内核,把网络数据包送到用户态。我曾在项目中遇到过,同样的策略代码,从Mellanox换到Solarflare,延迟直接降了30%。
核心结论:Solarflare在极致延迟场景下略胜一筹,Mellanox在吞吐量和性价比上更有优势。做市商选Solarflare,做高频统计套利可以选Mellanox。
二、PCIe通道优化:别让总线成为瓶颈
网卡选好了,插到主板上就完事了?没那么简单。PCIe通道的配置,直接影响网卡能不能跑满。
你想想看,一张100G的网卡,如果插在PCIe 3.0 x8的槽上,理论带宽只有约8GB/s,根本喂不饱。我建议至少用PCIe 3.0 x16或PCIe 4.0 x8。
这里有几个实战要点:
- 插槽选择:优先使用直连CPU的PCIe插槽,不要走PCH(芯片组)桥接。PCH会增加约200-300纳秒的延迟。
- 通道分配:如果主板有多个PCIe插槽,把网卡插在第一个或第二个槽(通常是CPU直连)。
- BIOS设置:关闭不必要的PCIe节能选项,比如ASPM(主动电源状态管理)。我吃过这个亏,ASPM开着,延迟偶尔会跳变到10微秒以上。
避坑指南:我曾经遇到过一块主板,插上Solarflare网卡后,延迟忽高忽低。查了两天才发现,是BIOS里把PCIe链路速度设成了自动协商。手动锁定到Gen3后,问题解决。
三、CPU与网卡亲和性绑定:把数据留在本地
网卡收到数据包,要交给CPU处理。如果网卡中断落在远端CPU上,数据还得跨NUMA节点传输,延迟直接翻倍。
怎么做?核心就一句话:让网卡和CPU待在同一个NUMA节点上。
具体步骤:
- 用
lspci -v查看网卡所在的PCIe总线,确定它属于哪个NUMA节点。 - 用
numactl --hardware查看CPU和内存的NUMA拓扑。 - 把网卡中断绑定到同一NUMA节点的CPU核心上。
举个例子,假设网卡在NUMA节点0,我们可以这样绑定中断:
# 查看网卡中断号
cat /proc/interrupts | grep eth0
# 绑定中断到NUMA0的CPU核心(比如核心0-7)
echo 0f > /proc/irq/<中断号>/smp_affinity
嗯,这里要注意,smp_affinity 的值是十六进制掩码。比如 0f 表示核心0-3。我习惯用 ff 表示核心0-7,但别贪多,绑定太多核心反而会增加缓存抖动。
小技巧:如果使用Solarflare的OpenOnload,它自带CPU亲和性管理。你可以在环境变量里设置 EF_CPU_AFFINITY=0-3,让网卡自动把数据送到指定核心。
四、一张图看懂整体架构
说了这么多,咱们用一张SVG图把整个链路串起来:
五、实战中的几个坑
最后分享几个我踩过的坑,希望能帮你省点时间:
- 中断均衡别乱开:Linux默认的irqbalance服务,在高频场景下反而会打乱亲和性。我建议直接关掉,手动绑定。
- 网卡固件版本:Solarflare的固件更新挺频繁的。我遇到过旧固件在极端流量下丢包,升级后就好了。
- 散热问题:100G网卡发热量不小,尤其是Solarflare带FPGA的型号。机箱风道没做好,网卡温度一高,延迟就开始飘。
嗯,硬件选型和优化这部分,其实没有银弹。关键是根据自己的策略特点,找到最合适的组合。我个人的经验是,先拿Solarflare搭一套原型,跑通了再考虑要不要换Mellanox降成本。