资讯动态

Gazelle 部署排障指南:4 步跑通网卡绑定与 gazelle-pdump 抓包

发布时间:2026/8/24 4:45:14 来源:尧图企业网站定制
Gazelle 部署排障指南4 步跑通网卡绑定与 gazelle-pdump 抓包【免费下载链接】gazelleA high performance user-mode stack, which powered by dpdk and lwip项目地址: https://gitcode.com/openeuler/gazelle部署 Gazelle 时遇到No NIC is matched、Cannot set affinity或者 DPDK 绑定过的网卡在 tcpdump 里一个包都抓不到这篇 Gazelle 排障指南带你按网卡绑定、启动验证、抓包、报错速查 4 步走把常见故障自己查明白。第一步把网卡绑定到 DPDK 用户态驱动Gazelle 的用户态驱动绕过内核直接和网卡打交道所以第一件事是先把网卡从内核驱动手里接过来。先确认网卡 MAC并把它写进/etc/gazelle/lstack.conf的devices字段ip a预期现象找到要用的网卡比如 enp3s0及其 MAC 地址。然后加载驱动并绑定两种方式二选一# 硬件 IOMMU 可用时推荐 vfio-pci modprobe vfio-pci # IOMMU 不可用且 vfio 支持 noiommu 时modprobe vfio enable_unsafe_noiommu_mode1 modprobe vfio-pci # 其它情况用 igb_uiomodprobe igb_uio dpdk-devbind -b vfio-pci enp3s0预期现象命令执行完无报错输出。再验证dpdk-devbind -s预期输出网卡出现在 Network devices using DPDK-compatible driver 一节下内核ip a里对应的接口消失。绑定后还要确认网卡驱动库是否要手动加载速查如下网卡驱动库需要 dpdk-devbind 绑定hinicHi1822librte_net_hinic.so已链接需要hns3HNS 系列librte_net_hns3.so需 -d 加载需要mlx5ConnectX 系列librte_net_mlx5.so需 -d 加载不需要ixgbeX520/X550librte_net_ixgbe.so已链接需要e1000/e1000e/vmxnet3 虚拟网卡对应 librte_net_*.so需 -d 加载需要未链接的库在 lstack.conf 的dpdk_args里追加-d /usr/lib64/库名.so库路径可以用rpm -ql dpdk | grep 驱动关键字确认。 卡在这怎么办NUMA 不匹配报错启动日志里出现这两行mlx5_common: Failed to initialize global MR share cache. # 报错关键行跨 NUMA 访问内存失败 EAL: Requested device 0000:81:00.0 cannot be used说明网卡挂在某个 NUMA 节点上而 Gazelle 用的 CPU 核和大页在另一个节点。两种改法改法 A给网卡所在节点补大页echo 1024 /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages预期输出grep Huge /proc/meminfo能看到 node1 上的页数。改法 B把 lstack.conf 里num_cpus改成和网卡同 NUMA 的核例如num_cpus2,22重启进程。 卡在这怎么办大页内存没配或配错节点现象启动时看到EAL: Cannot get hugepage information或 FreeHugePages 为 0。修复# 在 node0 分配 2M*10242G 大页ltran 至少 1064MBlstack 每个协议栈线程至少 800MB按需加量 echo 1024 /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages mkdir -p /mnt/hugepages-lstack /mnt/hugepages-ltran mount -t hugetlbfs nodev /mnt/hugepages-lstack -o pagesize2M mount -t hugetlbfs nodev /mnt/hugepages-ltran -o pagesize2M预期输出grep Huge /proc/meminfo中 FreeHugePages 大于 0。两个挂载点必须挂同样页大小的大页内存开大时建议用 1G 大页避免占太多文件描述符。 卡在这怎么办容器环境报 Cannot set affinity日志出现EAL: FATAL: Cannot set affinity说明num_cpus里的核不在容器启动时分配的 CPU 集合内。修复cat /sys/fs/cgroup/cpuset/cpuset.cpus预期输出容器可用的 CPU 编号范围。把 lstack.conf 的num_cpus改成这个范围内的核即可。自检做完这步你应该看到……网卡从内核接口列表里消失dpdk-devbind -s显示它已绑定到 DPDK 驱动启动日志不再出现绑定相关报错。第二步确认协议栈真的起来了绑定完成后按顺序启动 ltran用 ltran 模式时和应用程序ltran --config-file /etc/gazelle/ltran.conf GAZELLE_BIND_PROCNAMEredis-server \ LD_PRELOAD/usr/lib64/liblstack.so redis-server redis.conf预期现象日志里出现LSTACK: gazelle network init:342 gazelle network init success和gazelle_stack_thread:59 stack 00 start success如果你看到No NIC is matched回到第一步检查绑定和devices的 MAC。接着用下面几条命令验证gazellectl lstack show ip预期输出打印出 lstack 注册的 IP与 lstack.conf 里的host_addr一致。gazellectl lstack show -k nic-features预期输出打印网卡 offload 与协议特性状态。# 在对端机器上 ping Gazelle 的 host_addr ping 192.168.1.10预期输出ping 有正常回显Gazelle 支持长度不超过 14792B 的 ping 报文。自检做完这步你应该看到……对端能 ping 通host_addrgazellectl 能正常输出统计。第三步用 gazelle-pdump 抓包并过滤 pcap 文件在 Gazelle 绑定过的网卡上跑 tcpdump一个包都出不来——不是包丢了而是网卡已被 DPDK 用户态完全接管不再经过内核内核里的 tcpdump 自然没有入口。这也是DPDK 抓不到包的结构性原因不是过滤语句写错了。gazelle-pdump 是 Gazelle 的从进程借助 DPDK 多进程模式和主进程lstack/ltran共享网卡驱动收发队列把报文拷贝出来按 pcap 格式写成文件Wireshark 可以直接打开。注意ltran 模式下它抓到的是 ltran 与网卡直接通信的流量想看某个 lstack 实例的流量还要再用 tcpdump 过滤。常用参数一句话说明device_id被抓网卡的 PCI 地址必须和dpdk-devbind -s结果一致vdev 类网卡如 af_xdp填--vdev的值rx-dev/tx-dev收、发包存放路径两者配同一路径则一个文件里同时有收发-d手动加载网卡驱动库库名对照第一步的速查表queue*抓全部队列# hinic库已链接直接跑 gazelle-pdump -- --pdump device_id0000:01:00.0,queue*,rx-dev/root/capture-rx.pcap,tx-dev/root/capture-tx.pcap # af_xdpvdev 网卡device_id 填 --vdev 的值 gazelle-pdump -d /usr/lib64/librte_net_af_xdp.so -- --pdump device_idnet_af_xdp,queue*,rx-dev/root/capture-rx.pcap,tx-dev/root/capture-tx.pcap # mlx需要加载驱动库 gazelle-pdump -d /usr/lib64/librte_net_mlx5.so -- --pdump device_id0000:07:00.0,queue*,rx-dev/root/capture-rx.pcap,tx-dev/root/capture-tx.pcap预期现象按 CtrlC 停止后终端打印 PDUMP DEBUG STATS其中 packets dequeued 大于 0说明抓到了包。拿到 pcap 文件后可以用 tcpdump 继续过滤# 按源 IP 过滤并另存 tcpdump -r /root/capture.pcap src host 192.168.1.10 -w /root/filter-capture.pcap # 只看 80 端口的流量 tcpdump -r /root/capture.pcap port 80预期输出逐条打印报文记录能看到 IP、端口和 TCP 标志位。 device_id 对不上时的修复看到PDUMP: client request for pdump enable/disable failed时基本可以断定你传的device_id不是主进程实际在用的网卡。修复只需一步dpdk-devbind -s查出真实 PCI 地址改写命令里的device_id。自检做完这步你应该看到……应用程序跑流量时 pcap 文件持续变大CtrlC 后 dequeued 包数大于 0。第四步报错症状速查部署和抓包阶段的高频报错统一按现象 → 原因 → 一条修复组织。1. 启动报 No NIC is matchedLSTACK: ethdev_port_id:369 No NIC is matched # 报错关键行没找到匹配的网卡 EAL: Error - exiting with code: 1 Cause: gazelle_network_init:306 init_dpdk_ethdev failed原因网卡没绑定到 DPDK 驱动或 lstack.conf 的devices与真实网卡 MAC 对不上。修复dpdk-devbind -b vfio-pci enp3s0再用ip a核对devices的值。2. hinic VF 报 nic mac not matchLSTACK: ethdev_port_id:363 nic mac:02:09:c0:f5:05:bc not match # 报错关键行MAC 不一致 LSTACK: ethdev_port_id:369 No NIC is matched原因hinic VF 直通场景下 VF 的 MAC 是随机的配置里必须填你手动固定的 MAC。修复ip link set enp5s0 vf 0 mac 18:3d:5e:bf:6c:22预期现象ip link show enp5s0里 VF 0 的 MAC 变成你设置的值随后把这个 MAC而不是ip a显示的那个写进 lstack.conf 的devices。3. gazelle-pdump 报设备未由主进程驱动Device 0000:02:08.0 is not driven by the primary process # 报错关键行该网卡不由主进程驱动 EAL: Requested device 0000:02:08.0 cannot be used PDUMP: client request for pdump enable/disable failed原因gazelle-pdump 指定的device_id不是 lstack/ltran 实际在用的网卡。修复dpdk-devbind -s查出真实 PCI 地址改写device_id参数。4. vdev 初始化失败vdev_probe(): failed to initialize net_af_xdp device EAL: Bus (vdev) probe failed. EAL: Error - exiting with code: 1原因没有加载网卡对应的驱动库。修复命令后加-d /usr/lib64/librte_net_af_xdp.so其它网卡对照第一步速查表找对应库。5. vdev 创建失败 create_mp_ring_vdevEAL: Failed to hotplug add device EAL: Error - exiting with code: 1 Cause: vdev creation failed:create_mp_ring_vdev:700原因lstack/ltran 没链接 pcap 驱动库DPDK 21.11 为 librte_net_pcap.so19.11 为 librte_pmd_pcap.so多进程共享内存通道建不起来。修复在 DPDK 编译配置里打开 PDUMP 选项重编 dpdk或直接用 openEuler 打包的 gazelle-pdump。自检做完这步你应该能把启动或抓包时遇到的任何报错日志对上其中一条修复命令。避坑清单mlx5 系列网卡不需要 dpdk-devbind 绑定其余物理网卡都要先绑定再启动。devices的 MAC 必须和真实网卡核对hinic VF 用手动设置的固定 MAC不要用ip a看到的。num_cpus的核要和网卡在同一 NUMA且落在容器分配的 CPU 集合内。/mnt/hugepages-lstack与/mnt/hugepages-ltran两个挂载点必须同页大小ltran 至少 1064MBlstack 每个协议栈线程至少 800MB。ltran 模式下 gazelle-pdump 抓的是 ltran 网卡级流量区分具体 lstack 实例要靠 tcpdump 过滤表达式。更多细节可参考 用户指南 doc/zh/user-guide.md、网卡支持与使用 doc/zh/nic-support.md、[【免费下载链接】gazelleA high performance user-mode stack, which powered by dpdk and lwip项目地址: https://gitcode.com/openeuler/gazelle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价