Contrailのサービス品質
概要: サービス品質
ネットワークのサービス品質(QoS)は、信頼性、帯域幅、遅延、およびその他のトラフィック管理機能を制御する機能を提供します。ネットワーク トラフィックは、中間ネットワーク スイッチやルーターがサービス保証を提供するために使用できる QoS ビット(DSCP、802.1p、および MPLS EXP)でマークできます。
Contrail QoS モデル
Contrail NetworkingのQoSモデルには以下の機能があります。
vRouterやゲートウェイなどのパケット転送デバイスはすべて組み合わせてシステムを形成します。
システムへのインターフェースは、タップインターフェースや物理ポートなど、システムがパケットを送受信するポートです。
ファブリック インターフェイスは、オーバーレイ トラフィックがトンネリングされる場所です。
QoSは、例えば、インターフェイスからファブリックへのトラフィック時に、システムへのイングレスで適用されます。
エグレスでは、パケットはトンネルヘッダーを取り除き、転送クラスに基づいてインターフェイスキューに送信されます。この時点では、外部パケットから内部パケットへのマーキングは考慮されません。
ファブリックインターフェイスの機能
ファブリック インターフェイスは、他のインターフェイスとは異なり、常に共有されます。したがって、ファブリック インターフェイスは共通のプロパティです。そのため、ファブリック上のトラフィック クラスと QoS マーキングは、システム管理者が制御する必要があります。管理者は、ファブリック上に異なるサービス クラスをプロビジョニングすることを選択できます。
Contrail では、サービス クラスは以下の両方によって決まります。
ファブリックインターフェイスでのキューイング(キュー、キューのスケジューリング、ドロップポリシーを含む)
転送クラス:使用するキューのマーキングや識別など、ファブリックへのパケットの送信方法を制御するマーキング方法。
テナントは、トラフィックが使用できる転送クラスを定義し、どのパケットがどの転送クラスを使用するかを決定できます。Contrail QoS 設定オブジェクトにはマッピング テーブルがあり、受信する DSCP または 802.1p 値を転送クラス マッピングにマッピングします。
QoS 構成は、仮想ネットワーク、インターフェイス、またはネットワーク ポリシーにも適用できます。
プロビジョニング用の QoS 設定パラメータ
Contrail Networkingリリース5.0以降でのQoSの設定
このセクションでは、Contrail Networkingリリース5.0以降でQoSをプロビジョニングする方法について説明します。
次に示すように、vrouter ロールの下の instances.yaml ファイルでハードウェア キューと優先度グループを定義します。
nodeh5: ip: 10.xxx.xxx.109 provider: bms roles: vrouter: VROUTER_GATEWAY: 192.168.1.45 PRIORITY_ID: 0,1,2,3,4,5,6,7 PRIORITY_BANDWIDTH: 0,10,0,20,0,30,0,40 PRIORITY_SCHEDULING: strict,rr,strict,rr,strict,rr,strict,rr QOS_QUEUE_ID: 3,11,18,28,36,43,61,53 QOS_LOGICAL_QUEUES: "[ 1, 6-10, 12-15];[40-46];[70-74, 75, 80-95];[115];[140-143, 145];[175];[245];[215]" QOS_DEF_HW_QUEUE: True openstack_compute:
プロビジョニング済みのセットアップで、次のサンプルに示すように、/ etc/contrail/common_vrouter.env ファイルで QoS 構成を定義します。
PRIORITY_ID=0,1,2,3,4,5,6,7 PRIORITY_BANDWIDTH=0,10,0,20,0,30,0,40 PRIORITY_SCHEDULING=strict,rr,strict,rr,strict,rr,strict,rr QOS_QUEUE_ID=3,11,18,28,36,43,61,53 QOS_LOGICAL_QUEUES="[ 1, 6-10, 12-15];[40-46];[70-74, 75, 80-95];[115];[140-143, 145];[175];[245];[215]" QOS_DEF_HW_QUEUE=True
コマンドを実行します
execute docker-compose up -d under /etc/contrail/vrouter/
。
キューイングの実装
vRouter は、ハードウェア キューイングとも呼ばれる、ネットワーク インターフェイスによって提供されるキューを使用するインフラストラクチャを提供します。ハードウェア キューイングを実装するネットワーク インターフェイス カード (NIC) には、キューに関連付けられた独自のスケジューリング アルゴリズムのセットがあります。Contrailの実装はほとんどのNICで動作するように設計されていますが、この方法はIntelベースの10G NIC(Nianticとも呼ばれる)でのみテストされています。
Contrail QoS 設定オブジェクト
Contrail QoS 設定オブジェクトには、次のものが含まれます。
転送クラス
QoS 設定オブジェクト(
qos-config
)
転送クラス オブジェクトは、マーキングとキューイングのパラメーターを指定します。
パケットに書き込むDSCP、802.1p、および MPLS EXP 値。
パケットに使用するキュー インデックス。
QoS 設定オブジェクトは、DSCP、802.1p、MPLS EXP 値から対応する転送クラスへのマッピングを指定します。
QoS設定には、指定されていないすべてのDSCP、802.1p、およびMPLS EXP値の転送クラスを選択するために使用するデフォルトの転送クラスIDを指定するオプションがあります。
デフォルトの転送クラス ID がユーザーによって指定されていない場合、デフォルトは ID 0 の転送クラスになります。
適用される対応する転送クラスを検索するためのQoSマーク付きパケットの処理は、次のように機能します。
IP パケットの場合、DSCP マップが使用されます。
レイヤ 2 パケットの場合、802.1p マップが使用されます。
MPLS EXP 値が指定された MPLS トンネリング パケットの場合、EXP ビット値が MPLS EXP マップで使用されます。
QoS 設定が信頼できない場合は、デフォルトの転送クラスのみが指定され、パケット内の DSCP、802.1p、および EXP ビットのすべての着信値は、同じデフォルトの転送クラスにマップされます。
図 1 に、QoS パケットの処理を示します。

