ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

期货低延迟网络实战:InfiniBand与RDMA关键技术与调优

期货低延迟网络实战:InfiniBand与RDMA关键技术与调优 简介Mellanox期货行业InfiniBand解决方案是一份面向期货公司及金融交易场景的技术文档系统介绍如何通过InfiniBand高速互连技术降低交易系统延迟、提升并发能力与运行稳定性。内容从InfiniBand技术概述入手重点解析RDMA与IPoIB两种实现方式指出该方案可使交易延时最高降低90%以上IPoIB版本无需修改现有交易软件即可透明接入同时强调方案兼容IBM、HP、DELL、浪潮、曙光、联想等主流服务器覆盖不同规模期货公司对低延时、高并发环境的部署需求。资源包内共1个PDF文件大小约2.56MB便于直接阅读与保存。目前已有240人学习适合关注金融交易基础设施、高性能计算及网络互连优化的技术人员参考可帮助读者快速理解Mellanox方案的架构优势、关键技术路径与实际落地价值。1. 期货行业的低延迟竞赛一张 IB 网卡就是起跑线Mellanox 期货行业 InfiniBand 解决方案落点就一个字快。期货柜台与交易所之间的订单往返延迟每多一微秒高频策略的成交概率就差一个身位。这套方案把 InfiniBand 协议里的 RDMA、内核旁路、无损链路三个能力直接压在交易链路上行情分发、订单申报、风控校验都能吃到红利。适合极速柜台运维、量化团队网络工程师、以及正在评估从以太网迁移到 IB 的架构负责人阅读。下面按从选型到交付的顺序把方案拆开讲清楚。2. InfiniBand 协议凭什么进期货机房四个技术点对应四类业务2.1 RDMA 与内核旁路订单路径上省掉的三次拷贝传统 TCP 路径下一笔订单从用户态发出去要经过 socket 缓冲区、内核协议栈、网卡驱动再进网卡。数据在用户态和内核态之间至少拷贝两次每拷贝一次就多几百纳秒加上协议栈处理微秒量级就这么花掉了。IB 的 RDMA 直接把用户态内存注册给网卡网卡硬件自己完成 DMA 读写CPU 不参与数据搬运内核也不用进。期货订单报文通常就几百字节延迟大头不在报文长度而在路径次数。RDMA 把路径剪短订单从应用发出到网卡线缆延迟能压到 1~2μs 量级。我一般这样跟业务方解释原来订单要走市内道路红绿灯多RDMA 等于修了条隧道入口和出口都在你院子里。这里有个容易被忽视的点IB 的 RDMA 不是简单的“网卡卸载”它把传输层语义也下沉到硬件。QP队列对创建、发送、完成通知全部走用户态 verbs 接口应用不需要陷入内核去发起一次发送。这意味着延迟分布更集中抖动更小。对期货柜台这种对 p99 延迟敏感的系统抖动小往往比平均延迟低更值钱。2.2 无损网络与确定性延迟行情广播不丢包的底气以太网在拥塞时选择丢包靠上层 TCP 重传兜底。期货行情是 UDP 多播没有重传机制丢一个包行情就缺一个片段。IB 链路层用的是基于信用credit的流控交换机端口之间的收发双方先协商好缓冲信用发多少取决于对方有多少接收缓冲靠这种机制做到链路无丢包。行情多播在 IB 里是协议原生支持的能力一张网卡加入多播组交换机按组复制报文不需要像以太网那样部署 IGMP snooping、PIM 之类的协议栈。对于期货公司同时接收多家交易所行情的场景IB 多播天然比以太网省心确定性也更强。不过要注意IB 无损是链路层面的不代表应用层一定不丢。接收端网卡缓冲溢出、QP 队列满一样会丢报文。所以方案里通常会要求行情服务器把接收队列调大或者开 SR-IOV 给关键进程独占网卡队列。这块属于“买了无损链路还得把家门口的路修好”的范畴后面第四章会讲具体参数。2.3 InfiniBand 协议的分层LRH、BTH 与多播组在交易场景的角色IB 报文头部和 TCP/IP 不太一样交易场景里要认识三个关键字段。LRH本地路由头负责子网内从端口到端口的转发交换机只看它就能做快速转发BTH基础传输头携带 QP 号和 PKeyQP 号决定报文交给哪个队列对PKey 决定这个分区允不允许通信GRH 在跨子网场景才会出现期货机房单子网部署基本用不到。订单流向一般采用可靠连接RC保证报文顺序和确认行情接收用得比较多的是不可靠数据报UD配合多播组。实践里最容易踩的坑是把 RC 和 UD 的语义搞混RC 有确认和重传延迟会略高但可靠QP 之间是一对一建连UD 无确认延迟低但丢了就只能等下一次行情而且报文有 MTU 上限。给业务方的建议通常是订单走 RC行情走 UD各司其职。还有一种动态连接传输DCT是面向多对多通信的优化主要用在存储集群这类场景。期货交易网的流量模型以少量固定连接为主用 RC 就够了没必要上 DCT 增加排查复杂度。2.4 InfiniBand 与 RoCE 的选型边界为什么期货机房偏爱 IBRoCE 是把 RDMA 搬到以太网上跑省一条专用网络但代价是要靠 PFC 和 ETS 把以太网“拧成”无损参数调起来非常敏感跨交换机跳数一多PFC 死锁、缓存耗尽这类问题就开始冒头。IB 协议从设计第一天就是无损的链路级流控、VL 隔离、SL 优先级都是原生的不需要额外调教。期货交易网的流量模型特点是节点数不多但延迟要求极高且行情洪峰时的流量突发明显。IB 的确定性在这种场景下比 RoCE 更让人放心。我接触的期货公司核心交易网基本都是 IB管理网、办公网留以太网两层物理隔离谁也别拖累谁。这里说的隔离是物理隔离不是 VLAN 逻辑隔离——交易网的任何抖动都不能被办公网流量影响。3. 搭一套期货 IB 交易网的落地步骤拓扑、子网管理器与分区3.1 两级拓扑怎么定先从订单量和行情速率反推期货公司核心机房的 IB 网络规模一般不会太大几十个节点为主。我一般先列节点清单交易前置机、行情服务器、风控节点、归档存储。然后反推端口数每台服务器一张 ConnectX 系列 IB 网卡一个口行情服务器流量大可以升级到双口卡做冗余。两级 fat-tree 是常见做法两台 spine 做核心leaf 按功能分组接入。交易和行情分在不同 leaf 下物理上先隔离一层。收敛比在交易网里我一般做到 1:1不超卖因为行情洪峰时刻任何一条上行链路打满都会拖累整条路径的排队延迟。下面是期货机房常见的节点规模参考节点类型典型数量网卡速率流量特征交易前置10~30 台100Gb/sEDR小报文、延迟敏感行情服务器5~10 台100Gb/sEDR多播、带宽敏感风控节点5~10 台100Gb/s混合流量归档存储2~4 台100Gb/s大块连续写入这个规模下两台 leaf 接入交易前置就够了行情服务器可以单独挂一台 leaf避免和订单流量共享接入端口。spine 之间要不要互联看 leaf 数量四台 leaf 以内互联的必要性不大。拓扑越简单SM 计算路由的时间越短故障排查的路径也越短这是我做期货项目特别在意的一点。3.2 子网管理器就是 IB 网络的“交警”部署与主备IB 子网必须有 Subnet Manager 才能工作它的职责是发现拓扑、给每个端口分配 LID、计算路由表、监控链路状态。OpenSM 是开源参考实现Mellanox 的 UFM 是商业化版本带图形界面和 API。小规模期货机房用 OpenSM 足够几十个节点完全跑得动。主备 SM 部署是标配。注意一点主 SM 和备 SM 的配置文件要完全一致否则切换时会重算路径行情多播必然中断几秒。用 UFM 的场景可以开它的高可用插件切换更快。OpenSM 场景我会把配置目录纳入版本管理每次变更都提交、比对、留档。日常巡检命令如下# 查询当前子网管理器的 LID 和 GUID和备机比对就知道谁是活的 smpquery sminfo # 查看所有 IB 端口状态State 必须是 ActiveRate 要和交换机协商一致 ibstat | grep -E State|Ratesmpquery sminfo 的输出里能直接看到主 SM 所在的端口 LID备机上跑同样命令做对比即可。ibstat 会列出本机所有 IB 网卡和端口State 为 Active、Physical state 为 LinkUp 才算健康。Rate 那列如果显示 100Gb/sEDR说明跑满了协商速率如果掉到 40Gb/s 就要怀疑线缆或者光模块问题。3.3 分区与 PKey把行情、交易、管理流量隔开IB 的分区类似以太网的 VLAN用 16 位的 PKey 标识。一个节点可以属于多个分区成员类型分 full 和 limited。full 成员之间可以互访limited 只能访问 full 不能访问其他 limited。交易网的隔离就靠它实现。空跑一个全网互通的大分区看着省事实际是把故障域和广播域都交给了交换机不出事还好一出就是一个广播风暴打崩全部交易链路。以 OpenSM 的 partition.conf 为例按订单、行情、管理三类流量划分的做法如下# /etc/opensm/partition.conf # 默认分区所有节点都会带上防止配置错误导致节点失联 Default0x7fff, 默认分区: ALLfull; # 交易分区交易前置与风控节点互通 PKEY0x0001, TRADE: 交易前置1full 交易前置2full 风控full; # 行情分区行情服务器做 full交易前置只收不发做 limited PKEY0x0002, MDATA: 行情服务器full 交易前置1limited 交易前置2limited; # 管理分区管理节点可以访问所有节点普通节点之间不能互访 PKEY0x0003, MGMT: 管理节点full ALLlimited;第一行是默认分区保证所有人都在一个基本平面里防止分区配错导致节点完全失联。交易分区只放订单和风控流量风控节点必须实时看订单所以放进来。行情分区里交易前置是 limited 成员能收行情但不能往分区里发避免误发污染行情广播。管理分区给运维节点保留了全通权限普通节点之间依旧隔离。配置改动后要重启 opensm 才能生效命令是 systemctl restart opensm。改分区这种事我建议安排在交易日收盘后的窗口期做留足回滚时间盘中改分区属于给自己找事故。4. 交易链路调参MTU、服务等级与流控是延迟三件套4.1 MTU 与消息大小不是越大越好IB 的 MTU 支持 256 到 4096 字节路径 MTU 由端口协商决定。期货订单报文一般几百字节MTU 对单笔订单延迟的影响其实很小真正的影响在行情分发一个大快照报文超过 MTU 时会被拆成多个包重组会增加接收端开销拆包本身也会放大交换机的处理延迟。实践里我一般把链路 MTU 配到 2048理由有两个一是覆盖绝大多数订单和行情报文不需要拆包二是 4096 在部分交换芯片上会增加缓冲占用延迟反而会略高。可以用 ibv_devinfo 确认当前网卡的 active_mtu# 查看网卡当前 MTU、端口状态和链路速率 ibv_devinfo -d mlx5_0 | grep -E active_mtu|phys_state|state输出里 active_mtu 显示 2048 就是生效了。要注意 ibv_devinfo 看的是网卡侧协商结果如果交换机侧配的 MTU 更小实际路径 MTU 会以小的为准。所以改 MTU 时交换机和管理器侧要一起核对否则就会出现“网卡显示 2048实际转发还是老的 MTU”这种半生效状态。4.2 服务等级与虚拟通道给订单流量留一条快车道IB 的服务等级SL有 0~15 共 16 级交换机再把 SL 映射到虚拟通道VL。VL 才是真正的硬件队列不同 VL 之间互相隔离一个 VL 拥塞不会拖垮另一个。交易网里我会把流量分成三档流量类型SL 建议VL 建议说明订单申报33最高优先级拥塞时优先放行行情接收22高带宽允许短时排队管理/备份00默认等级带宽最低SL 的分配要靠 OpenSM 的 qos-policy 配置也可以用 libibverbs 在应用侧给 QP 指定 SL。这里有个易错点SL 和 VL 不是一回事。SL 是端到端的服务等级是发给交换机的“标签”VL 是每跳的硬件队列交换机根据 SL2VL 映射表来转发。链路拥塞时真正起作用的是 VL 的调度权重。配置完成后别急着上线先把 ibdiagnet 跑一遍确认 SL2VL 映射下发正常。很多时候业务方反馈“SL 配了没用”查下来都是因为交换机端口上的映射表没刷新OpenSM 没重启或者 QoS 策略文件路径配错了。4.3 内存锁页与队列深度RDMA 应用侧的隐藏参数RDMA 通信前要把用户态内存注册给网卡注册的内存会锁定在物理内存里不允许换出。Linux 默认的 memlock 限制通常是 64KB注册一个稍大的缓冲区就失败。我见过几次交易进程启动时报 ibv_reg_mr 失败查到最后都是 ulimit -l 没放开。# 临时放开当前 shell 的内存锁页限制 ulimit -l unlimited # 持久化配置写入 /etc/security/limits.conf trading_user soft memlock unlimited trading_user hard memlock unlimited改完 limits.conf 要重新登录或者重启进程才生效。很多团队只改了这个文件却没发现 /etc/security/limits.d/ 下面还有别的配置覆盖了同名项导致始终不生效。另一个隐藏参数是 QP 深度发送队列深度太小行情洪峰时会频繁触发队满太大又浪费内存。一般按行情峰值速率的 2 倍来算64 到 128 的队列深度在期货场景足够。还有个容易忽略的是大页内存。部分极速柜台会用大页做行情缓冲如果 IB 网卡注册的是大页内存要确保系统的大页预留足够否则进程起来半个小时后内存碎片出来注册失败的概率会明显上升。这类问题很难从日志里一眼定位属于典型的“配置看着都对跑着跑着就翻车”。5. 期货 IB 网络落地避坑5 个让链路翻车的真实场景5.1 行情洪峰时订单延迟从 2μs 跳到 20μs现象连续交易时段一开盘行情广播速率上去订单通道的延迟从平时的 2μs 毛刺到 20μs策略端直接开始报错。 原因订单和行情流量在交换机上共享同一个 VL行情多播把队列占满订单报文排队等调度。 解决按上一章的方案划分 SL/VL订单流量跑独立的高优先级 VL同时在行情服务器网卡侧做限速别让突发多播打满上行。调完还不行就物理隔离订单和行情各走一台 leaf 交换机用空间换确定性。5.2 升级固件后端口停在 INIT链路起不来现象给 ConnectX 网卡升级固件重启后 ibstat 看到 State 变成 INITPhysical state 不是 LinkUp。 原因多数是网卡固件版本和交换机固件或 MLNX_OFED 驱动版本不匹配速率协商失败少数是之前手动固定过速率新固件不认老配置。 解决先查固件兼容性矩阵把驱动也升到配套版本如果之前配了固定速率先改回自适应等链路协商成功后再固定。最稳妥的回滚方式是恢复到上一个固件镜像然后重新加载驱动。这个操作一定要在交易时段外做至少留出半小时回滚窗口。5.3 SM 主备切换后全网重算路径行情中断几秒现象主 SM 所在服务器宕机备 SM 接管后所有端口的 LID 和路由表重新计算行情多播中断了 3~5 秒。 原因备 SM 的 opensm.conf 和 partition.conf 与主 SM 不一致接管后按自己的配置重算拓扑或者备 SM 没有配置成 standby 模式一直处于冷备状态。 解决把两台 SM 的配置目录纳入同一个版本库每次改动强制同步备 SM 按 standby 模式启动减少接管时的重算范围。更省心的做法是上 UFM 的高可用插件切换时间能压到秒级以内。这类问题最怕的是“备 SM 从没接过管”所以每个季度要做一次主备切换演练真出事儿的时候才知道配置漂移有多严重。5.4 交易进程启动报 ibv_reg_mr Failed内存注册失败现象柜台进程迁移到 IB 后每次启动时偶发报错日志里是 ibv_reg_mr failed无法分配内存。 原因ulimit -l 内存锁页限制太严进程注册 RDMA 缓冲区时被内核拒绝多进程共存时内存碎片加剧了失败概率。 解决按第四章的 limits.conf 配置放开 memlock同时检查 limits.d 下面有没有其他配置覆盖。如果还报错用 strace 跟一下进程看是不是启动参数里显示的锁页数量超过了物理内存的一半。柜台进程一般会对齐到 64MB 的整数倍去注册内存物理内存不够或者开启了 overcommit 限制也会触发同样的报错。5.5 CPU 单核打满导致延迟毛刺中断绑核问题现象订单延迟平时稳定偶尔飚到 50μs 以上查看监控发现某个 CPU 核长时间 100%。 原因IB 网卡的中断和 CQ 事件全部落在同一个核上行情洪峰时中断风暴把核打满订单的 CQ 事件排队等处理。 解决用 irqbalance 或手动把网卡中断绑到多个核同时把交易线程绑定在另外的核上避免线程和中断抢资源。修完之后延迟毛刺基本消失。这里有个玄学点绑核方案在不同内核版本上表现不一样改完一定要重新跑延迟压测不要只看 CPU 使用率降下来了就觉得完事。6. 交付验收怎么做ibdiagnet 健康检查与 perftest 延迟基线6.1 先扫健康ibdiagnet 的必看输出项新网络交付或者每次硬件变更后第一步先跑 ibdiagnet。这个工具会扫描全网拓扑检查链路状态、端口计数器和路由一致性。在 SM 所在节点上执行# 全 fabric 健康扫描输出重定向到日志 ibdiagnet /tmp/ibdiagnet.log 21 # 只关注错误和告警部分 grep -iE error|bad|warn /tmp/ibdiagnet.log | head -30正常输出不应该有 error 级别的项。看到 bad links 时多半是光模块或者线缆问题换线重测就行。ibdiagnet 的端口计数器检查开关在不同版本里不太一样第一次用时先跑 ibdiagnet -h 确认当前版本支持的参数避免白跑一趟。6.2 延迟基线用 ib_send_lat 与 ib_write_bw 打点perftest 是验证 IB 性能的标准工具集MLNX_OFED 自带。我一般用 ib_send_lat 测延迟用 ib_write_bw 测带宽。先在交易服务器上起延迟测试服务端# 交易服务器上起延迟测试报文 64 字节采样 1 万次 ib_send_lat -d mlx5_0 -s 64 -n 10000然后在行情服务器上打向交易服务器# 行情服务器上打向交易服务器的 IPoIB 地址 ib_send_lat -d mlx5_0 -s 64 -n 10000 192.168.1.2客户端需要一个 IP 才能找到服务端这个 IP 通常是 IPoIB 接口ib0的地址数据本身还是走 IB 链路。输出里看 t_avg 和 t_max 两列同机房 IB 端到端延迟应该在 1~3μs 量级超过这个数就要怀疑链路配置。带宽测试同理服务端起 ib_write_bw客户端加服务端 IP 打。存储节点之间跑带宽交易链路只看延迟别搞混。6.3 延迟基线固化成巡检脚本验证做完别急着走把命令写进巡检脚本放到 crontab 里每天早上开盘前跑一次。我的习惯是保留三份基线首次交付的延迟数据、每次变更后的延迟数据、每周巡检的延迟数据。三天数据对比着看链路劣化一眼就能看出来。下面是个最小可用的巡检脚本#!/bin/bash # trade_ib_check.sh每个交易日开盘前跑一次核心 IB 链路巡检 # 配合 cron0 8 * * 1-5 /usr/local/bin/trade_ib_check.sh IB_HOST192.168.1.2 DATE$(date %F) LOG_DIR/var/log/ib_check mkdir -p $LOG_DIR # 1. 端口必须处于 ACTIVE检测到非 ACTIVE 直接告警退出 if ibstatus mlx5_0 | grep -qiE state:.*(INIT|DOWN|ARM); then echo $DATE [CRIT] IB 端口状态异常请检查链路 $LOG_DIR/check.log exit 1 fi # 2. 打延迟基线64 字节小报文5000 次采样 ib_send_lat -d mlx5_0 -s 64 -n 5000 $IB_HOST $LOG_DIR/lat_$DATE.log 21 # 3. 从 perftest 结果里取 t_avg 列倒数第二行之后的第 5 列 awk $164 {avg$5} END {print strftime(%F), avg avg us} \ $LOG_DIR/lat_$DATE.log $LOG_DIR/lat_history.log脚本第 3 步的 awk 取的是 perftest 输出里以 64 开头的数据行、第 5 列的 t_avg。不同版本的表头列序基本稳定但第一次跑的时候还是手工看一眼输出格式再信任这个取值。历史记录文件会越攒越大建议每季度归档一次。告警部分可以对接 Zabbix也可以只输出日志让运维平台抓取按自己团队的监控习惯来。回头看这套方案的落地过程我最大的教训是延迟问题十个里有八个不是网卡慢而是配置绕了远路。拓扑、分区、SL 这些基础打牢了延迟数据自然会说话。希望帮到你。本文还有配套的精品资源点击获取
返回列表