当网卡“消失”且怀疑被 DPDK 程序占用时(如 eth0ip link 中不可见,但 lspci 仍能识别硬件),核心原因是:DPDK 通过 UIO/VFIO 驱动将网卡从内核解绑,移交至用户态程序控制。以下是精准排查与定位方法:


🔍 三步定位:是否被 DPDK 占用 + 谁在占用

✅ 第一步:确认网卡是否被绑定到 DPDK 驱动

1
2
3
4
5
6
# 1. 找到网卡 PCI 地址(示例)
lspci -nn | grep -i ethernet
# 输出示例:01:00.0 Ethernet controller [0200]: Intel Corporation ...

# 2. 检查当前绑定的驱动
lspci -k -s 0000:01:00.0 # 替换为实际 PCI 地址
  • 关键判断
    Kernel driver in use: igb_uio / vfio-pci / uio_pci_generic已被 DPDK 占用
    Kernel driver in use: ixgbe / e1000e 等 → 未被 DPDK 占用(排查其他原因)

✅ 第二步:定位占用进程(核心!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 方法1:检查打开的 UIO/VFIO 设备(最直接)
sudo lsof /dev/uio* /dev/vfio/* 2>/dev/null | grep -v "COMMAND"
# 或
sudo fuser -v /dev/uio* /dev/vfio/* 2>/dev/null

# 方法2:扫描所有进程的 fd(需 root)
sudo find /proc/[0-9]*/fd -lname "*uio*" -o -lname "*vfio*" 2>/dev/null | \
while read fd; do
pid=$(echo $fd | cut -d/ -f3)
echo "PID: $pid | $(ps -p $pid -o comm= 2>/dev/null || echo 'terminated')"
done

# 方法3:检查 DPDK 进程特征
ps aux | grep -E "testpmd|l2fwd|l3fwd|dpdk|ovs|vpp|fd.io" | grep -v grep
pgrep -a -f "dpdk|testpmd" 2>/dev/null
  • 输出示例
    testpmd 12345 root 5u CHR 241,0 ... /dev/uio0 → PID 12345 的 testpmd 占用

✅ 第三步:辅助验证(增强可信度)

1
2
3
4
5
6
7
8
# 检查 DPDK 绑定工具状态(若已安装)
dpdk-devbind.py --status 2>/dev/null | grep -A 5 "0000:01:00.0"

# 检查内核日志(绑定时间点)
dmesg | grep -i "uio\|vfio\|bound to driver" | tail -20

# 检查 UIO 设备关联
ls -l /sys/class/uio/ 2>/dev/null && cat /sys/class/uio/uio*/name

📌 关键特征总结(快速判断)

现象 说明
lspci 能看到网卡,但 ip link 无对应接口 高度疑似 DPDK 占用
lspci -k 显示驱动为 igb_uio/vfio-pci 确认被 DPDK 驱动接管
/dev/uio*/dev/vfio/* 被进程打开 直接定位占用程序
dpdk-devbind.py --status 标注 “drv=igb_uio” DPDK 绑定状态明确

⚠️ 注意事项

  1. 权限要求lsof/fuser//proc 扫描需 root 权限,否则可能漏检。
  2. 进程已退出但驱动未解绑
    • lsof 无输出但驱动仍为 igb_uio,说明进程已退出但未释放设备。
    • 恢复方法
      1
      2
      echo "0000:01:00.0" | sudo tee /sys/bus/pci/drivers/igb_uio/unbind
      echo "0000:01:00.0" | sudo tee /sys/bus/pci/drivers/ixgbe/bind # 替换为原驱动名
  3. 云环境/容器
    • 容器内运行的 DPDK 程序需在宿主机排查(检查宿主机 /dev 和进程)。
    • 云平台(如阿里云)需确认是否启用 SR-IOV + VF 被 DPDK 占用。
  4. 安全操作
    • 切勿直接 kill 进程!先确认业务影响(如 OVS-DPDK、VPP、自研转发程序)。
    • 恢复网卡前,确保 DPDK 程序已安全停止。

💡 一句话总结

“网卡硬件存在但内核看不见” + “驱动显示 igb_uio/vfio-pci” = DPDK 占用;用 lsof /dev/uio* 或扫描 /proc/*/fd 精准定位占用进程。

通过以上方法,可快速区分“命名规则变更”与“DPDK 占用”,避免误判。如需进一步分析,提供 lspci -k -s <PCI>lsof /dev/uio* 输出即可精准定位。