尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

IB网卡虚拟化实践:从驱动安装到SR-IOV与RDMA验证

IB网卡虚拟化实践:从驱动安装到SR-IOV与RDMA验证 IB网卡这玩意儿平时做互联网业务的人可能一辈子都碰不上但只要你进了高性能计算、AI训练集群、分布式存储或者高频交易这些领域它就是绕不开的基本盘。最近我正好把一套 Mellanox ConnectX-5 的 InfiniBand 网卡从裸机环境迁到了虚拟化平台涉及驱动安全升级、固件一致性校验、SR-IOV 直通、虚拟机内 RDMA 通信验证等一整套流程前前后后折腾了小两周踩了不少坑也沉淀出一套目前比较顺手的操作路径。这篇东西就是把这些经验整理出来给准备入门 IB 网络、或者正在纠结怎么把 IB 网卡安全地塞进虚拟机的朋友做参考。先说清楚你读完能拿走什么IB 网卡和普通以太网卡的本质区别、驱动栈怎么分层、MLNX_OFED 装的时候哪些坑必须避开、固件和驱动版本为什么要严格对齐然后是三种虚拟化接入方式的选型逻辑——PCI 直通、SR-IOV、软件模拟各自解决什么问题最后是 KVM 和 ESXi 两套常见环境下的完整配置步骤和排障命令。不管你是机房运维、集群管理员还是搞底层虚拟化研发的这些内容应该都能直接抄作业。1. 先搞清楚 IB 网卡和驱动栈的基本盘1.1 IB 和普通网卡的本质差异InfiniBand 不是以太网的变种它是一套独立的网络体系。如果你习惯用网卡以太网卡的思维方式去理解 IB后面所有配置都会卡住。IB 网络从设计之初就是为高带宽、低延迟、低 CPU 占用率服务的典型场景是 RDMA远程直接内存访问数据从一台机器的内存直接搬到另一台机器的内存不经过操作系统内核协议栈不需要 CPU 逐包拷贝。有一个比较形象的类比以太网像邮政系统每个包裹都要经过收发室的登记、分拣、派送RDMA 像两个办公室之间直接修了一条传送带文件从 A 桌面直接滑到 B 桌面收发室完全不参与。IB 网卡就是这条传送带的基础设施它通过独立的物理链路、交换机和子网管理器Subnet ManagerSM来维持运行而不是靠 IP 和 MAC 那一套。IB 的协议规范可以追溯到 InfiniBand Architecture Specification Vol 1里面定义了物理层、链路层、网络层、传输层的完整体系。平时我们做运维不需要啃规范原文但里面几个核心概念必须清楚LID本地标识符二层地址、GID全球标识符三层地址、QPN队列对编号、PKey分区键相当于 IB 网络的 VLAN。后面虚拟化配置里PKey 和 GID 的坑是最多的。1.2 驱动栈的分层逻辑IB 网卡的驱动和普通网卡差别很大。拿 Mellanox现在叫 NVIDIA Networking的卡来说内核态驱动主要是mlx5_core和mlx5_ib两个模块mlx5_core负责 PCIe 设备管理、中断处理、硬件资源分配mlx5_ib在它之上实现 InfiniBand/RDMA 语义向内核注册ib_device。用户态还有一层libibverbs应用程序通过 Verbs API 直接和网卡硬件交互这也是 RDMA 能绕开内核协议栈的关键。如果你只用ip link看到 IB 网卡有一个ib0接口就以为驱动装好了那是远远不够的。判断 IB 网卡驱动是否真正可用要看三样东西/sys/class/infiniband/下有没有对应的设备节点、ibv_devinfo能不能正常输出端口状态、ibstat能不能看到链路已激活State: Active。只看到网卡接口但没有 Verbs 设备说明mlx5_ib没加载好RDMA 应用照样跑不起来。1.3 为什么不能只装内核模块而是整套 MLNX_OFED很多人第一次接触 IB 网卡驱动会想我不就是装个驱动吗为什么还要下载一个几百 MB 的 MLNX_OFED 包这个问题的答案在于IB 网卡不是靠单个内核模块就能完整工作的。除了内核态驱动还需要用户态的libibverbs、librdmacm、libibumad、opensm子网管理器、perftest性能测试工具、ibutils诊断工具等一整套组件。MLNX_OFED 就是把这些东西打包在一起的发行版它从官方内核的 OFEDOpenFabrics Enterprise Distribution基础上做了大量增强和 bugfix并且针对不同的 Linux 发行版做了适配。我见过有人图省事只从发行版自带仓库装了rdma-core包结果是ibstat能看到设备但跑ib_write_bw性能测试时延迟和带宽明显不对后来排查发现是缺少了厂商对特定硬件 revision 的优化补丁。所以正规做法就是下载对应发行版和内核版本的 MLNX_OFED 包别自己拼装。2. 安全驱动安装与验证的完整流程2.1 安装前的环境检查驱动安装最忌讳的就是不清不楚就往上怼。我一般按这个顺序做检查能在后面省下大量排障时间。第一步确认网卡型号和 firmware 当前版本。系统里执行lspci | grep -i mellanox或者ibstat拿到设备型号和当前固件版本。比如 ConnectX-5、ConnectX-6 这类不同代际的卡支持的驱动版本区间不一样。第二步确认操作系统版本和内核版本。cat /etc/os-release看发行版uname -r看内核。MLNX_OFED 的每个版本都有明确的 OS 支持矩阵比如 5.8 系列对 RHEL 8.x 和 Ubuntu 20.04/22.04 有对应的包内核版本太新或太旧都会导致编译失败或模块加载失败。第三步检查系统里有没有旧版驱动残留。这一步很多人会跳过但恰恰是最容易出问题的。以前装过 OFED 或者系统自带 rdma-core 的机器直接装新包经常出现模块冲突。标准做法是把旧驱动卸载干净。# 如果之前用 MLNX_OFED 安装过用官方 uninstall 脚本 # 路径一般是 /usr/sbin/mlxofed_uninstall sudo /usr/sbin/mlxofed_uninstall --force # 如果系统自带 rdma-core用包管理器移除 # RHEL/CentOS sudo yum remove rdma-core # Ubuntu/Debian sudo apt purge rdma-core # 确认没有 mlx5 相关模块加载 lsmod | grep mlx5 || echo no mlx5 modules loaded注意这里有个细节mlxofed_uninstall执行完之后最好重启一次机器再装新驱动。我遇到过不重启直接装新包结果新老模块在内存里同时存在ibstat显示的设备数量翻倍但实际上只有一个物理端口能通过链路状态检查。重启虽然多花一分钟但是能避免这种玄学问题。2.2 MLNX_OFED 安装的两种方式MLNX_OFED 的安装有三种常见方式rpm包安装、deb包安装、源码编译。前两种对应发行版的包管理器第三种是针对内核版本不在官方预编译列表里的情况。对于 RHEL/CentOS/Rocky 系列下载对应版本的 tgz 包后解压进入目录直接执行tar xzf MLNX_OFED_LINUX-5.8-1.0.1.1-rhel8.3-x86_64.tgz cd MLNX_OFED_LINUX-5.8-1.0.1.1-rhel8.3-x86_64 sudo ./mlnxofedinstall --add-kernel-support # 如果你想跳过固件更新只装驱动可以加 --without-fw-update # 如果你明确知道不需要构建 DKMS 包可以用 --dkms注意--add-kernel-support这个参数的含义当你的内核版本不在 MLNX_OFED 预编译的内核模块列表里时它会尝试从源码编译内核模块。这需要系统安装了内核头文件包kernel-devel 或 linux-headers。编译过程持续 10~20 分钟期间不要中断否则会留下半成品模块。对于 Ubuntu/Debian包管理器会用dkms统一管理内核模块装完以后如果后续升级了内核dkms会自动为新内核重新编译模块这个特性在服务器上非常实用。安装完成后模块并不会自动加载需要手动执行或者重启。我习惯先查看一下模块依赖关系再加载# 查看模块信息 modinfo mlx5_core | head -20 # 加载模块 sudo modprobe mlx5_core sudo modprobe mlx5_ib # 确认加载结果 lsmod | grep mlx5如果一切正常ibstat应该能看到设备。这里有一个容易误判的点新装完驱动后ibstat输出的State: Down不一定是驱动问题因为 IB 网络需要子网管理器opensm运行后端口才会切换到 Active 状态。如果你不确定网络里是否已有 SM可以先手动起一个测试sudo systemctl start opensm sudo ibstat看到State: Active、Physical State: LinkUp驱动链路才算真正起来了。2.3 固件版本一致性的重要性IB 网卡和普通网卡在运维上有个很大区别固件firmware和驱动必须保持版本兼容。不匹配的典型症状是驱动加载报错firmware version mismatch或者dmesg里大量刷mlx5_core 0000:03:00.0: Failed to load firmware。查看和更新固件要用 Mellanox 的mlxup工具。MLNX_OFED 安装包自带的固件目录里通常有对应的 .bin 文件但更稳妥的做法是到官方固件仓库下载匹配你设备型号和当前驱动版本的最新固件。# 查询当前固件版本 sudo mlxup --query # 更新固件需要下载对应型号的 .bin 文件 sudo mlxup -i fw-ConnectX5-rel-16_32_0000-MCX516A-CCA_Ax.bin固件更新是非常危险的操作务必注意三点一是固件更新期间绝对不要断电最好接上 UPS二是更新完必须冷重启reboot有时不会重新加载网卡固件三是多端口网卡固件更新后要确认两个端口都处于可用的 firmware 版本用mlxup --query复查。我做生产环境驱动升级有一个习惯先在一个测试机上完整走一遍流程记录固件更新前后的ibstat、ibv_devinfo输出再铺开到其他机器。因为固件版本一旦不一致集群里不同节点间的 RDMA 通信会表现为间歇性丢包、延迟抖动这种问题排查起来极度痛苦。2.4 驱动的完整性与签名校验安全驱动体现在两个层面一是功能安全驱动不会导致系统崩溃二是供应链安全驱动包没有被篡改。MLNX_OFED 的发布包自带 SHA256 校验文件。下载完成后第一件事就是校验包完整性sha256sum MLNX_OFED_LINUX-5.8-1.0.1.1-rhel8.3-x86_64.tgz # 和官网提供的 checksum 对比确保一致另外从 5.x 版本开始MLNX_OFED 的 RPM 包都带 GPG 签名可以用rpm --checksig验证。如果系统提示签名无法验证就要警惕包是否被替换过。对于安全要求高的生产环境我建议把厂商官方下载页面提供的 checksum 存到本地知识库每次升级时自动比对不给供应链攻击留机会。注意不要在无法确认来源的渠道下载所谓的绿色版破解版驱动IB 网卡驱动和普通驱动不同一个被植入后门的libibverbs库就能让恶意代码绕过内核直接访问远端内存后果比控制一台普通服务器严重得多。2.5 驱动安装后的系统配置驱动装完只是第一步还有几个系统配置不做好IB 网卡就是能亮但不能用的状态。第一内存锁定限制。RDMA 操作需要把内存页锁定在物理内存里mlock不允许换出到 swap。默认的ulimit -l通常是 64KB这远远不够。需要修改/etc/security/limits.conf# 为使用 RDMA 的用户设置无限内存锁定 * soft memlock unlimited * hard memlock unlimited修改后重新登录 shell 才会生效可以用ulimit -l验证输出是否为unlimited。第二调整页面数量。RDMA 通信通常使用大页HugePages来减少 TLB miss但对于中小规模的集群先确认vm.nr_hugepages不是强制要求关键是内存锁限制一定要放开。第三确认内核参数里iommu相关配置。如果你的 IB 网卡要走虚拟化这就是后面的重点宿主机 BIOS 里要开启 VT-d/AMD-Vi同时内核启动参数要加intel_iommuonIntel或amd_iommuonAMD否则后面 PCIe 直通和 SR-IOV 都没法用。3. IB 网卡虚拟化的三种主流方案怎么选3.1 方案对比IB 网卡进虚拟化环境不像普通网卡那样建一个 vSwitch 然后把虚拟网卡接上去就完事了。因为 RDMA 要绕过虚拟化层直接操作硬件所以虚拟化方案选型直接决定了性能和功能边界。业内现在主流的有三种方案原理性能灵活性适用场景PCIe 直通Passthrough把整个物理网卡 PCIe 功能分配给单个 VM接近物理机差一卡一 VM无法共享单虚拟机需要独占 IB 网卡如数据库、存储网关SR-IOV 虚拟功能VF物理网卡硬件虚拟出多个 VF每个 VF 独立 DMA 和中断较高接近物理机好一张卡可分成多个 VF 给多个 VM多数生产场景多租户共享 IB 网络软件模拟/虚拟 RDMAvRDMA通过 Hypervisor 软件层转发低增加延迟高不依赖硬件开发和测试环境功能验证3.2 PCIe 直通什么时候选它PCIe 直通最适合的需求是这台虚拟机就是这台 IB 网卡的唯一使用者且你不想引入 SR-IOV 带来的配置复杂度也不想和别的租户共享网卡。直通的优点在于驱动栈最简单。VM 里直接装厂商驱动看到的设备就是一张完整的物理 IB 网卡所有 RDMA 特性都可用性能和物理机几乎没有差异。缺点是完全不支持热迁移live migration因为物理设备被绑定在特定 VM 上了virsh migrate的时候硬件没法跟着走。另外一张物理卡只能给一个 VM 用多租户场景下成本太高。3.3 SR-IOV生产环境的标准答案SR-IOV 是 Single Root I/O Virtualization 的缩写核心思想是让物理网卡自己虚拟出若干个轻量级的 PCIe 功能——PFPhysical Function物理功能和 VFVirtual Function虚拟功能。PF 是完整功能的物理端口VF 是精简功能的虚拟端口每个 VF 有自己独立的 DMA 通道、中断和队列资源可以直接分配给不同的虚拟机。在 IB 网卡场景下SR-IOV 是绝对的主力。因为一张 ConnectX-5 双端口卡可以分出几十个 VF每个虚拟机分一个 VF就相当于每台虚拟机都有了一张独立的 IB 网卡而宿主机还保留 PF 用于管理。这样既保证了隔离性又充分利用了硬件资源。需要注意的一点IB 网卡的 SR-IOV 和以太网卡有个区别——IB 本身就是面向多租户设计的PKey 分区机制天然就是为了隔离流量。所以 SR-IOV IB 是非常成熟的组合Mellanox 的驱动原生支持这种用法不需要额外插件。3.4 虚拟 RDMA 和软件方案软件模拟方案我只建议在实验室和开发环境用。比如通过 Open vSwitch 把 IB 流量封装成以太网或 RoCE 转发或者用rxdma之类的虚拟化框架做后端。好处是灵活不依赖具体硬件但延迟会显著增加——RDMA 的卖点就是低延迟软件转发一折腾几十微秒的延迟变成几百微秒在高性能场景下没法接受。除非你只是想跑通代码逻辑否则不推荐生产环境使用。3.5 选型决策建议从我的实践经验来看核心决策依据就两条一是物理机数量和 IB 卡数量是否充足卡多就直通卡少就上 SR-IOV二是业务是否需要热迁移如果虚拟机要在宿主机之间漂移那只能走 SR-IOV 不绑定物理设备的方案。对于大多数生产集群我的建议是控制面和管理面走以太网虚拟交换机数据面 RDMA 走 SR-IOV 的 VF。把两类流量分开既保证了管理灵活性又不牺牲高性能网络的性能优势。4. KVM 环境下 IB 网卡 SR-IOV 虚拟化实操4.1 BIOS 与内核参数准备KVM 场景下SR-IOV 对宿主机的要求很明确CPU 支持 VT-dIntel或 AMD-ViAMDBIOS 里Intel VT-d或IOMMU必须开启。这块忘了开后面所有配置都会失败。确认 BIOS 开启后修改内核启动参数。RHEL/CentOS/Rocky 系列编辑/etc/default/grubGRUB_CMDLINE_LINUX... intel_iommuon iommupt ...iommupt参数的意思是让 IOMMU 以 passthrough 模式运行减少 DMA 地址转换的开销对 RDMA 性能友好。修改后重新生成 grub 配置并重启sudo grub2-mkconfig -o /boot/grub2/grub.cfg sudo rebootUbuntu 系的路径略有差异是update-grub命令。重启后验证dmesg | grep -i -e DMAR -e IOMMU # 应该能看到 DMAR: IOMMU enabled 之类的输出4.2 宿主机创建 VFVF 的创建方式取决于你使用的固件配置工具还是直接 sysfs 接口。对于 Mellanox 网卡推荐先用mlxconfig确认 SR-IOV 功能已启用# 查看网卡的 SR-IOV 配置 sudo mlxconfig -d /dev/mst/mt4119_pciconf0 q | grep -i sriov # 输出 SRIOV_EN1 表示已开启NUM_OF_VFS 是默认分配的 VF 数量如果 SRIOV_EN 不是 1执行sudo mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN1 NUM_OF_VFS8 sudo reboot注意mlxconfig的改动需要重启网卡固件或整机重启才能生效。重启后可以通过 sysfs 动态调整 VF 数量# 查看当前 VF 数量 cat /sys/class/infiniband/mlx5_0/device/sriov_numvfs # 设置 VF 数量为 4 echo 4 | sudo tee /sys/class/infiniband/mlx5_0/device/sriov_numvfs # 查看生成的 VF 对应的 PCIe 地址 lspci | grep -i mellanox生成的 VF 会显示在lspci里通常 PCIe 地址是宿主机物理 PCIe 总线下的子功能每个 VF 都有独立的 BDFBus:Device.Function。注意sriov_numvfs这个值在宿主机重启后会恢复为 0需要把它写入开机自启脚本或者用 udev 规则固化。一个常见做法是把echo 4 ...放到/etc/rc.local或者写一个 systemd service。4.3 虚拟机 XML 配置与 PCI 设备分配创建好 VF 后接下来就是把它分配给虚拟机。KVM 场景下用 libvirt通过修改虚拟机的 XML 配置来添加 hostdev 设备。先用virsh edit编辑目标虚拟机在devices段里添加hostdev modesubsystem typepci managedyes source address domain0x0000 bus0x03 slot0x10 function0x0/ /source /hostdev这里的bus、slot、function就是上一步lspci里看到的 VF 的 PCIe 地址。managedyes表示让 libvirt 自动处理 VF 的驱动绑定和热插拔推荐开启能省掉很多手动driverctl操作的麻烦。如果虚拟机已经在运行需要关机再修改配置virsh edit后重启虚拟机。对于正在运行的虚拟机可以用virsh attach-device动态添加但 IB 网卡的 VF 涉及 DMA 资源分配动态添加偶尔会有中断亲和性问题生产建议还是静态配置。4.4 虚拟机内部驱动安装与网络配置虚拟机启动后在 VM 内部看到的是一张完整的 Mellanox 网卡。这里注意虚拟机的操作系统也要安装对应版本的 MLNX_OFED 驱动步骤和前面物理机安装一样。装完驱动后用ibstat检查链路状态。如果虚拟机的 VF 端口显示State: Active说明底层子网管理已经为这个 VF 分配了 LID如果State: Down大概率是 IB 子网里的 PKey 配置问题见 4.5。配置 IP 和以太网卡类似编辑/etc/sysconfig/network-scripts/ifcfg-ib0RHEL 系DEVICEib0 BOOTPROTOstatic IPADDR10.0.0.20 NETMASK255.255.0.0 ONBOOTyesUbuntu 系则写/etc/netplan/下的 yaml。配完以后ip link set ib0 up然后用ping验证二层互通。不过要提醒一句IB 的ping是基于 IPoIBIP over InfiniBand的验证的是 IPoIB 接口并不代表 RDMA 通信正常。RDMA 通信要用专门的工具验证。4.5 PKey 分区配置不当导致的典型故障IB 网络的 PKey 相当于以太网的 VLAN。默认情况下所有端口都属于 PKey 0xFFFF默认分区不同物理机之间能互通。但如果你为了多租户隔离创建了自定义 PKey那么只有配置了相同 PKey 的端口才能互相通信。虚拟化环境里 PKey 的坑主要在 SR-IOV宿主机 PF 上配置的 PKey 并不会自动同步到所有 VF 上需要手动为每个 VF 添加 PKey。Mellanox 驱动通过ibv_devinfo查看端口 PKey 表# 在虚拟机内部查看端口 PKey 表 ibv_devinfo -d mlx5_0 | grep -A5 P_Key如果发现你需要的 PKey 不在表里可以在宿主机上通过echo方式写入不同版本驱动 API 有差异或者通过子网管理器opensm统一配置。最常见的问题是我前面说的——VF 端口起来了但两个 VM 的 VF 不在同一个 PKey 分区里导致 RDMA 通信一直超时而 IPoIB 层看着是正常的这种症状极具迷惑性。4.6 RDMA 连通性与性能验证虚拟化环境下 RDMA 是否真的正常工作要用perftest工具集做端到端验证。分别选两个已配置好 VF 的虚拟机A 机上启动服务端B 机上启动客户端# 服务端A 机 ib_write_bw -d mlx5_0 -x 100000 # 客户端B 机 ib_write_bw -d mlx5_0 -x 100000 10.0.0.20-x参数指定使用的 QP 号一般不需要改默认即可。测试结果会显示带宽和延迟如果带宽远低于物理机水平比如万兆网卡都跑不满优先检查 VF 的中断绑定、内存锁限制、或者宿主机是否开启了节能模式导致 CPU 频率锁在低频。另外推荐用ibping做简单的连通性验证# 服务端 ibping -S -C mlx5_0 -P 1 # 客户端 ibping -c 1000 -C mlx5_0 -P 1 -g 0ibping能确认 IB 链路的数据通路是否可用比ping更能反映 RDMA 层的健康状况。如果ibping失败但 IPoIB 正常几乎可以肯定问题出在 PKey 或者子网管理器配置上。5. ESXi/vSphere 下 IB 网卡的虚拟化配置5.1 ESXi 与 KVM 的差异ESXi 和 KVM 在 IB 网卡虚拟化上的思路有共通的地方——都支持 PCI 直通和 SR-IOV——但操作路径完全不同。ESXi 是商业虚拟化平台驱动往往内置在 hypervisor 中不像 Linux 那样有独立的 OFED 包可以随便装。Mellanox 对 ESXi 的官方支持是通过 VMware 兼容性列表中的驱动mlx5_esxi等实现的。好消息是ESXi 8.x 和 7.x 对主流 ConnectX 系列卡的 SR-IOV 支持已经相当成熟坏消息是一旦 esxi 升级驱动可能被替换需要重新适配。5.2 ESXi 开启 PCI 直通与 SR-IOVESXi 直通则比较简单通过 vSphere Web Client 登录宿主机在配置-PCI 设备里找到 Mellanox 网卡点击直通启用然后重启宿主机。之后在虚拟机配置里添加PCI 设备选择该网卡即可。SR-IOV 配置在 ESXi 里需要命令行。先开启 ESXi shellDCUI 或者 SSH然后# 列出支持的 SR-IOV 设备 esxcli network sriovnic list # 在指定的 PF 上启用 SR-IOV esxcli network sriovnic config set -n vmnic0 -e true -n 4 # -n 4 表示创建 4 个 VF配置后需要重启宿主机。重启后在同一个界面查看 VF 是否成功创建esxcli network sriovnic list然后给虚拟机添加 PCI 设备时就能看到这些 VF 了。虚拟机内部的操作和 KVM 场景下的 4.4 一样装驱动、配 IP、做 RDMA 验证。5.3 ESXi 环境下需要注意的坑ESXi 上 IB 网卡虚拟化的坑我遇到过的包括宿主机重启后 VF 数量重置需要把 esxcli 命令写成启动脚本或结合 host profile 自动化虚拟机的 PCI 设备在热迁移时不可用PCI 直通和 VF 都不支持跨宿主机热迁移除非用 vSphere 8 以后的 vMotion 配合 DPU 支持的方案ESXi 的驱动和固件版本匹配问题比 Linux 更敏感因为 ESXi 没有类似 MLNX_OFED 的独立升级通道只能跟着 VMware 和厂商的发布节奏走。这块给的建议是ESXi 生产环境升级固件和驱动前先去官方兼容性列表查型号和版本组合别自己拍脑袋升否则 hypervisor 和网卡固件不兼容开机直接 ESXi 起不来那画面太美我不敢看。6. 踩坑实录与排查速查表6.1 我在实际部署中遇到的高频问题第一个坑是驱动装完后ip link看不到 ib 接口。这个大概率是模块没加载。我用lsmod | grep mlx5发现模块在但接口就是没有。后来查dmesg发现mlx5_ib加载失败的原因是没有配置好devlink的driver_reinit或者某些机器的 UEFI 安全启动导致模块签名验证失败。解决方法是降级到老版本驱动或者在 BIOS 里临时关闭 Secure Boot 试一下。第二个坑是 SR-IOV VF 分配给虚拟机后VM 里ibstat一直显示State: Down。折腾半天发现原因在宿主机上——宿主机上 PF 端口的 PKey 设置没有正确传递到 VF导致虚拟机里的端口无法加入默认分区 0xFFFF。重新配置宿主机 PF 的 PKey 表并重启 VF 后解决。第三个坑和虚拟化无关但经常导致假故障IB 网卡固件版本不一致。集群里一批新的 VF 通信频繁报Retry exceeded错误最后发现是其中一台机器的固件版本落后了两个小版本Mellanox 的驱动对固件版本跨度过大时会出现兼容性退化不报错但性能骤降。所以每次升级集群里所有节点必须统一驱动和固件版本这是铁律。6.2 诊断命令速查表诊断目标命令预期结果驱动模块是否加载lsmodgrep mlx5设备链路状态ibstatState: Active, Physical State: LinkUpVerbs 设备是否可用ibv_devinfo能看到 port statePKey 表完整子网管理器运行状态systemctl status opensmactive (running)VF 数量cat /sys/class/infiniband/mlx5_0/device/sriov_numvfs等于你配置的值RDMA 连通性ibping收到响应RDMA 性能ib_write_bw带宽符合预期固件版本mlxup --query与驱动兼容6.3 我的个人操作习惯与建议这些年在 IB 网卡驱动和虚拟化上踩过的坑让我总结出几个比较重要的习惯。第一一切变更先在测试环境走完全流程记录所有ibstat、ibv_devinfo、mlxup --query的输出作为基线。以后一旦出现问题把当前输出和基线对比很多问题一眼就能定位。第二宿主机上 IB 网卡相关配置一定要纳入配置管理。sriov_numvfs的设置、内核的 iommu 参数、limits.conf 的 memlock 配置这些都属于不重装找不到原因的配置项不记清楚下次重建环境就是地狱难度。第三把固件和驱动版本组合写在标签纸上贴到服务器机箱上或者写进资产管理系统。我见过太多机房环境里不同批次的机器硬件 revision 不同驱动版本也不同出了问题很难归因。统一版本是降低运维复杂度的最有效手段。最后再说一个小技巧生产环境的驱动安装建议用 MLNX_OFED 的--without-fw-update参数先跳过固件更新先装驱动跑测试确认一切正常后再用mlxup单独更新固件。这样能把驱动问题和固件问题拆开排查别一次性把变量全部引入不然定位问题的时候你根本不知道是哪个环节出的错。IB 网卡这东西知识体系和传统的以太网运维差别不小但一旦把协议栈、驱动栈、虚拟化路径三个层次理清楚后面做集群就顺了。希望这篇东西能帮你少走点弯路。
返回列表