DPDK应用调用rte_eth_dev_count_avail返回0的问题排查求助
DPDK自研应用网卡识别问题排查求助
我基于DPDK 19.11.12源码编译库并开发了扩展应用,已通过dpdk-devbind将Intel X550网卡绑定至igb_uio驱动,testpmd能正常识别该设备,但自研应用调用rte_eth_dev_count_avail始终返回0。怀疑问题出在DPDK库或应用的编译方式上,以下是相关信息,请求协助排查:
应用Makefile片段
RTE_SDK ?= /usr/local/share/dpdk RTE_TARGET ?= x86_64-default-linuxapp-gcc include $(RTE_SDK)/mk/rte.vars.mk # binary name APP = myapp # all source are stored in SRCS-y SRCS-y := main.c WERROR_FLAGS += -Werror CFLAGS += -O3 -g CFLAGS += $(WERROR_FLAGS) -Wno-address-of-packed-member CFLAGS += -Wall CFLAGS += -pie -fPIE -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -fstack-protector-strong CFLAGS += -DSTATSD LDFLAGS += -z relro -z now LDFLAGS += -ljansson -lrte_pmd_ixgbe LDLIBS += -lrte_pmd_ixgbe # disable since libxenstore.so isn't linked properly #CONFIG_RTE_LIBRTE_PMD_XENVIRT = n CONFIG_RTE_LIBRTE_PMD_IXGBE = y include $(RTE_SDK)/mk/rte.extapp.mk
DPDK库编译脚本
RUN make -C /dpdk/dpdk-stable-${DPDK_VERSION}/ config T=x86_64-native-linuxapp-gcc RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_BUILD_SHARED_LIB=n/CONFIG_RTE_BUILD_SHARED_LIB=y/g > /tmp/out && mv /tmp/out build/.config RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_LIBRTE_ETHDEV_DEBUG=n/CONFIG_RTE_LIBRTE_ETHDEV_DEBUG=y/g > /tmp/out && mv /tmp/out build/.config RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_LIBRTE_E1000_DEBUG_RX=n/CONFIG_RTE_LIBRTE_E1000_DEBUG_RX=y/g > /tmp/out && mv /tmp/out build/.config RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_LIBRTE_E1000_DEBUG_TX=n/CONFIG_RTE_LIBRTE_E1000_DEBUG_TX=y/g > /tmp/out && mv /tmp/out build/.config RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_LIBRTE_IXGBE_DEBUG_RX=n/CONFIG_RTE_LIBRTE_IXGBE_DEBUG_RX=y/g > /tmp/out && mv /tmp/out build/.config RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX=n/CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX=y/g > /tmp/out && mv /tmp/out build/.config RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_LOG_DP_LEVEL=RTE_LOG_INFO/CONFIG_RTE_LOG_DP_LEVEL=RTE_LOG_DEBUG/g > /tmp/out && mv /tmp/out build/.config RUN cd /dpdk/dpdk-stable-${DPDK_VERSION}/ && cat build/.config | sed -e s/CONFIG_RTE_LOG_HISTORY=256/CONFIG_RTE_LOG_HISTORY=2048/g > /tmp/out && mv /tmp/out build/.config
EAL初始化日志(--log-level=8)
Sep 09 04:56:50 {"timestamp": 1662717410.8821511, "level": "info", "message": "Initialising EAL ..."} Sep 09 04:56:50 EAL: Detected 64 lcore(s) Sep 09 04:56:50 EAL: Detected 2 NUMA nodes Sep 09 04:56:50 EAL: Multi-process socket /var/run/dpdk/rte/mp_socket Sep 09 04:56:50 EAL: Selected IOVA mode 'PA' Sep 09 04:56:50 EAL: No available hugepages reported in hugepages-1048576kB Sep 09 04:56:50 EAL: Debug dataplane logs available - lower performance Sep 09 04:56:50 EAL: Debug dataplane logs available - lower performance Sep 09 04:56:50 EAL: Probing VFIO support... Sep 09 04:56:50 EAL: VFIO support initialized Sep 09 04:56:50 EAL: Probing VFIO support... Sep 09 04:56:50 EAL: VFIO support initialized
插件加载异常信息
添加启动参数--master-lcore 4 -l 4,5,6,7 --log-level 8 -d /usr/local/lib/后出现以下错误:
Sep 09 04:47:29 EAL: Detected 64 lcore(s) Sep 09 04:47:29 EAL: Detected 2 NUMA nodes Sep 09 04:47:29 EAL: librte_compressdev.so.0.200: cannot open shared object file: No such file or directory Sep 09 04:47:29 EAL: FATAL: Cannot init plugins Sep 09 04:47:29 EAL: Cannot init plugins
注:librte_compressdev.so.0.200确实存在于/usr/local/lib/路径下:
ls -l /usr/local/lib/librte_compressdev.so.0.200 -rwxr-xr-x 1 root root 38024 Sep 8 23:51 /usr/local/lib/librte_compressdev.so.0.200
排查方向建议
编译目标不一致问题
- 应用Makefile中
RTE_TARGET设为x86_64-default-linuxapp-gcc,但DPDK库编译用的是x86_64-native-linuxapp-gcc,两者不匹配。default和native的区别在于native会启用CPU特定优化,且库路径不同。需统一两者的编译目标,要么都用default,要么都用native。
- 应用Makefile中
动态库加载路径问题
- 虽然指定了
-d /usr/local/lib/,但系统可能无法正确解析该路径下的依赖库。可以尝试:- 执行
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH后再启动应用; - 在启动参数中明确指定单个库文件路径,而非目录,比如
-d /usr/local/lib/librte_pmd_ixgbe.so; - 检查
librte_compressdev.so.0.200的依赖是否完整,用ldd /usr/local/lib/librte_compressdev.so.0.200查看是否有缺失的依赖库。
- 执行
- 虽然指定了
网卡驱动与PMD匹配问题
- 确认DPDK编译时是否启用了igb_uio驱动支持,检查
.config中CONFIG_RTE_LIBRTE_IGB_UIO是否设为y; - 应用中是否正确初始化了EAL并传入必要参数,比如是否误加
--no-pci参数(会导致不扫描PCI设备)。
- 确认DPDK编译时是否启用了igb_uio驱动支持,检查
权限与环境问题
- 确保应用以root权限运行,DPDK需要root权限访问PCI设备和大页内存;
- 检查
/var/run/dpdk/目录的权限,确保应用有读写权限; - 确认大页内存已正确配置,虽然日志显示1GB大页无可用,但testpmd能正常运行,可检查2MB大页的配置情况。
内容的提问来源于stack exchange,提问作者Amit Limaye
相关产品推荐
相关产品推荐

