Quality of Service (QoS)

Quality of Service (QoS)

QoS didefinisikan sebagai kemampuan untuk menjamin kebutuhan jaringan tertentu seperti bandwidth, latency, jitter, dan kehandalan untuk memenuhi Service Level Agreement (SLA) antara penyedia aplikasi dan pengguna akhir (end user).

Perangkat jaringan seperti switch dan router bisa menandai lalu lintas sehingga hal itu ditangani dengan prioritas yang lebih tinggi untuk memenuhi persetujuan persyaratan QoS di bawah SLA. Dalam kasus lain, lalu lintas jaringan tertentu seperti Voice over IP (VoIP) dan video streaming perlu ditransmisikan dengan keterbatasan bandwidth minimal. Pada sistem tanpa manajemen QoS jaringan, semua lalu lintas akan ditransmisikan dalam cara “best-effort” membuat mustahil untuk menjamin pelayanan kepada pelanggan.

QoS adalah plug-in layanan canggih. QoS dipisahkan dari sisa kode OpenStack Networking pada beberapa tingkat dan tersedia melalui driver ekstensi ml2.

Rincian tentang model DB, ekstensi API, dan kasus penggunaan (use case) berada di luar cakupan panduan ini, tetapi dapat ditemukan di Neutron QoS specification.

Supported QoS rule types

Driver mekanisme ml2 atau plug-in dapat mengklaim dukungan untuk beberapa tipe atauran QoS dengan menyediakan properti kelas plug-in/driver yang disebut supported_qos_rule_types yang mengembalikan daftar string yang sesuai dengan QoS rule types.

Catatan

Bandwidth limit is supported on OVS, Linux bridge, and SR-IOV mechanism drivers. For the Newton release onward DSCP marking is supported on the OVS and Linux bridge mechanism drivers, and the minimum bandwidth rules on the SR-IOV NIC mechanism driver.

Dalam kasus yang paling sederhana, properti dapat diwakili oleh daftar Python sederhana yang didefinisikan di kelas.

Untuk plug-in ml2, daftar tipe aturan QoS didukung didefinisikan sebagai subset umum aturan yang didukung oleh semua driver mekanisme aktif.

Catatan

Daftar tipe aturan yang didukung yang dilansir core plug-in tidak diberlakukan ketika mengakses sumber aturan QoS. Hal ini terutama karena ketika kita tidak mampu membuat aturan apapun sementara setidaknya satu sopir ml2 tidak memiliki dukungan untuk QoS (pada saat penulisan, hanya macvtap menjadi driver tersebut).

Konfigurasi

Untuk mengaktifkan layanan ini, ikuti langkah-langkah di bawah ini:

Pada node jaringan:

  1. Menambahkan layanan QoS ke pengaturan service_plugins dalam /etc/neutron/neutron.conf. Sebagi contoh:

    service_plugins = \
    neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,
    neutron.services.metering.metering_plugin.MeteringPlugin,
    neutron.services.qos.qos_plugin.QoSPlugin
    
  2. Secara opsional, atur yang dibutuhkan notification_drivers dalam bagian [qos] dalam /etc/neutron/neutron.conf (message_queue menjadi default).

  3. Dalam /etc/neutron/plugins/ml2/ml2_conf.ini, tambahkan qos ke extension_drivers dalam bagian [ml2]. Sebagi contoh:

    [ml2]
    extension_drivers = port_security, qos
    
  4. Jika agen Open vSwitch sedang digunakan, atur extensions ke qos dalam bagian [agent] dari /etc/neutron/plugins/ml2/openvswitch_agent.ini. Sebagai contoh:

    [agent]
    extensions = qos
    

Pada node komputasi:

  1. Dalam /etc/neutron/plugins/ml2/openvswitch_agent.ini, tambahkan qos ke pengaturan extensions dalam bagian [agent]. Sebagai contoh:

    [agent]
    extensions = qos
    

Catatan

QoS saat ini bekerja dengan ML2 saja (SR-IOV, Open vSwitch, dan linuxbridge adalah driver yang diaktifkan untuk QoS dalam rilis Mitaka).

Konfigurasi policy.json proyek terpercaya

Jika proyek dipercaya melakukan administrasi kebijakan QoS sendiri di cloud Anda, file policy.json milik neutron ini dapat dimodifikasi untuk memberi ini.

Modifikasi entri kebijakan /etc/neutron/policy.json sebagai berikut:

"get_policy": "rule:regular_user",
"create_policy": "rule:regular_user",
"update_policy": "rule:regular_user",
"delete_policy": "rule:regular_user",
"get_rule_type": "rule:regular_user",

