DPDK-流分类与多队列

本文详细介绍了DPDK中的多队列技术和流分类技术,包括RSS和Flow Director,阐述了多队列的由来、DPDK如何利用多队列提升性能,并探讨了流分类在QoS、流过滤等方面的应用。通过对Intel网卡的示例,展示了如何在DPDK中配置和使用这些技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前言

多队列与流分类技术基本被应用到所有DPDK网关类项目中,比如开源的DPVS,美团的四层网关等等,利用多队列及分流技术可以使得网卡更好地与多核处理器,多任务系统配合,从而达到更高效IO处理的目的。

这章节以英特尔的网卡为例,介绍多队列和流分类是如何合工作的 ,各种分类方式适合哪些场景,DPDK怎么利用这些网卡特性。

2.多队列

2.1 网卡多队列的由来

谈到这个网卡多队列,显而易见说的就是传统网卡的DMA队列有多个,网卡有基于多个DMA队列的分配机制。图中是Intel 82580网卡示意图,我们能看到多队列分配在网卡中的位置。

图2-1 82580网卡简易框图

网卡多队列技术与多核处理器技术密不可分,早期的多数计算机,处理器只有一个核,从网卡上收到的以太网报文都需要这个处理核处理。随着半导体技术发展,处理器上核的数量不断在增加,与此同时就带来一个问题:网卡上收到的报文由哪个核来处理?如何分配不同的核上去处理呢?随着网络带宽的不断提升,当端口速率从10Mbit/s100Mbit/s进入1Gbit/s10Gbit/s,单个处理器核肯定是不够满足高速网卡快速处理的需求的,从2007年开始Intel的82575和82598网卡上就引入了多队列技术,可以将各个队列通过绑定到不同的核上来满足高速流量的需求。现在100G、400G的网卡更是支持越来越多的队列数目,除此之外,多队列技术也可以进行流分类处理,以及解决网络IO服务质量QOS,针对不同的优先级进行限速和调度。

强调一下网卡多队列技术是一个硬件手段,需要软件结合将它利用起来才能达到设计目的,分而治之,根据多队列进行流分类,这样应用就可以根据自己的需求将数据包进行控制,可以想象一下哪些场景我们需要这种技术去解决哪些问题,从数据包的响应速度,数据包分类,队列优先级,等等方向来考虑,我相信大家一定能在自己的工作场景使用此技术解决这类问题。

2.2 DPDK与多队列

我们从DPDK提供的一些列以太网设备API入手,可以发现Packet I/O机制与生俱来的支持多队列功能,可以根据不同平台或者需求,选择需要支持的队列数目,可以很方便地使用队列,指定队列发送或者接收,由于这样的特性,可以很容易实现CPU核、缓存与网卡多队列之间的亲和性从而到达很好的性能。

从例子里的l3fwd里也能看出,单个核上运行的程序从指定队列上接受,往指定队列上发送,可以达到很高的cache命中率,效率也就会高。

从RTC模型为例来看,核、内存、网卡队列之间的关系理解DPDK是如何利用网卡多队列技术带来的性能提升。

  • 将网卡的某个队列分配給某个核,从该队列中收到的报文都应当在该指定的核上处理结束。
  • 从核对应的本地存储分配内存池,接收报文和对应的报文描述符都位于该内存池。
  • 为每个核分配一个单独的发送队列,发送报文和对应的报文描述符都位于该核和发送队列对应的本地内存池中。

所以通常情况我们绑定一个核使用一个单独的发送队列来避免多个核访问同一个队列带来的锁开销。当然也可以绑定多个队列到一个核,总之在设计时尽量避免引入保护队列的机制。

对应的可以看源码中l3fwd的例子,其中每个核对应结构中记录了操作的队列是哪个队列。

除了队列和核之间的亲和性这个主要目的之外,网卡多队列机制还可以用与Qos调度、虚拟化等。

2.3 多队列分配

看到这里读者一定会疑问我们可以设定不同的队列包收到不同的核去处理,那么网卡又是怎么把网络报文分发到不同

### 启用 DPDK TestPMD 中的多流支持 为了在 DPDK 的 TestPMD 应用程序中启用多流支持,需要配置多个数据包转发路径以及相应的队列设置。以下是实现这一目标的关键要点: #### 配置 Hugepages 和内存资源 首先,确保已分配足够的 hugepage 内存供 DPDK 使用。可以通过 `dpdk-setup.sh` 工具完成此操作[^1]。运行以下命令来初始化 hugepage 设置: ```bash $ sudo ./usertools/dpdk-setup.sh ``` 这一步骤对于任何基于 DPDK 的应用程序都是必要的。 #### 测试环境准备 如果计划在一个虚拟机环境中测试,则需确认 `/etc/qemu/bridge.conf` 文件存在并适当配置[^3]。即使该文件为空,也应确保其可用性以便后续网络桥接功能正常工作。 #### 多核 CPU 支持 TestPMD 可通过指定核心掩码参数启动以利用多处理器能力处理不同流量流。例如,在启动时可以定义 `-c` 参数用于指明哪些逻辑CPU参执行任务;同时还需要设定 `-n` 来决定内存通道数目。下面是一个典型例子展示如何开启四个线程来进行并发处理: ```bash ./x86_64-native-linuxapp-gcc/app/testpmd \ -l 0-3 -n 4 -- -i --rxq=2 --txq=2 --nb-cores=4 ``` 在此命令行选项里: - `-l 0-3`: 表示使用第零到第三个逻辑CPU. - `--rxq=2`, `--txq=2`: 定义接收和发送方向上的队列数量均为两个。 - `--nb-cores=4`: 明确告知应用总共要激活四颗物理或者逻辑核心参到数据平面的工作当中去. 上述配置允许每个网卡端口拥有独立的数据传输管道从而达到提升吞吐量的目的。 #### 转发模式调整 除了基本硬件资源配置之外, 还应当考虑改变默认的数据包转发策略使得它能够适应更复杂的业务场景需求. 对于多条输入输出链路而言,"flow director" 或者 "RSS(receive side scaling)" 技术可以帮助分类来自同一源地址但目的地各异的数据帧进而分派给不同的cpu core 去单独计算而不互相干扰. 具体来说就是在启动 testpmd之后进入交互界面再执行如下指令切换成适合大规模连接数目的模式比如 matrix forwarder : ```plaintext set fwd io start port stop all reset port config all set nbportstatsall off set promisc all off port start all show port info all do flow create ... start tx_first ``` 其中最重要的部分就是创建自定义 flows 并绑定特定条件的动作集。“flows”的概念在这里指的是依据五元组信息(源IP 地址、目的 IP 地址、协议类型、源端口号及目地端口号)或者其他特征字段匹配出来的规则集合体; 当某个新到达的数据报满足某一条预设好的 rule 则按照既定方案实施下一步动作诸如重定向至另一个出口接口或是丢弃等等行为。 以上方法共同作用下即可成功构建起具备良好扩展性的高性能网络服务架构体系结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值