Berbagi Bandwidth dan Memprioritaskan Lalu Lintas Waktu Nyata melalui HTB, Skenario Mana yang Lebih Baik?

10

Saya ingin menambahkan semacam manajemen lalu lintas ke jalur Internet kami. Setelah membaca banyak dokumentasi, saya pikir HFSC terlalu rumit untuk saya (saya tidak mengerti semua hal kurva, saya khawatir saya tidak akan pernah bisa melakukannya dengan benar), CBQ tidak merekomendasikan, dan pada dasarnya HTB adalah cara untuk pergi untuk kebanyakan orang.

Jaringan internal kami memiliki tiga "segmen" dan saya ingin berbagi bandwidth kurang lebih sama antara mereka (setidaknya di awal). Selanjutnya saya harus memprioritaskan lalu lintas sesuai dengan setidaknya tiga jenis lalu lintas (lalu lintas waktu nyata, lalu lintas standar, dan lalu lintas massal). Pembagian bandwidth tidak sepenting kenyataan bahwa trafik real-time harus selalu diperlakukan sebagai trafik premium jika memungkinkan, tetapi tentu saja tidak ada kelas trafik lain yang mungkin kelaparan juga.

Pertanyaannya adalah, apa yang lebih masuk akal dan juga menjamin throughput waktu nyata yang lebih baik:

  1. Membuat satu kelas per segmen, masing-masing memiliki tingkat yang sama (prioritas tidak masalah untuk kelas yang tidak ada daun menurut pengembang HTB) dan masing-masing kelas ini memiliki tiga sub-kelas (daun) untuk 3 tingkat prioritas (dengan prioritas yang berbeda dan tingkat yang berbeda).

  2. Memiliki satu kelas per tingkat prioritas di atas, masing-masing memiliki tingkat yang berbeda (sekali lagi prioritas tidak masalah) dan masing-masing memiliki 3 sub-kelas, satu per segmen, sedangkan ketiga kelas realtime memiliki prio tertinggi, prio terendah dalam jumlah besar kelas, dan sebagainya.

Saya akan mencoba membuatnya lebih jelas dengan gambar seni ASCII berikut:

Case 1:

root --+--> Segment A
       |       +--> High Prio
       |       +--> Normal Prio
       |       +--> Low Prio
       |
       +--> Segment B
       |       +--> High Prio
       |       +--> Normal Prio
       |       +--> Low Prio
       |
       +--> Segment C
               +--> High Prio
               +--> Normal Prio
               +--> Low Prio

Case 2:

root --+--> High Prio
       |        +--> Segment A
       |        +--> Segment B
       |        +--> Segment C
       |
       +--> Normal Prio
       |        +--> Segment A
       |        +--> Segment B
       |        +--> Segment C
       |
       +--> Low Prio
                +--> Segment A
                +--> Segment B
                +--> Segment C

Kasus 1 Sepertinya cara kebanyakan orang akan melakukannya, tetapi kecuali saya tidak membaca detail implementasi HTB dengan benar, Kasus 2 mungkin menawarkan prioritas yang lebih baik.

Manual HTB mengatakan, bahwa jika suatu kelas mencapai tingkatnya, ia dapat meminjam dari induknya dan ketika meminjam, kelas dengan prioritas yang lebih tinggi selalu mendapatkan bandwidth yang ditawarkan terlebih dahulu. Namun, ia juga mengatakan bahwa kelas-kelas yang memiliki bandwidth yang tersedia di tingkat pohon yang lebih rendah selalu lebih disukai daripada kelas-kelas di tingkat pohon yang lebih tinggi, terlepas dari prioritas .

Mari kita asumsikan situasi berikut: Segmen C tidak mengirimkan lalu lintas apa pun. Segmen A hanya mengirimkan lalu lintas waktu nyata, secepat mungkin (cukup untuk menjenuhkan tautan saja) dan Segmen B hanya mengirimkan lalu lintas massal, secepat mungkin (sekali lagi, cukup untuk menjenuhkan tautan lengkap saja). Apa yang akan terjadi?