Untuk mengaktifkan aturan batas bandwidth:

"get_policy_bandwidth_limit_rule": "rule:regular_user",
"create_policy_bandwidth_limit_rule": "rule:regular_user",
"delete_policy_bandwidth_limit_rule": "rule:regular_user",
"update_policy_bandwidth_limit_rule": "rule:regular_user",

Mengaktifkan aturan DSCP marking:

"get_policy_dscp_marking_rule": "rule:regular_user",
"create_dscp_marking_rule": "rule:regular_user",
"delete_dscp_marking_rule": "rule:regular_user",
"update_dscp_marking_rule": "rule:regular_user",

To enable minimum bandwidth rule:

"get_policy_minimum_bandwidth_rule": "rule:regular_user",
"create_policy_minimum_bandwidth_rule": "rule:regular_user",
"delete_policy_minimum_bandwidth_rule": "rule:regular_user",
"update_policy_minimum_bandwidth_rule": "rule:regular_user",

Alur kerja pengguna

Kebijakan QoS hanya dibuat oleh admin dengan policy.json default. Oleh karena itu, Anda harus memiliki operator cloud mengaturnya atas nama proyek cloud.

Jika proyek dipercaya untuk membuat kebijakan mereka sendiri, periksa bagian konfigurasi policy.json proyek dipercaya.

Pertama, buat kebijakan QoS dan aturan batas bandwidth:

$ 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                                 |
+----------------+--------------------------------------+

Catatan

Burst value diberikan dalam kilobit, bukan di kilobit per detik sebagai nama parameter mungkin menyarankan. Ini adalah jumlah data yang dapat dikirim sebelum batas bandwidth berlaku.

Catatan

Pelaksanaan QoS memerlukan burst value untuk memastikan perilaku yang tepat dari aturan batas bandwidth dalam agen Open vSwitch dan Linux bridge. Jika Anda tidak memberikan nilai, standarnya ke 80% dari batas bandwidth yang bekerja untuk lalu lintas TCP tipikal.

Kedua, kaitkan kebijakan yang dibuat dengan port neutron yang ada. Untuk melakukan ini, pengguna mengekstrak id port yang akan dikaitkan dengan kebijakan yang sudah dibuat. Pada contoh berikut, kita akan menetapkan kebijakan bb-limiter ke VM dengan alamat IP 192.0.2.1.

$ neutron port-list

+--------------------------------------+-----------------------------------+
| id                                   | fixed_ips                         |
+--------------------------------------+-----------------------------------+
| 0271d1d9-1b16-4410-bd74-82cdf6dcb5b3 | { ... , "ip_address": "192.0.2.1"}|
| 88101e57-76fa-4d12-b0e0-4fc7634b874a | { ... , "ip_address": "192.0.2.3"}|
| e04aab6a-5c6c-4bd9-a600-33333551a668 | { ... , "ip_address": "192.0.2.2"}|
+--------------------------------------+-----------------------------------+

$ neutron port-update 88101e57-76fa-4d12-b0e0-4fc7634b874a --qos-policy bw-limiter
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a

Dalam rangka untuk melepaskan port dari kebijakan QoS, hanya update lagi konfigurasi port.

$ neutron port-update 88101e57-76fa-4d12-b0e0-4fc7634b874a --no-qos-policy
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a

Port dapat dibuat dengan kebijakan yang menyertainya juga.

