在 SE DP DPDK 模式下引入了该功能,以便在网卡队列大小有限的环境中实现更高的 PPS。

以下是支持的网卡:

  • VIRTIO - KVM、OpenStack

  • ENA - AWS

您可以在每个调度程序中使用多个队列,以通过浅环实现更高的 PPS,从而提高数据包突发能力。

根据运行环境,可以使用以下两种运行模式:

精简式模式

单个调度程序管理 vNIC 的所有队列。

分布式模式

多个调度程序分别管理 vNIC 的一部分队列。

您可以使用 SE 组属性中的 max_queues_per_vnic 参数配置每个 vNIC 的最大队列数。

max_queues_per_vnic 参数支持以下值:

  • 零(保留)- 自动(根据网卡和运行环境推断每个调度程序的最佳队列数)

  • 1(保留)- 每个网卡一个队列(默认)

  • 整数值 - 2 的幂;最大限制为 16

注:

对于非 DPDK 运行模式,您必须将 max_queues_per_vnic 设置为 0(自动)以使用多个调度程序。

迁移例程确保在启用了 distribute_queues 时将 max_queues_per_vnic 参数设置为 num_dispatcher_cores,否则,max_queues_per_vnic 将设置为 1

迁移例程确保在设置了 distribute_queuesnum_dispatcher_cores 值时,max_queues_per_vnic 必须设置为 num_dispatcher_cores。如果设置了 distribute_queues,而未设置 num_dispatcher_cores,则队列数是调度程序内核数。

以下是将 max_queues_per_vnic 值设置为 0(自动)时的环境特定行为:

模式

描述

OpenStack、AWS、KVM(DPDK 模式)

队列数可以超过调度程序数,以便每个调度程序使用多个队列。

裸机(DPDK 模式)

队列数与调度程序数相同。每个调度程序使用一个队列。

Azure、AWS(非 DPDK 模式)

队列数与调度程序数相同。每个调度程序使用一个队列。

注:

您需要在 OpenStack 中启用 se_image_propertyhw_vif_multiqueue_enabled 参数以使用 max_queues_per_vnic。这可以确保队列数等于 vCPU 数。

代码

描述

se_dispatcher_cores

调度程序处理的总 SE 内核数

g_num_queues_per_dispatcher

调度程序处理的总队列数

g_num_queue_per_vnic

每个 vNIC 的总队列数

max_queues_per_vnic 值是从 service_engine 组属性得出的,在使用 VIRTIO(OpenStack、KVM,不包括 GCP)的环境中,队列大小为 256,一个调度程序内核可以处理 vNIC 的所有队列。该变量称为 se_dispatcher_cores

在 AWS 中,环大小为 1024,队列数等于内核数。因此,将在调度程序内核之间分配队列。

该值是根据以下环境自动得出的:

se_dispatcher_cores = max_queues_per_vnic/ g_num_queues_per_dispatcher

在 VIRTIO(不包括 GCP)中:

g_num_queues_per_dispatcher = max_queues_per_vnic

在 AWS 中:

g_num_queues_per_dispatcher = max_queues_per_vnic/ num_dispatcher_cores_available

如果 ipstk_drv_send 中的 se_dispatcher_cores 大于 1,您将收到队列编号。不过,您需要确定处理该队列的内核。

g_rss_queue_to_core_table 值是在 se_dp 进程初始化期间填充的。使用队列编号为该数组编制索引将提供相应的内核,并将队列编号分配给 mbuf 中的 m_rsshash 字段。由于调度程序处理多个队列,因此,它必须知道队列编号才能在 rte_eth_tx_burst 中发出该数据包。

如果 ipstk_drv_send 中的调度程序数等于 1,您将获得队列编号,并在 m_rsshash 字段事件中分配相同的编号,但仅由一个内核(即所有者内核)发出数据包。确保属于特定流的数据包使用相同的队列,从而间接确保统一加载所有者内核处理的所有队列。

num_dispatcher_cores

ENA

LSC

VIRTIO

注释

自动 (0)

自动 (0)/N

分布式

分布式

精简式

如果 num_dispatcher_cores 是 N 并且 max_queues_per_vnic 是 0,则 max_queues_per_vnic 也是 N。

N

自动 (0)/N

分布式

分布式

精简式

将在 show serviceengine <se> se_agent 中指示每个调度程序的队列数。

对于迁移例程,max_queues_per_vnic 等于 num_dispatcher_cores(在 num_dispatcher_cores > 0 时)。

max_queues_per_vnic 为零(自动)时,您需要限制每个调度程序的最大队列数:先确定最不常见的最大环大小,然后相应地限制每个调度程序的最大队列数。目的是使用足够数量的队列,以尽可能实现汇总环大小 4096。这可以确保保留 CPU 资源,并实现最佳的 PPS/突发能力。

"ring-size-max-qs-per-disp": {
    "128": 32,
    "256": 16,
    "512": 8,
    "1024": 4,
    "2048": 2,
    "4096": 1,
    "8192": 1,
    "default": 1
}