在 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_queues
和 num_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_property 和 hw_vif_multiqueue_enabled 参数以使用 max_queues_per_vnic。这可以确保队列数等于 vCPU 数。
代码 |
描述 |
---|---|
|
调度程序处理的总 SE 内核数 |
|
调度程序处理的总队列数 |
|
每个 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
字段事件中分配相同的编号,但仅由一个内核(即所有者内核)发出数据包。确保属于特定流的数据包使用相同的队列,从而间接确保统一加载所有者内核处理的所有队列。
|
ENA |
LSC |
VIRTIO |
注释 |
|
---|---|---|---|---|---|
自动 (0) |
自动 (0)/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 }