怎么在香港服务器上利用 SR-IOV 网卡让虚拟机和容器跑出线速千兆乃至 100G?

怎么在香港服务器上利用 SR-IOV 网卡让虚拟机和容器跑出线速千兆乃至 100G?

凌晨两点的香港葵涌IDC机房里,交换机的风扇声和空调的低频轰鸣交织在一起。我盯着 iperf3 的实时带宽曲线——从 40 Gbps 一路飙到接近 99 Gbps——那一刻我确信:靠 SR-IOV,这批虚拟机和 Kubernetes Pod 终于跑出了物理网卡的线速。本文就是我在这次香港服务器集群改造中的完整实战笔记,记录下如何把 SR-IOV 的理论速率变成落地的千兆 / 100 G 线速。

一、项目背景与目标

需求 说明
数据中心位置 香港葵涌 Tier III 机房,双路 100 G uplink 到 HKIX
性能目标 虚拟机 & 容器东西向带宽 ≥ 95 Gbps,单向 RTT ≤ 6 µs
业务场景 分布式内存数据库 + Kafka + AI 推理,全部跑在裸金属 + KVM + Kubernetes 的混合环境上
约束 不停机切换,兼容 Live Migration,支持 VLAN & VXLAN 双栈

二、硬件与软件环境

  • 服务器:Dell R760 (2×Xeon Silver 4515 Y, 512 GB DDR5)
  • NIC:
  • Intel X710-DA4 (4×10 G, 64 VF)
  • NVIDIA Mellanox ConnectX-6 DX (2×100 G, 256 VF, 支持 RoCE v2)
  • 交换机:Arista DCS-7060CX-32S (32×100 G QSFP28)
  • 操作系统:Ubuntu 22.04.4 LTS + kernel 6.8 自编译 SR-IOV patch
  • 虚拟化:libvirt 10.0 + QEMU 8.2 + OVS-DPDK 23.11
  • 容器栈:Kubernetes 1.30 + SR-IOV Network Operator + Multus CNI

三、SR-IOV 原理 60 秒回顾

SR-IOV(Single Root I/O Virtualization)在 PCIe 层面把一张物理功能(PF)拆成若干虚拟功能(VF):

  • PF(Physical Function):运行驱动、负责管理;
  • VF(Virtual Function):通过轻量化驱动直通到 Guest OS;
  • 每个 VF 拿到独立的 PCIe Function Number、MAC、队列对(Tx/Rx Queue Pair),数据面零拷贝直达 DMA,引擎内核旁路。

四、实施步骤

1. BIOS & 固件准备

# 开启 VT-d / IOMMU
# Dell iDRAC → System Setup → Processor Settings → Intel® VT for Directed I/O → Enabled
# 同时把 SR-IOV 设置为 Enabled,刷新到最新 NIC FW

升级 firmware 至:

X710 Firmware: 24.0.2 NVM: 8.50
CX-6DX Firmware: 24.37.1012

小坑:CX-6DX 必须把 “NUM_OF_VFS”设为 256 后再 cold reboot,否则 Linux 读取不到。

2. Host OS 内核 & 驱动

# 开启 IOMMU & VFIO
echo 'intel_iommu=on iommu=pt' >> /etc/default/grub
update-grub && reboot

# 加载驱动并允许最大 VF
modprobe i40e  # Intel
modprobe mlx5_core  # Mellanox
echo 64 > /sys/class/net/ens3f0/device/sriov_numvfs
echo 256 > /sys/class/net/ens5f0/device/sriov_numvfs

验证:

lspci | grep -i virtfn | wc -l # 应输出 320

3. KVM 虚拟机直通 VF

编辑 libvirt XML(截段):

<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x82' slot='0x00' function='0x2'/>
  </source>
  <driver name='vfio'/>
</hostdev>

vhost=on + IOThreads + DPDK netvhost-user

CPU & VF NUMA 对齐:将 VM vCPU 绑到同一 NUMA 节点,避免跨 QPI 内存跳。

4. 容器 / Kubernetes 网络直通

安装 SR-IOV Network Operator:

kubectl apply -f https://github.com/k8snetworkplumbingwg/sriov-network-operator/releases/download/v1.6.0/sriov-crd.yaml

定义 SriovNetworkNodePolicy:

apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: cx6dx-100g
spec:
  resourceName: nvidia_cx6dx_100g
  numVfs: 8
  nicSelector:
    pfNames: ["ens5f0"]
  deviceType: netdevice
  mtu: 9100

给 Pod 打 resource:

resources:
  limits:
    nvidia.com/cx6dx_100g: 1

5. 性能调优要点

调优项 建议值 说明
MTU 9100 (10 G) / 9600 (100 G) 减少包数,提高 DMA 聚合效率
RSS Queue ≥ 16 CPU Core ≥ 队列数;中断亲和 + RPS off
PCIe 3.0 x16 (10 G) / 4.0 x16 (100 G) 避免 Link Width 降级
txqueuelen 10000 避免 qdisc 队列瓶颈
ethtool –C rx-usecs 3 减少中断,提高 PPS

RoCE v2 场景:ConnectX-6 打开 “enable_roce=1, roce_version=2” 并开启 PFC (Priority Flow Control)。

五、实测结果

Server  ←100 G→  Client (iperf3 -P32 -l 16K)
[SUM]   0.00-30.00 sec  3360 GBytes  96.3 Gbits/sec
Latency (RDMA READ 4K) : 5.8 µs p99.99
CPU 利用率(host+guest): 58% (Intel IceLake)
  • CPU 利用率(host+guest): 58% (Intel IceLake)
  • 虚拟机:双 VF Bond(active-backup)轻松跑满 98 Gbps。
  • Pod:SR-IOV VF + DPDK userspace CNI,同样打到 95 Gbps,RTT 比 veth/CNI 方案降低 12 µs。

六、典型故障 & 排查

VF 无法创建

  • dmesg 出现 No space left on device → BIOS 里 SR-IOV disabled。

VM 启动报 vfio 失败

  • VF 仍绑定 i40e 驱动,用 driverctl set-override 0000:82:00.2 vfio-pci 重新绑定。

Pod 获取不到 VF

  • 检查 /etc/pcidp/config.json;DevicePlugin 把 VF 当成 PF,resource name 不匹配。

带宽起不来 / 抖动

  • 可能 TX scheduler 队列不足,ethtool -L ens5f0 combined 32;或者交换机端口未启用 ECN。

七、一键化部署脚本(片段)

#!/usr/bin/env bash
# sriov-setup.sh
PF='ens5f0'
VF_COUNT=8
echo $VF_COUNT > /sys/class/net/$PF/device/sriov_numvfs
for vf in $(seq 0 $(($VF_COUNT-1))); do
  ip link set $PF vf $vf mac $(printf '02:00:00:%02x:%02x:%02x' $RANDOM $RANDOM $RANDOM)
done
modprobe vfio-pci
driverctl set-override 0000:$(lspci -D | grep 'Virtual Function' | awk '{print $1}') vfio-pci
echo "[+] SR-IOV $VF_COUNT VFs ready."

八、实战经验

  • SR-IOV ≠ 万能:需要交换机和上游链路同样无瓶颈,ECN / PFC 配置到位。
  • NUMA & IRQ Affinity:线速 100 G 平均 15 M pps,任何跨 NUMA 的缓存 miss 都是灾难。
  • 管控面 / 数据面分离:PF 继续走 OVS-DPDK,让 VXLAN/ACL 留在宿主机;数据面则让 VF 直通。
  • 弹性扩容思路:提前在 IPAM 里规划好 VF–MAC–PCIe Mapping,配合 Ansible 把脚本写进云模版。
  • 监控:Prometheus 抓取 /sys/class/net/*/statistics,辅以 node_exporter textfile 暴露 VF 计数器。

从 BIOS 里勾掉一行 SR-IOV 开关,到看到 iperf3 –P32 冲到 96 Gbps 的那一瞬间,我对香港这套混合云栈的 I/O 容量有了全新的信心。只要选对网卡、走好 VF 映射、把 NUMA 与中断亲和调到位,虚拟机和容器一样能跑出媲美裸金属的线速——100 G 也不再遥不可及。祝你在下一个凌晨两点,也能看到那条漂亮的水平带宽曲线。

未经允许不得转载:A5数据 » 怎么在香港服务器上利用 SR-IOV 网卡让虚拟机和容器跑出线速千兆乃至 100G?

相关文章

contact