dpdk占用导致网口消失问题排查
当网卡“消失”且怀疑被 DPDK 程序占用时(如 eth0 在 ip link 中不可见,但 lspci 仍能识别硬件),核心原因是:DPDK 通过 UIO/VFIO 驱动将网卡从内核解绑,移交至用户态程序控制。以下是精准排查与定位方法:
🔍 三步定位:是否被 DPDK 占用 + 谁在占用
✅ 第一步:确认网卡是否被绑定到 DPDK 驱动
1 | # 1. 找到网卡 PCI 地址(示例) |
- 关键判断:
Kernel driver in use: igb_uio/vfio-pci/uio_pci_generic→ 已被 DPDK 占用Kernel driver in use: ixgbe/e1000e等 → 未被 DPDK 占用(排查其他原因)
✅ 第二步:定位占用进程(核心!)
1 | # 方法1:检查打开的 UIO/VFIO 设备(最直接) |
- 输出示例:
testpmd 12345 root 5u CHR 241,0 ... /dev/uio0→ PID 12345 的 testpmd 占用
✅ 第三步:辅助验证(增强可信度)
1 | # 检查 DPDK 绑定工具状态(若已安装) |
📌 关键特征总结(快速判断)
| 现象 | 说明 |
|---|---|
lspci 能看到网卡,但 ip link 无对应接口 |
高度疑似 DPDK 占用 |
lspci -k 显示驱动为 igb_uio/vfio-pci |
确认被 DPDK 驱动接管 |
/dev/uio* 或 /dev/vfio/* 被进程打开 |
直接定位占用程序 |
dpdk-devbind.py --status 标注 “drv=igb_uio” |
DPDK 绑定状态明确 |
⚠️ 注意事项
- 权限要求:
lsof/fuser//proc扫描需root权限,否则可能漏检。 - 进程已退出但驱动未解绑:
- 若
lsof无输出但驱动仍为igb_uio,说明进程已退出但未释放设备。 - 恢复方法:
1
2echo "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 # 替换为原驱动名
- 若
- 云环境/容器:
- 容器内运行的 DPDK 程序需在宿主机排查(检查宿主机
/dev和进程)。 - 云平台(如阿里云)需确认是否启用 SR-IOV + VF 被 DPDK 占用。
- 容器内运行的 DPDK 程序需在宿主机排查(检查宿主机
- 安全操作:
- 切勿直接 kill 进程!先确认业务影响(如 OVS-DPDK、VPP、自研转发程序)。
- 恢复网卡前,确保 DPDK 程序已安全停止。
💡 一句话总结
“网卡硬件存在但内核看不见” + “驱动显示 igb_uio/vfio-pci” = DPDK 占用;用
lsof /dev/uio*或扫描/proc/*/fd精准定位占用进程。
通过以上方法,可快速区分“命名规则变更”与“DPDK 占用”,避免误判。如需进一步分析,提供 lspci -k -s <PCI> 和 lsof /dev/uio* 输出即可精准定位。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 体系所运维知识库!