使用DPDK 17.11.1 testpmd无法利用全部内存通道的问题咨询
问题背景
你用的是DPDK 17.11.1版本的TestPMD,创建了P0、P1两个端口并从P0往P1发流量,结果用PCM工具监测发现,明明系统有4个内存通道,却只有2个在正常工作。你的TestPMD启动命令如下:
./testpmd -n4 -l2,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33 -- --rxd=4096 --txd=4096 --numa --rxq=8 --txq=8 --nb-cores=16 --numa --forward-mode=mac -i
PCM的监测关键结果:
|---------------------------------------||---------------------------------------|
|-- Socket 0 --||-- Socket 1 --|
|-- Mem Ch 0: Reads (MB/s): 0.06 --||-- Mem Ch 0: Reads (MB/s): 0.01 --|
|-- Writes(MB/s): 0.13 --||-- Writes(MB/s): 0.01 --|
|-- Mem Ch 1: Reads (MB/s): 141.17 --||-- Mem Ch 1: Reads (MB/s): 1642.35 --|
|-- Writes(MB/s): 262.84 --||-- Writes(MB/s): 11842.28 --|
|-- Mem Ch 2: Reads (MB/s): 140.44 --||-- Mem Ch 2: Reads (MB/s): 1639.97 --|
|-- Writes(MB/s): 261.67 --||-- Writes(MB/s): 11850.11 --|
|-- Mem Ch 3: Reads (MB/s): 0.46 --||-- Mem Ch 3: Reads (MB/s): 0.40 --|
|-- Writes(MB/s): 0.55 --||-- Writes(MB/s): 0.40 --|
核心原因拆解
对
-n参数的理解有误
你命令里的-n4根本不是指定使用4个内存通道!在DPDK 17.11版本中,-n的作用是设置每个内存通道预留的大页内存大小(单位MB)。要指定内存通道数量,必须用--memory-channels(简写--mc)参数。如果不手动指定,DPDK会自动检测,但在NUMA架构下有时检测不准确,就会只启用部分通道。NUMA亲和性配置不到位
虽然你加了--numa参数,但需要确认以下几点:- P0、P1端口的PCI设备是否分别绑定到不同NUMA节点的CPU?
- 大页内存是否在两个NUMA节点都有分配?如果只在一个节点开了大页,流量转发肯定只会用该节点的内存通道。
- 你选择的CPU核心
2,3,5,7,...33是否均匀分布在两个NUMA节点?要是核心集中在某几个节点,内存访问自然也会集中在对应通道。
MBuf池分配偏向单一节点
TestPMD默认会在主NUMA节点分配MBuf池,如果P0、P1的队列都绑定在同一个节点的核心上,内存访问就只会用到该节点的部分通道,导致其他通道闲置。
解决办法一步步来
1. 修正内存通道参数
修改启动命令,添加--memory-channels=4强制DPDK使用4个内存通道:
./testpmd -n4 --memory-channels=4 -l2,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33 -- --rxd=4096 --txd=4096 --numa --rxq=8 --txq=8 --nb-cores=16 --forward-mode=mac -i
小贴士:
-n4表示每个内存通道预留4MB大页,若需要更多内存可调大该值,比如-n1024就是每个通道预留1GB。
2. 优化NUMA配置
- 先梳理NUMA节点信息:用
numactl --hardware命令查看NUMA节点详情,确认P0、P1的PCI设备所属节点,再将对应CPU核心绑定到该节点。 - 给双NUMA节点分配大页:启动DPDK前,执行以下命令(以2MB大页为例):
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages - 用
--socket-mem明确分配节点内存:替换-n参数,直接指定每个NUMA节点的内存大小,比如:./testpmd --socket-mem=1024,1024 --memory-channels=4 -l2,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33 -- --rxd=4096 --txd=4096 --numa --rxq=8 --txq=8 --nb-cores=16 --forward-mode=mac -i
3. 调整MBuf池的NUMA分配
进入TestPMD交互模式后,输入set numa on命令,确保MBuf池会在对应NUMA节点分配;或者启动时添加--mbuf-pool-ops-name=rte_mempool_ops_default(默认的NUMA感知内存池)。
4. 验证效果
修改配置后重新运行TestPMD,再用PCM监测,查看4个内存通道的读写速率是否均有明显提升。
内容的提问来源于stack exchange,提问作者Anubhav Choudhary

