简介:PDF文档为Mellanox面向期货行业提供的InfiniBand解决方案技术资料,目标读者是期货公司信息技术人员、交易系统架构师及网络运维工程师,旨在解决交易场景中延迟高、并发低、稳定性不足等核心问题。文档重点介绍InfiniBand互连技术如何将交易系统延时最高降低90%以上,并详细说明RDMA远程直接内存访问、IPoIB透明网络传输两大关键机制,帮助读者理解低延迟交易网络的实现路径;同时覆盖不同规模期货公司的扩展性需求、运行稳定性保障以及与IBM、HP、DELL、浪潮、曙光、联想等主流服务器厂商的兼容适配,为实际选型与部署提供参考。资源包含1个PDF文件,压缩包大小2.56MB,内容模块涵盖技术概述、交易软件兼容版本、服务器适配说明等,结构清晰,便于按需查阅。已有240人学习该资料,适合作为交易系统网络优化和InfiniBand方案入门的基础文档。
1. 期货低延迟网络为什么绕不过 InfiniBand
做期货系统的人迟早会在某个深夜开始怀疑自己的网卡:行情瞬间涌入,TCP 组播在重传窗口里把微秒级延迟甩到几百微秒;交易前置机的 CPU 被协议栈吃掉一大截;风控链路排队时,没有人能说清延迟是 5 微秒还是 500 微秒。Mellanox 期货行业 InfiniBand 解决方案这类文档,讲的就是把 InfiniBand 这套协议真正搬进托管机房的思路——RDMA 让数据绕过内核直接进应用缓冲区,IB 链路又是无丢包设计的,延迟不靠 TCP 重传兜底,而是靠硬件流控和拥塞控制保证确定性。它适合两类人:一类是被 CTP 或自研柜台延迟逼到墙角的技术负责人,一类是刚接手低延迟交易网络、需要一套可执行方案的运维。这篇文章不假装有 PDF 原文,只按这个方向把选型、落地和排错拆开讲。
2. 期货系统里三类场景的 IB 选型:行情、交易、风控
2.1 行情分发:RDMA 组播终结 TCP 组播的延迟抖动
期货行情和证券行情的力学不一样:一个合约的 tick 由交易所推送出来,到了托管机房之后,所有做市商和交易团队几乎同时要这份数据。最常见的传统做法是 TCP 组播或 UDP 组播,靠应用层拼接增量快照。问题在于,一旦网络出现拥塞,TCP 组播的重传会把「最需要的那笔行情」拖到几十甚至几百毫秒之后,而且这个延迟是发散的,你无法在风控里给一个上界。
InfiniBand 在这个场景里的价值,是把行情流变成 UD(Unreliable Datagram)传输类型下的组播。UD 就是 IB 协议里的无连接数据报,天然支持多播,而且多播复制由交换机硬件完成,不占用 CPU。RDMA 读进应用缓冲区的过程也不需要内核协议栈参与,行情数据的延迟抖动被压缩在硬件队列层面,而不是 TCP 重传定时器层面。我经手过的方案里,同一台行情服务器上 TCP 组播最差延迟和平均延迟的差距,往往差一个数量级;切到 IB UD 组播后,抖动基本收敛到几十微秒以内,具体数值取决于交换机跳数和网卡队列配置,但「发散」这个最致命的问题会消失。
提示:这里不是让你把行情网整个替换掉,期货机房里通常还保留 TCP/IP 管理网,IB 只承载行情和交易流量。真正的收益来自海量小包在 RDMA 通道上的低延迟复制。
2.2 交易通道与风控:RC 连接和 CPU 释放是关键
交易报单是另一个完全不同的流量特征:请求小、频率高、单笔延迟极度敏感。IB 在这里用 RC(Reliable Connection)传输类型,它把可靠性放在硬件链路层,由网卡负责重传和确认,应用层不需要再维护一套丢包重传逻辑。RC 提供的是面向连接的语义,支持 RDMA Send/Recv,也支持 RDMA Write/Read;在期货极速柜台和风控前置之间,最常见的是 Send/Recv 模式,因为报单和回执本身就是请求-响应模型,不需要引入远端读写带来的内存暴露面。
很多团队忽略的一点是:IB 给交易链路带来的最大收益不只是那几微秒延迟,而是 CPU 占用率的下降。同样是处理 5 万笔/秒的报单,传统 socket 路径上每笔报文都要经过系统调用、软中断、协议栈解析,CPU 成为瓶颈之后,延迟就开始排队;RDMA 路径下网卡直接把数据放到用户态内存,应用只需要轮询一个完成队列(CQ),IO 密集型的压力变成了可预测的轮询开销。
风控链路同样受益于这种确定性。期货公司做盘中风控时,需要在极短时间内聚合账户持仓和逐笔成交,这个聚合动作放在 IB 的 RC 链路上比放 TCP 上更稳,因为无需处理重传导致的顺序错乱。顺序保证在 IB 的 RC 里是协议自带的,不需要应用层用序列号去拼装。
2.3 别硬上 InfiniBand 的三类场景
不是所有期货系统都该上 IB。第一类是跨机房、跨地域的交易链路:InfiniBand 的无损特性依赖整个端到端路径上的 IB 交换机,跨城域网的任何一段 IP 转发都足以让延迟不可控,这种情况下用普通 TCP 在高性能专线上反而更务实。第二类是已有成熟极速柜台且延迟瓶颈不在网络层的系统:如果柜台本身撮合耗时已经上百微秒,网络从 20 微秒降到 5 微秒带来边际收益很小,却要承担 IB 专属运维成本。第三类是团队没有专职网络工程师、机房只有几台服务器的场景,IB 的 SM(子网管理器)、PFC 流控、固件升级都是独立于 TCP/IP 的体系,出了问题排障链路人手不足,往往得不偿失。
判断要不要上,我给两个可量化的标准:第一,行情或交易链路上端到端延迟已经做了应用层优化,但还有明显随机抖动;第二,行情节点的 CPU 消耗在行情高峰期超过 50%,且主要花在协议栈处理而不是业务逻辑上。满足任一条,IB 都值得做一次 PoC,用真实的行情 replay 和报单流量去测,而不是先看厂商宣传。
3. 从拓扑到子网管理器:InfiniBand 网络落地步骤
3.1 拓扑选型:两层脊叶是期货机房的常见答案
InfiniBand 的拓扑方案里,期货行业最常用的是两层脊叶架构:下面一批 leaf 交换机接入服务器网卡,上面 2~4 台 spine 交换机做汇聚。两层就能覆盖托管机房内一个整机柜甚至两个机柜的节点规模,三层 Clos 只有在几百个节点时才有必要,期货现场大部分是几十台服务器,强行上三层只会增加跳数和排障复杂度。
脊叶数量上,我一般建议 spine 至少 2 台,否则 leaf 到 spine 的路径没有冗余,leaf 交换机掉电整片节点失联。leaf 与 spine 之间的连接按收敛比 1:1 配,意味着 leaf 上到 spine 的总带宽要等于下接服务器的带宽。期货流量以低延迟的小报文为主,带宽占用通常不高,但突发组播流量会在瞬间占满队列,收敛比一旦超过 1:2,行情洪峰时的延迟抖动会很明显。
下表是我常用的一套参数基准,适用于 50 节点以下的期货交易集群:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 拓扑 | 两层脊叶 | 端到端最多 2 跳 |
| spine 数量 | 2~4 台 | 至少 2 台,避免单点 |
| leaf 数量 | 2~6 台 | 按端口数扩展 |
| 收敛比 | 1:1 | 保护行情突发流量 |
| 服务器网卡 | ConnectX-5/6,单口 100Gb/s | 低延迟比高带宽更关键 |
3.2 安装 OFED 驱动并配置 ConnectX 网卡
服务器侧的第一步是把 Mellanox 网卡驱动装好。主流方案是安装 MLNX_OFED,它包含内核驱动、libibverbs、opensm 和相关诊断工具。安装前先确认内核版本和发行版,MLNX_OFED 对不同内核版本的匹配很挑剔,硬装容易在模块加载阶段报错。
# 确认当前机器上的 Mellanox 网卡和固件被系统识别 lspci | grep -i mellanox ibstat # 安装 MLNX_OFED,--add-kernel-support 会为当前内核重新编译驱动 sudo ./mlnxofedinstall --add-kernel-support --without-dkms sudo /etc/init.d/openibd restart--add-kernel-support是重点参数,它会让安装脚本探测当前内核并生成匹配的驱动模块,而不是直接使用预编译内核模块;--without-dkms的作用是避免 DKMS 在未来内核升级时自动重建驱动,这能减少由内核升级引发的版本错位问题。安装完成后用ibstat查看端口状态,正常应显示State: Active、Physical state: LinkUp;如果状态一直是Down或Init,先查光模块和线缆,再查 SM 是否已经把端口加入分区。
驱动装完后,建议顺手把mlx5_core模块参数里的日志级别调低,否则固件告警日志会刷满系统日志目录,影响其他问题排查。
3.3 部署子网管理器:主备切换与分区(P_Key)
IB 网络和以太网最大的不同在于,它需要一个子网管理器(SM)来维护全网转发状态。SM 负责发现交换机、分发 LID、计算路由,还要把节点加入或移出分区。没有 SM 的 IB 网络,端口物理上是 LinkUp 的,但协议状态永远无法 Active。生产环境里 SM 不允许单点运行,必须做主备。
常见做法是在两台独立的服务器上跑 opensm,或者用交换机自带的嵌入式 SM 做主,外部节点做备。我倾向于后者:交换机内部 SM 和交换机硬件同生命周期,省去一层外部服务依赖,再配合一台外部 opensm 做 standby。
# 主 SM 节点:生成默认配置并启动 opensm -c /etc/opensm/opensm.conf opensm -F /etc/opensm/opensm.conf # 备 SM 节点:使用不同配置,避免与主节点同时生效 opensm -F /etc/opensm/opensm_standby.conf-c参数用于生成一份可编辑的默认配置文件,-F指定启动时读取的配置文件。两个节点必须使用不同的sm_guid配置,否则备节点无法正确接管;同时要确保主备之间网络互通,opensm 会通过通信协商谁是当前 Master。检查当前 SM 状态可以用ibsm或smquery state,确认只有一个节点处于 Master 状态。
分区是 IB 隔离的手段,类似以太网里的 VLAN,通过 P_Key 实现。期货机房我一般划三个分区:行情分区分发组播行情;交易分区跑 RC 报单链路;管理分区用于带外运维。分区之间默认隔离,网络故障不会在分区间横向传染,这对安全合规和故障隔离都很重要。配置分区时,每个节点要同时设置 P_Key 索引,网卡侧的ibv_devinfo可以看到当前激活的 P_Key 列表。
4. 把微秒级参数调到生产级别:GoS、PFC 与拥塞控制
4.1 用 GoS 和 P_Key 隔离行情流量与交易流量
如果所有流量都挤在同一优先级队列里,行情洪峰会把交易报单的延迟顶上去。InfiniBand 里做流量区分有专门机制:服务等级(SL)和虚拟通道(VL)。SL 是报文头里的标记,VL 是交换机内部的物理缓冲通道,SL 通过映射最终落到不同 VL 上,实现不同流量的优先转发。这套机制组合起来就是 IB 的 QoS,厂商文档里通常叫 GoS(Generic QoS)。
一个比较实用的期货场景映射是这样的:
| 流量类型 | SL 值 | VL 映射 | 用途 |
|---|---|---|---|
| 交易报单 | 2 | VL2 | 最高优先级,延迟最敏感 |
| 行情组播 | 3 | VL3 | 高优先级,但允许少量排队 |
| 存储/备份 | 1 | VL1 | 低优先级,不影响交易 |
| 管理/控制 | 0 | VL0 | 事件通知、SM 报文 |
在 opensm 的 QoS 策略里,关键是SL2VL映射表。我一般会单独维护一份 qos-policy 配置,让 SM 在计算路由时同步下发 QOS 策略:
# /etc/opensm/qos-policy.conf 示意,字段格式按你的 opensm 版本核对 QOS: TRUE SL2VL: 3 SL=0, VL=0 SL=1, VL=1 SL=2, VL=2 SL=3, VL=3这里的SL2VL声明了映射条数,后续每行把一个 SL 映射到具体 VL。配完之后,交换机每个端口都必须预留对应 VL 的 buffer,否则报文会被静默丢弃。同时,应用侧创建 QP 时需要显式指定 SL 值,比如 RDMA 的 Send 操作在ibv_qp_attr里的sl字段写 2,否则会走默认 SL0,和管理的控制流量混在一起,前面的 QoS 映射就白配了。
注意:P_Key 分区解决的是「谁能通」,SL/VL 解决的是「通了之后走哪个队列」。很多团队第一轮只配了 P_Key,延迟抖动还在,就是因为没把交易和行情的 SL 分开。
4.2 拥塞控制参数:不丢包网络的黑匣子必须打开
IB 链路不丢包是优点,但也意味着拥塞时流量不会像 TCP 那样被主动丢弃来触发减速,而是会在交换机 buffer 里排队,一旦 buffer 溢出,PFC 反向压力会传遍整条路径,形成头阻塞,这是 IB 网络延迟突然恶化的最常见原因。所以拥塞控制(Congestion Control)不是可选项,是生产必需项。
Mellanox 交换机支持 IBTA 定义的拥塞控制架构,简单说就是监控端口 buffer 占用,一旦超过阈值,向源端发送拥塞通告,源端网卡按配置降低注入速率。需要调的三个主要参数是:拥塞通告门限(阈值)、最小速率、反馈重传间隔。门限设太低,正常行情流量也会被频繁减速,延迟反而升高;设太高,拥塞已经造成排队才触发,PFC 还是会发生。
经验做法是先跑一轮ibdiagnet看端口 buffer 丢弃计数,把门限从默认值慢慢往下调,观察延迟的 p99 变化,而不是一次给到激进值。这套参数在不同交换机上有不同的命令名称,但调试思路是一样的:每次只动一个变量,配合延迟压测看分位数,不要一上来就同时改三个参数,否则根本分不清是谁的锅。
4.3 自适应路由与哈希:多路径分担避免单链路打满
传统 IB 子网管理器会为每对节点计算一条固定路径,流量即使有多条等价路径也不会自动分摊。对期货这种「行情多播 + 大量小报文单播」的混合流量,固定路径很容易把某一条 leaf-to-spine 链路打满,而另一条闲着。解决的常规手段有两个:一是 opensm 层的多路径路由算法,二是交换机硬件的自适应路由(Adaptive Routing)。
opensm 的路由算法里,fat-tree和up-down是最常用的两种,前者适合正规脊叶拓扑,后者更通用。开启多路径后,SM 会为同一对节点计算出多条路径,并按连接的哈希在报文的某个字段上分流。哈希选什么字段值得琢磨:如果只按 LID 哈希,一个小网段里的 ID 可能集中在少数几条链路上,利用不均衡;按 QP 号哈希能在流粒度上更分散,但对组播不太友好。
自适应路由是 Mellanox 在交换机芯片层面的能力,它能基于端口实时负载决定转发路径,弥补哈希粒度粗糙的问题。需要注意两点:第一,自适应路由需要叶子交换机端到端都支持,混入老型号交换机会自动关闭;第二,开启后要回归验证延迟稳定性,因为它引入的动态选路在理论上可能让报文走不同路径,产生轻微的顺序重排,对状态强相关的交易链路需要谨慎测试。
5. 期货 IB 网络最常见的 5 个翻车现场与排查
5.1 延迟从 3 微秒跳到 300 微秒:PFC 反向压力在作祟
现象:行情行情服务器的发送延迟平时稳定在几微秒,某天下午突然变成几百微秒,过一会儿自己恢复,和行情波动没有明显相关性。
原因:一个非交易节点在跑批量备份,通过 IB 链路把大量数据灌到存储节点。备份流量虽然占带宽不高,但和行情流量共用同一个 VL 队列,把行情报文的队列排在了后面,或者备份流量在某个交换机端口溢出后触发 PFC 反压,传导到行情源端口。
解决:把备份流量降到 SL1,并单独映射到一个低优先级 VL;同时限制备份任务的速率上限。先看perfquery或交换机的端口计数,确认是否存在 pause 帧计数暴涨,再按 4.1 的 QoS 映射表把所有非交易流量移到低优先级的 VL。
5.2 节点重启后找不到 IB 端口:SM 没把它加回来
现象:某台行情服务器维护重启后,ibstat显示State: Down,但光模块和线缆换了也无效,而其他节点正常。
原因:重启期间 SM 发现该端口失效,若分区配置里用了 GUID 白名单,而服务器网卡的 GUID 因为固件复位发生变化,SM 认为这是一张新卡,默认不加进分区,端口就一直处于 Down。
解决:用ibdiagnet导出当前子网 GUID 和分区表,核对分区策略;如果确认是网卡 GUID 变了,需要在 SM 的 pkey 配置文件里更新成员 GUID。生产环境更稳妥的做法是分区成员不用单一 GUID,改成按端口所属交换机范围模糊放行,再在网卡侧用 P_Key 过滤控制实际访问权限。
5.3 PFC 死锁让整网吞吐归零
现象:整条 IB 链路所有节点延迟暴增,任何流量都无法正常完成,交换机端口的 pause 计数在各端口之间互相增长,形成循环等待。
原因:多个端口同时发出 PFC 暂停帧,而暂停的队列又各自阻塞了对方需要释放的资源,形成链路层死锁。常见诱因是路由计算出现环路,或者两个交换机之间的 ISL 链路被配置了不相容的流控策略。
解决:立刻重启该 fabric 的 SM,让路由重算收敛,通常能解除死锁。根因排查要看所有交换机端口的perfquery,寻找 pause 帧计数互相咬合的两个端口对;确认是否是 ISL 端口流控配置不对称。预防层面,尽量避免任何形式的物理环路拓扑,并保持全网同一型号交换机,因为不同代际交换机对 PFC 的 buffer 预留算法不同,最容易引发这种问题。
5.4 RDMA 建链失败但 TCP 正常
现象:TCP 网络上业务互访没问题,但一跑 RDMA 的ib_write_bw就报Connection refused或超时,链路明明Active。
原因:P_Key 不匹配是最常见的,两个节点的网卡处于不同分区,IB 交换机不会转发它们之间的流量,但 LID 路由在 SM 里可能是通的,导致应用层看起来连接正常,实际数据始终到不了对端。
解决:两端分别执行ibv_devinfo -v查看 P_Key table,确认是否包含同一个 P_Key 条目。再对比 SM 的 partition 配置,看两个端口的 GUID 是否在同一个 PKEY 组里。另外检查通信两端的 QP 的 SL 是否一致,QoS 不一致也可能导致极端情况下建链超时。
5.5 升级驱动后性能腰斩
现象:原本ib_write_bw延迟 2 微秒,升级 OFED 后变成 4 微秒,带宽也从满速率掉到一半。
原因:升级后的驱动和网卡固件版本不匹配,固件被降级或重刷到了较低版本,链路层握手协商速率可能降档;更隐蔽的是,升级过程把网卡的 Active Profile 重置,关闭了硬件加解密或 QOS 相关能力。
解决:升级后第一件事不是跑业务,而是用ibstat查看速率是否回到标称值(比如 100Gb/s 的卡不能协商成 50),再用mlxconfig查看网卡配置文档里的 Profile 是否完整。如果确认固件降级,加载匹配的固件版本,然后重跑 perftest 全套基线数据,而不是只测一次带宽就上线。
提示:每次驱动升级前,把当前固件版本、OFED 版本和
ib_write_bw基线结果保存一份。出问题时,第一件事是回滚而不是排查新功能。
6. 上生产验证:用 ib_write_bw 和 qperf 验收延迟与带宽
6.1 延迟验收:pingpong 测试看均值与抖动
网络调完,参数全配齐,最终要过验收关。延迟测试我用两类工具配着看:ib_write_bw测稳定吞吐和 RTT 的中位数,qperf看更接近应用场景的链路往返延迟。它们的共性是直接走 verbs 接口,结果不受上层协议栈影响,能真实反映网卡和交换机层面的能力。
# 节点 A 启动带宽服务端,-d 指定设备,-s 16 表示 16 字节小报文 ib_write_bw -d mlx5_0 -s 16 --report_gbits # 节点 B 连接节点 A,同样的报文大小,测试带宽与延迟 ib_write_bw -d mlx5_0 -s 16 --report_gbits 192.168.1.10-s 16是关键参数,它模拟了期货报单这类小消息的尺寸;如果只测默认 2MB 大消息,得到的是大块 RDMA 传输的性能,和行情、报单场景脱节。--report_gbits让输出以 Gb/s 显示,避免单位换算出错。延迟数据要看结果里的avg和p99,p99 比 avg 更能说明网络是否有抖动。
同机架两台服务器直连交换机的情况下,理想基线是 1~2 微秒级别;跨 leaf 经过 spine 后,通常增加一跳的延迟,p99 一般不超过 5 微秒。如果测出来大幅高于这个区间,回头查 QoS 和拥塞控制参数,大概率问题出在队列优先级而不是物理链路。
6.2 带宽与 CPU 占用:确认收益是否值得投入
带宽测试用于确认链路速率没有因驱动或固件问题降档,验证 100Gb/s 网卡能否跑到标称值:
# 节点 A 和 B 同时用大消息测试,跑满链路 ib_write_bw -d mlx5_0 -s 1048576 --report_gbits 192.168.1.10第二个重点看 CPU 占用。传统 TCP 方式下大流量传输会持续吃掉大量 CPU,IB 的优势之一就是用户态轮询几乎不占用额外内核资源。测试时用top或pidstat观察ib_write_bw进程所在 CPU 的利用率,如果世界占用超过一个核的 30%,说明驱动中断模式没有起作用,或者队列配置不当。
我自己的习惯是,每次验收都记录三个数字:小报文 pingpong 延迟均值、p99、大报文带宽。这三个数字在驱动升级或拓扑变更后会立刻告诉你环境是否回退。曾经有一次费尽心思调完 QoS,延迟中位数达标了,p99 却一直高,最后发现是备 SM 和主 SM 配置里的 SL2VL 映射不一致,验收时恰好主备切换过。从那以后,我把主备配置放在同一份模板里用脚本同步生成,人工维护两份配置文件的做法彻底停掉。这套验证流程走下来,基本能盖住 InfiniBand 网络的大部分坑,希望帮到你。
本文还有配套的精品资源,点击获取