大家好,
使用:LX2160 LSDK 2108 主程序
MC固件版本:10.32.0
DPDK 版本:dpdk_19_11_tags_LSDK20.04-isc-09
主进程 (DPDK):使用 [ rte_pktmbuf_pool_create("dlmempool", ] 创建 mbuff 池
辅助(DPDK)进程:使用 API [ rte_pktmbuf_alloc(mempool) ] 分配 mbuff 失败
在辅助内存池中,我可以看到内存池是正确的。我看到mbuff可用空间已满。第一次使用 rte_pktmbuf_alloc 进行 mbuff 分配时发生失败。
有什么解决办法吗?谢谢。
你好,
辅助进程必须将大页映射到与主进程相同的虚拟地址。如果 ASLR 处于活动状态,则辅助内存池指针将解析到不同的虚拟地址,导致第一次内存分配失败。
echo 0 > /proc/sys/kernel/randomize_va_space
在启动主进程或辅助进程之前运行此程序。
2. 配置充足的DPMCP对象
创建与进程总数(主进程 + 辅助进程)相同的 DPMCP 对象数量。对于 1 个主要处方药 + 1 个次要处方药,您至少需要 2 个 DMPCP:
export DPMCP_COUNT=3 # for 1 Primary + 2 Secondary (always provision +1 as buffer)
./dynamic_dpl.sh dpmac.X
(总进程数)×(每个进程的核心数 + 每个进程额外 1 个核心)
例如,1 个主处理器(2 个核心)+ 1 个辅助处理器(2 个核心)= 至少 9 个 DPIO。
export DPIO_COUNT=20 # set generously
辅助进程不得重新初始化 I/O 设备(dpni、dpbp、dpcon、dpseci)。只有dpio和dpmcp应该由辅助节点初始化。传递正确的黑名单标志:
# Secondary process example — blacklist all dpni/dpbp/dpcon, allow only dpio + dpmcp
./your_secondary_app --proc-type=secondary \
-b fslmc:dpni.X \
-b fslmc:dpbp.X \
-b fslmc:dpcon.X \
-- [app args]
或者,也可以明确地将分配给辅助节点的 dpio 和 dpmcp 对象列入白名单:
./your_secondary_app --proc-type=secondary \
-w fslmc:dpio.Y \
-w fslmc:dpmcp.Z \
-- [app args]
--proc-type=secondary EAL 参数./your_secondary_app -c -n 1 --proc-type=secondary ...
或者使用--proc-type=auto让 DPDK 自动检测。
在辅助节点中,不要再次调用rte_pktmbuf_pool_create 。相反,查找主节点创建的现有池:
// In secondary process:
struct rte_mempool *mempool = rte_mempool_lookup("dlmempool");
if (mempool == NULL) {
// Error: pool not found — ASLR or hugepage mapping issue
}
struct rte_mbuf *m = rte_pktmbuf_alloc(mempool);
如果rte_mempool_lookup返回一个有效的非 NULL 指针,但rte_pktmbuf_alloc仍然返回 NULL,则问题几乎肯定是辅助线程/核心的 DPIO 门户没有被初始化。
此致
感谢@Bio_TICFSL的快速解决方案