この機能は、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_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 モード) |
キューの数は、ディスパッチャーの数と同じです。ディスパッチャーごとに 1 つのキューを利用します。 |
Azure、AWS(DPDK 以外のモード) |
キューの数は、ディスパッチャーの数と同じです。ディスパッチャーごとに 1 つのキューを利用します。 |
max_queues_per_vnic を利用するには、OpenStack で se_image_property パラメータと hw_vif_multiqueue_enabled パラメータを有効にする必要があります。これにより、キューの数が vCPU の数と等しくなります。
コード |
説明 |
---|---|
|
ディスパッチャーによって処理された SE コアの総数 |
|
ディスパッチャーによって処理されたキューの総数 |
|
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_cores
が ipstk_drv_send
の 1
を超える場合は、キュー番号を受信します。ただし、このキューを処理するコアを決定する必要があります。
g_rss_queue_to_core_table
値は、se_dp
プロセスの開始時に入力されます。この配列にキュー番号のインデックスを付けると、対応するコアが提供され、キュー番号が mbuf
の m_rsshash
フィールドに割り当てられます。ディスパッチャーは複数のキューを処理するため、rte_eth_tx_burst
でこのパケットを送信するには、キュー番号を知っている必要があります。
ディスパッチャーの数が ipstk_drv_send
の 1
と等しい場合は、キュー番号を取得して、m_rsshash
フィールド イベントに割り当てますが、パケットは 1 つのコア(所有者コア)によってのみ送信されます。特定のフローに属するパケットが同じキューを使用することを確認し、所有者コアによって処理されたすべてのキューが均一にロードされることを間接的に確認します。
|
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 }