$ 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-192-0-2-4", ...   }           |
| dns_name              |                                                  |
| fixed_ips             | {"subnet_id":                                    |
|                       |         "fabaf9b6-7a84-43b6-9d23-543591b531b8",  |
|                       |          "ip_address": "192.0.2.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                 |
+-----------------------+--------------------------------------------------+

Anda dapat melekatkan jaringan untuk kebijakan QoS. Artinya ini adalah bahwa port komputasi terhubung ke jaringan akan menggunakan kebijakan jaringan secara default kecuali port memiliki kebijakan tertentu yang melekat padanya. Jaringan port yang dimiliki seperti DHCP dan router port dikecualikan dari kebijakan aplikasi jaringan.

Dalam rangka untuk melekatkan kebijakan QoS untuk jaringan, perbarui jaringan yang ada, atau buat secara awal jaringan yang melekat pada kebijakan.

$ neutron net-update private --qos-policy bw-limiter
Updated network: private

Catatan

Konfigurasi burst value yang tepat sangat penting. Jika burst value diatur terlalu rendah, penggunaan bandwidth akan tercekik bahkan dengan pengaturan batas bandwidth yang tepat sekalipun. Masalah ini dibahas dalam berbagai sumber dokumentasi, misalnya di Juniper’s documentation. Burst value untuk lalu lintas TCP dapat ditetapkan sebagai 80% dari nilai yang diinginkan batas bandwidth. Sebagai contoh, jika batas bandwidth diatur ke 1000kbps maka burst value yang cukup akan menjadi 800kbit. Jika burst value dikonfigurasi terlalu rendah, batas bandwidth yang dicapai akan lebih rendah dari yang diharapkan. Jika burst value dikonfigurasi terlalu tinggi, terlalu sedikit paket bisa dibatasi dan batas bandwidth mencapai akan lebih tinggi dari yang diharapkan.

Penegakan administrator

Administrator dapat menegakkan kebijakan pada port proyek atau jaringan. Selama kebijakan tersebut tidak dibagi, proyek ini tidak dapat melepaskan kebijakan apa saja yang melekat ke jaringan atau port.

Jika kebijakan ini bersama, proyek ini dapat melekatkan atau melepaskan kebijakan tersebut dari port dan jaringan itu sendiri.

Modifikasi aturan

Anda dapat memodifikasi aturan pada saat runtime. Modifikasi aturan akan disebarkan ke port yang terpasang.

$ 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                                 |
+----------------+--------------------------------------+

Sama seperti dengan bandwidth yang membatasi, buat kebijakan untuk aturan DSCP marking:

$ 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     |
+-------------+--------------------------------------+

Anda dapat membuat, memperbarui, mendaftar, menghapus, dan menunjukkan DSCP marking dengan klien neutron:

$ 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-list dscp-marking

+--------------------------------------+----------------------------------+
| id                                   | dscp_mark                        |
+--------------------------------------+----------------------------------+
| 115e4f70-8034-4176-8fe9-2c47f8878a7d | 22                               |
+--------------------------------------+----------------------------------+

$ 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

You can also include minimum bandwidth rules in your policy:

$ openstack network qos policy create bandwidth-control
+-------------+--------------------------------------+
| Field       | Value                                |
+-------------+--------------------------------------+
| description |                                      |
| id          | 8491547e-add1-4c6c-a50e-42121237256c |
| name        | bandwidth-control                    |
| project_id  | 7cc5a84e415d48e69d2b06aa67b317d8     |
| rules       | []                                   |
| shared      | False                                |
+-------------+--------------------------------------+

$ openstack network qos rule create bandwidth-control \
  --type minimum-bandwidth --min-kbps 1000 --egress
+------------+--------------------------------------+
| Field      | Value                                |
+------------+--------------------------------------+
| direction  | egress                               |
| id         | da858b32-44bc-43c9-b92b-cf6e2fa836ab |
| min_kbps   | 1000                                 |
| name       | None                                 |
| project_id |                                      |
+------------+--------------------------------------+

A policy with a minimum bandwidth ensures best efforts are made to provide no less than the specified bandwidth to each port on which the rule is applied. However, as this feature is not yet integrated with the Compute scheduler, minimum bandwidth cannot be guaranteed.

It is also possible to combine several rules in one policy:

$ openstack network qos rule create bandwidth-control \
  --type bandwidth-limit --max-kbps 50000 --max-burst-kbits 50000
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| id             | 0db48906-a762-4d32-8694-3f65214c34a6 |
| max_burst_kbps | 50000                                |
| max_kbps       | 50000                                |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

$ openstack network qos policy show bandwidth-control
+-------------+-------------------------------------------------------------------+
| Field       | Value                                                             |
+-------------+-------------------------------------------------------------------+
| description |                                                                   |
| id          | 8491547e-add1-4c6c-a50e-42121237256c                              |
| name        | bandwidth-control                                                 |
| project_id  | 7cc5a84e415d48e69d2b06aa67b317d8                                  |
| rules       | [{u'max_kbps': 50000, u'type': u'bandwidth_limit',                |
|             |   u'id': u'0db48906-a762-4d32-8694-3f65214c34a6',                 |
|             |   u'max_burst_kbps': 50000,                                       |
|             |   u'qos_policy_id': u'8491547e-add1-4c6c-a50e-42121237256c'},     |
|             |  {u'direction':                                                   |
|             |   u'egress', u'min_kbps': 1000, u'type': u'minimum_bandwidth',    |
|             |   u'id': u'da858b32-44bc-43c9-b92b-cf6e2fa836ab',                 |
|             |   u'qos_policy_id': u'8491547e-add1-4c6c-a50e-42121237256c'}]     |
| shared      | False                                                             |
+-------------+-------------------------------------------------------------------+
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.