仮想マシン インターフェイス、仮想ネットワーク、およびネットワーク ポリシーは、QoS 構成オブジェクトを参照できます。QoS 設定オブジェクトは仮想ホストで指定できるため、アンダーレイ トラフィックもマーキングとキューイングの対象にすることができます。 図2を参照してください。

例:転送クラスへのトラフィックのマッピング
この例では、トラフィック転送クラスの定義方法と、QoS ビットを転送クラスにマッピングするための QoS 設定オブジェクトの定義方法を示します。
表 1 は、定義された 2 つの転送クラス オブジェクトを示しています。FC1 はトラフィックに高優先度値をマークし、キュー 0 にキューイングします。FC2 はトラフィックをベスト エフォートとしてマークし、トラフィックをキュー 1 にキューイングします。
名前 |
Id |
Dscp |
802.1p |
MPLS 経験値 |
キュー |
---|---|---|---|---|---|
FC1 |
1 |
10 |
7 |
7 |
0 |
FC2 |
2 |
38 |
0 |
0 |
1 |
表 2 では、QoS 設定オブジェクトの DSCP 値 10、18、および 26 は、ID 1 の転送クラス、つまり転送クラス FC1 にマッピングされています。その他のすべての IP パケットは、ID 2 の転送クラス(FC2)にマッピングされます。802.1p 値が 6 または 7 のすべてのトラフィックは転送クラス FC1 にマッピングされ、残りのトラフィックは FC2 にマッピングされます。
Dscp |
転送クラス ID |
802.1p |
転送クラス ID |
MPLS 経験値 |
転送クラス ID |
---|---|---|---|---|---|
10 |
1 |
6 |
1 |
5 |
1 |
18 |
1 |
7 |
1 |
7 |
1 |
26 |
1 |
* |
2 |
* |
1 |
* |
2 |
|
|
|
|
パケットへのQoS設定オブジェクトのマーキング
以下のセクションでは、さまざまな状況で QoS 設定オブジェクトのマーキングがどのように処理されるかについて説明します。
- 仮想マシン インターフェイスによって発信されたトラフィック
- 仮想マシン インターフェイス宛てのトラフィック
- 仮想ホストインターフェイスからのトラフィック
- ファブリック インターフェイスからのトラフィック
- レベル別の QoS 設定の優先度
仮想マシン インターフェイスによって発信されたトラフィック
VM インターフェイスがリモート計算ノード内の別の VM に IP パケットを送信する場合、IP ヘッダーの DSCP 値を使用して qos-config テーブルを調べ、トンネル ヘッダーには転送クラスで指定された DSCP、802.1p、MPLS EXP ビットが付加されます。
VM が 802.1p 値を持つレイヤー 2 非 IP パケットを送信した場合、802.1p 値を使用して qos-config テーブルが検索され、対応する転送クラス DSCP、802.1p、MPLS EXP 値がトンネル ヘッダーに書き込まれます。
VM が同じ計算ノード内の VM に IP パケットを送信した場合、転送中にパケット ヘッダーは変更されません。元のパケットは変更されません。
仮想マシン インターフェイス宛てのトラフィック
VMIを宛先とするトラフィックの場合、トンネリングされたパケットを受信すると、トンネルヘッダーが削除され、パケットがインターフェイスに送信されます。外部パケットから内部パケットへのマーキングは行われません。
仮想ホストインターフェイスからのトラフィック
QoS 設定は、仮想ホスト インターフェイスから着信する IP トラフィックに適用できます。パケット内の DSCP 値は、仮想ホストで指定された qos-config オブジェクトを調べるために使用され、対応する転送クラスの DSCP および 802.1p 値がパケット上で上書きされます。
ファブリック インターフェイスからのトラフィック
QoS設定は、計算ノードのイーサネットインタフェースでパケットを受信している間に適用することができ、対応する転送クラスDSCPおよび802.1p値がパケット上で上書きされる。
レベル別の QoS 設定の優先度
QoS 構成は、さまざまなレベルで指定できます。
QoS で設定できるレベルとその優先順位:
ポリシー内
に
virtual-network
に
virtual-machine-interface
キュー
Contrail NetworkingはQoSをサポートします。以下のセクションでは、Contrail Networkingで使用できるキューイング機能の概要を説明します。
パケットが送信されるキューは、転送クラスによって指定されます。
データパスでのキュー選択
vRouter のデータパスでは、転送クラス番号は、Contrail の他の部分のような論理的な選択ではなく、パケットを送信する必要がある実際の物理ハードウェア キューを指定します。vRouter 構成ファイルには、物理キュー番号を論理キュー番号から変換するためのマッピング テーブルがあります。
LinuxカーネルベースのvRouterでのハードウェアキューイング
Xmit-Packet-Steering (XPS) が有効になっている場合、カーネルはキューのリストで利用可能なキューからキューを選択します。カーネルがキューを選択した場合、パケットは vRouter 指定のキューに送信されません。
このマッピングを無効にするには:
CONFIG_XPSオプションのないカーネルを持っている
/sys/class/net//queues/tx-X/xps_cpus 内のマッピング ファイルにゼロを書き込みます。
このマッピングが無効になっている場合、カーネルは特定のハードウェアキューにパケットを送信します。
確認するには:
'ethtool -S ' コマンドの出力で個々のキュー統計を参照してください。
QoS スケジューリング設定のパラメータ
次に、計算ノードのハードウェア キューのスケジューリング構成例を示します。
プライオリティグループIDと、プライオリティグループによって使用される対応するスケジューリングアルゴリズムおよび帯域幅を設定することができる。
スケジューリングアルゴリズムに指定できる値は次のとおりです。
厳しい
RR (ラウンドロビン)
ラウンドロビン・スケジューリングを使用する場合、優先順位グループが使用できるハードウェア・キュー帯域幅の合計に対するパーセンテージが bandwidth パラメーターで指定されます。
次の構成とプロビジョニングは、Niantic NICを実行し、カーネルベースのvrouterを実行しているコンピューティングノードにのみ適用されます。
qos_niantic = { ‘compute1': [ { 'priority_id': '1', 'scheduling': 'strict', 'bandwidth': '0'}, { 'priority_id': '2', 'scheduling': 'rr', 'bandwidth': '20'}, { 'priority_id': '3', 'scheduling': 'rr', 'bandwidth': '10’} ], ‘compute2' :[ { 'priority_id': '1', 'scheduling': 'strict', 'bandwidth': '0'}, { 'priority_id': '1', 'scheduling': 'rr', 'bandwidth': '30’} ] }