この機能は、NIC キューのサイズが制限されている環境でより高い PPS を実現するために、SE DP DPDK モードに導入されました。

サポートされている NIC は次のとおりです。

  • VIRTIO - KVM、OpenStack

  • ENA - AWS

ディスパッチャーごとに複数のキューを利用することで、浅いリングでより高い PPS を実現できます。これにより、パケット バースト能力が向上します。

動作環境に応じて、次の 2 つの動作モードがあります。

コンパクト モード

単一のディスパッチャーが vNIC のすべてのキューを管理します。

分散モード

複数のディスパッチャーが vNIC のキューのサブセットを管理します。

SE グループ プロパティの max_queues_per_vnic パラメータを使用して、vNIC ごとのキューの最大数を構成できます。

max_queues_per_vnic パラメータは次の値をサポートします。

  • ゼロ(予約済み):自動(NIC および動作環境に基づいてディスパッチャーごとの最適なキュー数を推測します)

  • 1(予約済み):NIC ごとに 1 つのキュー(デフォルト)

  • 整数値:2 の累乗。上限は 16 です

注:

DPDK 以外の操作モードで複数のディスパッチャーを利用するには、max_queues_per_vnic0(自動)に設定する必要があります。

移行ルーチンでは、distribute_queues が有効になっている場合、max_queues_per_vnic パラメータが num_dispatcher_cores に設定されていることを確認します。それ以外の場合、max_queues_per_vnic1 に設定されます。

移行ルーチンでは、distribute_queuesnum_dispatcher_cores の値が設定されている場合、max_queues_per_vnicnum_dispatcher_cores に設定する必要があります。distribute_queues が設定されており、num_dispatcher_cores が設定されていない場合、キューの数がディスパッチャー コアになります。

max_queues_per_vnic 値を 0(自動)に設定した場合の環境固有の動作は次のとおりです。

モード

説明

OpenStack、AWS、KVM(DPDK モード)

キューの数をディスパッチャーの数よりも高く設定して、ディスパッチャーごとに複数のキューを利用できます。

ベアメタル(DPDK モード)

キューの数は、ディスパッチャーの数と同じです。ディスパッチャーごとに 1 つのキューを利用します。

Azure、AWS(DPDK 以外のモード)

キューの数は、ディスパッチャーの数と同じです。ディスパッチャーごとに 1 つのキューを利用します。

注:

max_queues_per_vnic を利用するには、OpenStack で se_image_property パラメータと hw_vif_multiqueue_enabled パラメータを有効にする必要があります。これにより、キューの数が vCPU の数と等しくなります。

コード

説明

se_dispatcher_cores

ディスパッチャーによって処理された SE コアの総数

g_num_queues_per_dispatcher

ディスパッチャーによって処理されたキューの総数

g_num_queue_per_vnic

vNIC ごとのキューの総数

max_queues_per_vnic 値は service_engine グループ プロパティから導出されます。VIRTIO(GCP を除いた Openstack、KVM)を使用する環境では、キュー サイズは 256 で、1 つのディスパッチャー コアがすべてのキューを処理できます。この変数は se_dispatcher_cores と呼ばれます。

AWS では、リング サイズは 1,024 で、キューの数はコアの数と等しいです。したがって、キューはディスパッチャー コア間で分散されます。

この値は、次の環境に基づいて自動的に導出されます。

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

se_dispatcher_coresipstk_drv_send1 を超える場合は、キュー番号を受信します。ただし、このキューを処理するコアを決定する必要があります。

g_rss_queue_to_core_table 値は、se_dp プロセスの開始時に入力されます。この配列にキュー番号のインデックスを付けると、対応するコアが提供され、キュー番号が mbufm_rsshash フィールドに割り当てられます。ディスパッチャーは複数のキューを処理するため、rte_eth_tx_burst でこのパケットを送信するには、キュー番号を知っている必要があります。

ディスパッチャーの数が ipstk_drv_send1 と等しい場合は、キュー番号を取得して、m_rsshash フィールド イベントに割り当てますが、パケットは 1 つのコア(所有者コア)によってのみ送信されます。特定のフローに属するパケットが同じキューを使用することを確認し、所有者コアによって処理されたすべてのキューが均一にロードされることを間接的に確認します。

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_vnicnum_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
}