You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DPDK 17.11.1 testpmd无法利用全部内存通道的问题咨询

分析DPDK TestPMD仅使用2个内存通道的问题

问题背景

你用的是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 --|

核心原因拆解

  1. 对-n参数的理解有误
    你命令里的-n4根本不是指定使用4个内存通道!在DPDK 17.11版本中,-n的作用是设置每个内存通道预留的大页内存大小(单位MB)。要指定内存通道数量,必须用--memory-channels(简写--mc)参数。如果不手动指定,DPDK会自动检测,但在NUMA架构下有时检测不准确,就会只启用部分通道。

  2. NUMA亲和性配置不到位
    虽然你加了--numa参数,但需要确认以下几点:

    • P0、P1端口的PCI设备是否分别绑定到不同NUMA节点的CPU?
    • 大页内存是否在两个NUMA节点都有分配?如果只在一个节点开了大页,流量转发肯定只会用该节点的内存通道。
    • 你选择的CPU核心2,3,5,7,...33是否均匀分布在两个NUMA节点?要是核心集中在某几个节点,内存访问自然也会集中在对应通道。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:01:16