Kasus 1:
Segmen A-> High Prio dan Segmen B-> Low Prio keduanya memiliki paket untuk dikirim, karena A-> High Prio memiliki prioritas yang lebih tinggi, ia akan selalu dijadwalkan terlebih dahulu, hingga mencapai tingkatnya. Sekarang mencoba untuk meminjam dari Segmen A, tetapi karena Segmen A berada pada tingkat yang lebih tinggi dan Segmen B-> Low Prio belum mencapai tingkatnya, kelas ini sekarang dilayani terlebih dahulu, sampai ia juga mencapai tingkat dan ingin meminjam dari Segmen B. Setelah keduanya mencapai tingkat mereka, keduanya berada pada tingkat yang sama lagi dan sekarang Segmen A-> High Prio akan menang lagi, hingga mencapai tingkat Segmen A. Sekarang mencoba untuk meminjam dari root (yang memiliki banyak lalu lintas cadangan, karena Segmen C tidak menggunakan lalu lintas yang dijamin), tetapi sekali lagi, ia harus menunggu Segmen B-> Low Prio untuk juga mencapai tingkat root. Begitu itu terjadi,

Kasus 2:
High Prio-> Segmen A dan Low Prio-> Segmen B keduanya memiliki paket untuk dikirim, sekali lagi High Prio-> Segmen A akan menang karena memiliki prioritas yang lebih tinggi. Setelah mencapai tingkat, ia mencoba untuk meminjam dari High Prio, yang memiliki cadangan bandwidth, tetapi berada pada tingkat yang lebih tinggi, ia harus menunggu Low Prio-> Segmen B lagi untuk juga mencapai tingkatnya. Setelah keduanya mencapai tingkat mereka dan keduanya harus meminjam, High Prio-> Segmen A akan menang lagi sampai mencapai tingkat kelas High Prio. Setelah itu terjadi, ia mencoba meminjam dari root, yang lagi-lagi memiliki banyak bandwidth tersisa (semua bandwidth Normal Prio tidak digunakan saat ini), tetapi harus menunggu lagi sampai Low Prio-> Segmen B mencapai batas laju Kelas Low Prio dan juga mencoba meminjam dari root. Akhirnya kedua kelas mencoba meminjam dari root, prioritas diperhitungkan, dan High Prio->

Kedua kasus tersebut tampak kurang optimal, karena bagaimanapun lalu lintas waktu nyata terkadang harus menunggu lalu lintas massal, walaupun ada banyak bandwidth yang tersisa yang dapat dipinjam. Namun, dalam kasus 2 sepertinya lalu lintas waktu nyata harus menunggu kurang dari dalam kasus 1, karena hanya harus menunggu sampai tingkat lalu lintas massal tercapai, yang kemungkinan besar lebih kecil daripada tingkat seluruh segmen (dan dalam kasus 1 itu adalah tarif yang harus ditunggu). Atau saya benar-benar salah di sini?

Saya berpikir tentang pengaturan yang lebih sederhana, menggunakan qdisc prioritas. Tetapi antrian prioritas memiliki masalah besar yang menyebabkan kelaparan jika tidak terbatas. Kelaparan tidak bisa diterima. Tentu saja seseorang dapat menempatkan TBF (Token Bucket Filter) ke dalam setiap kelas prioritas untuk membatasi tingkat dan dengan demikian menghindari kelaparan, tetapi ketika melakukannya, kelas prioritas tunggal tidak dapat menjenuhkan tautan dengan lebih lama lagi, bahkan jika semua kelas prioritas lainnya kosong, TBF akan mencegah hal itu terjadi. Dan ini juga kurang optimal, karena mengapa sebuah kelas tidak akan mendapatkan 100% dari bandwidth jalur jika tidak ada kelas lain yang membutuhkannya saat ini?

Ada komentar atau ide mengenai pengaturan ini? Tampaknya sangat sulit dilakukan dengan menggunakan qcis tc standar. Sebagai seorang programmer, itu adalah tugas yang mudah jika saya bisa menulis penjadwal saya sendiri (yang saya tidak boleh melakukannya).

Mecki
sumber

Jawaban:

1

Jika saya mengerti htb dengan benar, maka kursnya "dijamin". Ini berarti Anda memiliki gagasan tentang tingkat lalu lintas "waktu nyata". Hanya jika kurs ini terlampaui, ia akan meminjam. Jika beberapa kelas ingin meminjam, prio harus dimulai. Tarif yang dijamin akan menambah batas fisik. Kalau tidak, itu terlalu merepotkan.

IMHO, Kasus A tidak akan pernah benar-benar berfungsi karena Anda harus memiliki prioritas atau pembatasan tingkat di tingkat root. Prioritas / tarif di segmen yang berbeda tidak tahu apa-apa tentang satu sama lain dan akan ditangani secara adil.

Hal yang mungkin Anda inginkan adalah: Letakkan "rate" untuk prio rendah dan normal ke 0 atau dekat dengan itu dan tambahkan "plafon" untuk sisa bandwidth, untuk prio tinggi Anda menjamin tingkat 100% dari fisik.

AndreasM
sumber