QoS (Quality of Service)

QoS (Quality of Service)

QoS は、帯域、遅延、ジッター、信頼性などのある種のネットワーク要件を保証する機能で、アプリケーションプロバイダーとユーザー間のサービスレベル合意 (SLA) を満たすために使用されます。

スイッチやルーターといったネットワークデバイスはトラフィックにマークを付けることができ、そららを高優先度として扱うことで、 SLA において合意された QoS 条件を達成します。他の例としては、 Voice over IP (VoIP) やビデオストリーミングなどのネットワークトラフィックを最小限の帯域制約で転送するために QoS が必要です。ネットワーク QoS 管理のないシステムでは、すべてのトラフィックは「ベストエフォート」で転送され、顧客へのサービス提供を保証することが困難になります。

QoS はサービスプラグインです。 QoS は OpenStack Networking の他のコードから様々なレベルで疎結合になっており、ML2 extension ドライバー経由で利用可能になっています。

DB モデル、 API 拡張、ユースケースなどの詳細はこのガイドの範疇を超えますが、 Neutron QoS specification に情報があります。

サポートされている QoS ルール種別

プラグインや ML2 メカニズムドライバーは、対応している QoS ルール種別を、 supported_qos_rule_types という名前のプロパティーを設定することで宣言できます。 supported_qos_rule_typesQoS ルール種別 を指定します。

注釈

Newton リリースでは、さらに DSCP マーキングがサポートされる予定です。

最も簡単な場合では、プロパティーはクラス内で単純な Python リストで定義されています。

ML2 プラグインの場合、サポートされる QoS ルール種別のリストは、有効になっている全メカニズムドライバーでサポートされているルールの共通のサブセットになります。

注釈

コアプラグインが返すサポートされているルール種別のリストは、 QoS ルールリソースにアクセスする際には適用されません。このようになっているのは、ML2 ドライバーのうち 1 つでも QoS をサポートしていないものがあると、ルールを作れなくなってしまうのが大きな理由です (執筆時点では macvtap ドライバーだけが QoS をサポートしていません)。

設定

このサービスを有効にするには、以下の手順を行います。

ネットワークノード:

  1. /etc/neutron/neutron.confservice_plugins 設定に QoS サービスを追加します。例:

    service_plugins = \
    neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,
    neutron.services.metering.metering_plugin.MeteringPlugin,
    neutron.services.qos.qos_plugin.QoSPlugin
    
  2. 必要であれば、 /etc/neutron/neutron.conf[qos] セクションで必要な notification_drivers を設定してください (デフォルト値は message_queue です)。

  3. /etc/neutron/plugins/ml2/ml2_conf.ini で、 [ml2] セクションの extension_driversqos を追加します。例:

    [ml2]
    extension_drivers = port_security, qos
    
  4. Open vSwitch エージェントを使用している場合、 /etc/neutron/plugins/ml2/openvswitch_agent.ini[agent] セクションで extensionsqos を設定します。

    [agent]
    extensions = qos
    

コンピュートノード:

  1. /etc/neutron/plugins/ml2/ml2_conf.ini で、 [agent] セクションの extensions 設定に qos を追加します。例:

    [agent]
    extensions = qos
    

注釈

現時点では QoS は ML2 でのみ動作します (Mitaka リリースでは QoS が有効なドライバーは SR-IOV、 Open vSwitch、 Linux ブリッジです)。

テナントを信頼する場合の policy.json の設定

テナントが信頼でき、クラウドでテナントが自身の 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                               |
+--------------------------------------+----------------------------------+
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.