QoS は、帯域、遅延、ジッター、信頼性などのある種のネットワーク要件を保証する機能で、アプリケーションプロバイダーとユーザー間のサービスレベル合意 (SLA) を満たすために使用されます。
スイッチやルーターといったネットワークデバイスはトラフィックにマークを付けることができ、そららを高優先度として扱うことで、 SLA において合意された QoS 条件を達成します。他の例としては、 Voice over IP (VoIP) やビデオストリーミングなどのネットワークトラフィックを最小限の帯域制約で転送するために QoS が必要です。ネットワーク QoS 管理のないシステムでは、すべてのトラフィックは「ベストエフォート」で転送され、顧客へのサービス提供を保証することが困難になります。
QoS はサービスプラグインです。 QoS は OpenStack Networking の他のコードから様々なレベルで疎結合になっており、ML2 extension ドライバー経由で利用可能になっています。
DB モデル、 API 拡張、ユースケースなどの詳細はこのガイドの範疇を超えますが、 Neutron QoS specification に情報があります。
プラグインや ML2 メカニズムドライバーは、対応している QoS ルール種別を、 supported_qos_rule_types という名前のプロパティーを設定することで宣言できます。 supported_qos_rule_types は QoS ルール種別 を指定します。
注釈
Newton リリースでは、さらに DSCP マーキングがサポートされる予定です。
最も簡単な場合では、プロパティーはクラス内で単純な Python リストで定義されています。
ML2 プラグインの場合、サポートされる QoS ルール種別のリストは、有効になっている全メカニズムドライバーでサポートされているルールの共通のサブセットになります。
注釈
コアプラグインが返すサポートされているルール種別のリストは、 QoS ルールリソースにアクセスする際には適用されません。このようになっているのは、ML2 ドライバーのうち 1 つでも QoS をサポートしていないものがあると、ルールを作れなくなってしまうのが大きな理由です (執筆時点では macvtap ドライバーだけが QoS をサポートしていません)。
このサービスを有効にするには、以下の手順を行います。
ネットワークノード:
/etc/neutron/neutron.conf の service_plugins 設定に QoS サービスを追加します。例:
service_plugins = \
neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,
neutron.services.metering.metering_plugin.MeteringPlugin,
neutron.services.qos.qos_plugin.QoSPlugin
必要であれば、 /etc/neutron/neutron.conf の [qos] セクションで必要な notification_drivers を設定してください (デフォルト値は message_queue です)。
/etc/neutron/plugins/ml2/ml2_conf.ini で、 [ml2] セクションの extension_drivers に qos を追加します。例:
[ml2]
extension_drivers = port_security, qos
Open vSwitch エージェントを使用している場合、 /etc/neutron/plugins/ml2/openvswitch_agent.ini の [agent] セクションで extensions に qos を設定します。
[agent]
extensions = qos
コンピュートノード:
/etc/neutron/plugins/ml2/ml2_conf.ini で、 [agent] セクションの extensions 設定に qos を追加します。例:
[agent]
extensions = qos
注釈
現時点では QoS は ML2 でのみ動作します (Mitaka リリースでは QoS が有効なドライバーは SR-IOV、 Open vSwitch、 Linux ブリッジです)。
テナントが信頼でき、クラウドでテナントが自身の QoS ポリシーを管理してもよい場合は、 neutron のファイル policy.json を以下のように変更します。
/etc/neutron/policy.json のポリシーエントリーを以下のように変更します。
"get_policy": "rule:regular_user",
"create_policy": "rule:regular_user",
"update_policy": "rule:regular_user",
"delete_policy": "rule:regular_user",
帯域制限ルールを有効にする場合:
"get_policy_bandwidth_limit_rule": "rule:regular_user",
"create_policy_bandwidth_limit_rule": "rule:admin_only",
"delete_policy_bandwidth_limit_rule": "rule:admin_only",
"update_policy_bandwidth_limit_rule": "rule:admin_only",
"get_rule_type": "rule:regular_user",
DSCP マーキングを有効にする場合:
"get_policy_dscp_marking_rule": "rule:regular_user",
"create_dscp_marking_rule": "rule:admin_only",
"delete_dscp_marking_rule": "rule:admin_only",
"update_dscp_marking_rule": "rule:admin_only",
"get_rule_type": "rule:regular_user",
デフォルトの policy.json では管理者だけが QoS ポリシーを作成できます。そのため、クラウドオペレーターはクラウドテナントのために QoS ポリシーを作成する必要があります。
テナントが信頼でき、自身のポリシーを作成してもよい場合には、「テナントを信頼する場合の policy.json の設定」の節を確認してください。
最初に、 QoS ポリシーと帯域制限ルールを作成します。
$ neutron qos-policy-create bw-limiter
Created a new policy:
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| description | |
| id | 0ee1c673-5671-40ca-b55f-4cd4bbd999c7 |
| name | bw-limiter |
| rules | |
| shared | False |
| tenant_id | 85b859134de2428d94f6ee910dc545d8 |
+-------------+--------------------------------------+
$ neutron qos-bandwidth-limit-rule-create bw-limiter --max-kbps 3000 \
--max-burst-kbps 300
Created a new bandwidth_limit_rule:
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 92ceb52f-170f-49d0-9528-976e2fee2d6f |
| max_burst_kbps | 300 |
| max_kbps | 3000 |
+----------------+--------------------------------------+
注釈
バースト値はキロビットで指定します。パラメーターから連想されるようなキロビット/秒ではありません。この値は帯域制限が適用されるまでに送信できるデータ量です。
注釈
QoS 実装では、 Open vSwitch エージェントや Linux ブリッジエージェントで帯域制限ルールが適切に動作するためには、適切なバースト値が必要です。値を指定しなかった場合、デフォルト値は帯域制限の 80% になり、この値は通常の TCP トラフィックでは適切な値です。
次に、作成したポリシーを存在する neutron ポートに関連付けます。このためには、ユーザーは作成済みのポリシーを関連付けるポートの ID を取得する必要があります。以下の例では、 bw-limiter ポリシーを IP アドレス 10.0.0.3 の VM に割り当てています。
$ neutron port-list
+--------------------------------------+----------------------------------+
| id | fixed_ips |
+--------------------------------------+----------------------------------+
| 0271d1d9-1b16-4410-bd74-82cdf6dcb5b3 | { ... , "ip_address": "10.0.0.1"}|
| 88101e57-76fa-4d12-b0e0-4fc7634b874a | { ... , "ip_address": "10.0.0.3"}|
| e04aab6a-5c6c-4bd9-a600-33333551a668 | { ... , "ip_address": "10.0.0.2"}|
+--------------------------------------+----------------------------------+
$ neutron port-update 88101e57-76fa-4d12-b0e0-4fc7634b874a --qos-policy bw-limiter
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a
ポートから QoS ポリシーの関連付けを解除するには、ポート設定をもう一度更新するだけです。
$ neutron port-update 88101e57-76fa-4d12-b0e0-4fc7634b874a --no-qos-policy
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a
ポート作成時に QoS ポリシーを関連付けることもできます。
$ neutron port-create private --qos-policy-id bw-limiter
Created a new port:
+-----------------------+--------------------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------------------+
| admin_state_up | True |
| allowed_address_pairs | |
| binding:vnic_type | normal |
| device_id | |
| device_owner | |
| dns_assignment | {"hostname": "host-10-0-0-4", ... } |
| dns_name | |
| fixed_ips | {"subnet_id": |
| | "fabaf9b6-7a84-43b6-9d23-543591b531b8", |
| | "ip_address": "10.0.0.4"} |
| id | c3cb8faa-db36-429d-bd25-6003fafe63c5 |
| mac_address | fa:16:3e:02:65:15 |
| name | |
| network_id | 4920548d-1a6c-4d67-8de4-06501211587c |
| port_security_enabled | True |
| qos_policy_id | 0ee1c673-5671-40ca-b55f-4cd4bbd999c7 |
| security_groups | b9cecbc5-a136-4032-b196-fb3eb091fff2 |
| status | DOWN |
| tenant_id | 85b859134de2428d94f6ee910dc545d8 |
+-----------------------+--------------------------------------------------+
ネットワークに QoS ポリシーを関連付けることもできます。これは、そのネットワークに接続されるすべてのコンピュートポートに、デフォルトでネットワークポリシーが使用されることを意味します。ポートに特定のポリシーが付与された場合は、ポート単位のポリシー設定が優先されます。 DHCP やルーターのポートのようにネットワーク用のポートはネットワークポリシーの適用先から除外されます。
ネットワークに QoS ポリシーを付与するには、既存のネットワークを更新するか、ポリシーを付与してネットワークを作成します。
$ neutron net-update private --qos-policy bw-limiter
Updated network: private
注釈
適切なバースト値を設定するのは非常に重要です。バースト値が小さすぎると、帯域制限設定が適切であったとしても帯域の使用量が低く制限されてしまいます。この問題は様々なドキュメントで議論されています。例えば、 Juniper のドキュメント があります。 TCP トラフィックのバースト値は、所望の帯域制限値の 80% に設定します。例えば、帯域制限を 1000kbps に設定した場合、十分なバースト値は 800kbit になるでしょう。設定したバースト値が小さすぎると、実際の制限帯域は期待する帯域よりも低くなります。設定したバースト値が大きすぎると、制限がかかるパケットが少なくなりすぎ、実際の制限帯域が期待する帯域よりも大きくなることでしょう。
管理者は、テナントのポートやネットワークにポリシーを強制的に適用することができます。ポリシーが共有されていない限り、テナントは、ネットワークやポートに付与されたポリシーを解除することはできません。
ポリシーが共有されている場合、テナントは自分のポートやネットワークに共有ポリシーを付与したり解除したりできます。
実行中にルールを変更できます。ルールの変更はすべての関連ポートに反映されます。
$ neutron qos-bandwidth-limit-rule-update \
92ceb52f-170f-49d0-9528-976e2fee2d6f bw-limiter \
--max-kbps 2000 --max-burst-kbps 200
Updated bandwidth_limit_rule: 92ceb52f-170f-49d0-9528-976e2fee2d6f
$ neutron qos-bandwidth-limit-rule-show \
92ceb52f-170f-49d0-9528-976e2fee2d6f bw-limiter
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 92ceb52f-170f-49d0-9528-976e2fee2d6f |
| max_burst_kbps | 200 |
| max_kbps | 2000 |
+----------------+--------------------------------------+
帯域制限の場合と同様、 DSCP マーキングルールのポリシーを作成します。
$ neutron qos-policy-create dscp-marking
Created a new policy:
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| description | |
| id | 8569fb4d-3d63-483e-b49a-9f9290d794f4 |
| name | dscp-marking |
| rules | |
| shared | False |
| tenant_id | 85b859134de2428d94f6ee910dc545d8 |
+-------------+--------------------------------------+
neutron クライアントを使って、 DSCP マーキングの作成、更新、一覧表示、詳細表示ができます。
$ neutron qos-dscp-marking-rule-create dscp-marking --dscp-mark 26
Created a new dscp marking rule
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 115e4f70-8034-4176-8fe9-2c47f8878a7d |
| dscp_mark | 26 |
+----------------+--------------------------------------+
$ neutron qos-dscp-marking-rule-update \
115e4f70-8034-4176-8fe9-2c47f8878a7d dscp-marking --dscp-mark 22
Updated dscp_rule: 115e4f70-8034-4176-8fe9-2c47f8878a7d
$ neutron qos-dscp-marking-rule-show \
115e4f70-8034-4176-8fe9-2c47f8878a7d dscp-marking
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 115e4f70-8034-4176-8fe9-2c47f8878a7d |
| dscp_mark | 22 |
+----------------+--------------------------------------+
$ neutron qos-dscp-marking-rule-delete \
115e4f70-8034-4176-8fe9-2c47f8878a7d dscp-marking
Deleted dscp_rule: 115e4f70-8034-4176-8fe9-2c47f8878a7d
$ neutron qos-dscp-marking-rule-list
+--------------------------------------+----------------------------------+
| id | dscp_mark |
+--------------------------------------+----------------------------------+
| 115e4f70-8034-4176-8fe9-2c47f8878a7d | 22 |
+--------------------------------------+----------------------------------+
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.