Pktgen-DPDK中run.sh执行报错:EAL内存初始化失败求助
解决DPDK Pktgen启动时EAL内存初始化失败问题
这是DPDK NUMA节点内存分配不匹配的典型问题,咱们一步步来排查修复:
先拆解下报错的核心信息:
EAL: Not enough memory available on socket 1! Requested: 2048MB, available: 0MB
EAL: FATAL: Cannot init memory
EAL: Cannot init memory
这个报错说明你的Pktgen脚本默认尝试在NUMA节点1(socket1)上分配2GB内存,但这个节点完全没有配置大页内存。另外你提到尝试分配了2048KB大页——这应该是个小失误,2048KB只有2MB,远远达不到DPDK需要的2GB内存要求,正确的应该是分配2048MB(2GB)的大页。
解决步骤:
1. 先确认系统NUMA节点和大页状态
先搞清楚你的机器NUMA节点数量,以及当前大页的分配情况:
- 查看NUMA节点信息:
输出里会显示numactl --hardwarenode 0、node 1等节点,确认你的机器是否真的有两个物理socket。 - 查看当前大页总数和各节点分配情况:
如果输出里grep HugePages /proc/meminfo grep -A 2 node /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepagesnode1的nr_hugepages是0,就坐实了socket1没分配大页的问题。
2. 针对两种场景修复大页分配
场景一:机器只有一个NUMA节点(socket0)
如果numactl --hardware只显示node 0,说明脚本没必要尝试在socket1分配内存,直接修改run.sh里的DPDK启动参数即可:
找到脚本里类似--socket-mem 2048或者-m 2048的参数,改成:
--socket-mem 2048,0
或者直接加上--single-socket参数,强制DPDK只使用第一个NUMA节点的内存:
--single-socket --socket-mem 2048
场景二:机器确实有两个NUMA节点(socket0和socket1)
那需要给socket1也分配足够的大页:
- 先卸载已挂载的大页:
sudo umount /dev/hugepages - 给每个节点分配2GB大页(假设使用2MB大小的大页,2GB需要1024页):
# 给socket0分配1024个2MB大页(共2GB) echo 1024 | sudo tee /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages # 给socket1分配1024个2MB大页(共2GB) echo 1024 | sudo tee /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages - 重新挂载大页:
sudo mount -t hugetlbfs hugetlbfs /dev/hugepages
3. 验证修复并重新运行
先确认大页分配成功:
grep -A 5 node[01] /sys/devices/system/node/node*/hugepages/hugepages-2048kB/nr_hugepages
如果两个节点的nr_hugepages都显示1024,就可以重新运行Pktgen脚本了:
sudo -E ./tools/run.sh
额外注意点
- 如果是在虚拟机上运行,要确保宿主机已经开启大页支持,并且虚拟机配置里分配了足够的大页内存。
- 如果是物理机,检查BIOS设置里是否开启了
Huge Pages或Transparent Huge Pages相关选项(不同厂商BIOS命名可能不同)。
内容的提问来源于stack exchange,提问作者Haritha
相关产品推荐
相关产品推荐

