Ukuran bucket dalam tbf

11

Saya telah membaca berkali-kali tentang token bucket filter (tbf) Linux dan saya masih tidak sepenuhnya mengerti bagaimana saya harus menghitung burstdan latencyparameter, memalukan saya :(

Saya kira latensi yang masuk akal adalah sekitar 50 ms. OK, tapi nilai apa yang harus diambil?

Halaman manual mengatakan:

Perhitungan yang terakhir memperhitungkan ukuran ember, laju dan mungkin puncaknya (jika diatur). Kedua parameter ini saling eksklusif.

Jadi, bagaimana latensi terkait dengan bucket dan filter? Apakah ada rumus untuk menghitungnya? Atau hanya soal, "OK, X byte ledakan dan Y latensi baik untuk saya"?

sebelk
sumber
1
Untuk semua orang yang menemukan ini tidak jelas: tbfadalah bagian dari kerangka kontrol lalu lintas Linux. man tbfatau man tc-tbfharus memunculkan dokumentasi.
derobert
1
Dari hasil edit Anda, sepertinya Anda memerlukan penjelasan tentang apa itu filter ember token, secara konsep. Saya akan menambahkan satu ke jawaban saya begitu saya kembali di depan komputer (menulis ini di ponsel saya.)
derobert
Akhirnya ditambahkan dalam penjelasan konseptual
derobert

Jawaban:

16

Dari halaman manual, satu-satunya kendala burstadalah bahwa itu harus cukup tinggi untuk memungkinkan tingkat Anda dikonfigurasi: itu harus setidaknya tingkat / HZ. HZ adalah parameter konfigurasi kernel; Anda dapat mencari tahu apa itu pada sistem Anda dengan memeriksa konfigurasi kernel Anda. Misalnya, di Debian, Anda dapat:

$ egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y

jadi HZ pada sistem saya adalah 250. Untuk mencapai kecepatan 10mbps, saya membutuhkan burstsetidaknya 10.000.000 bit / detik ÷ 250 Hz = 40.000 bit = 5000 byte. (Perhatikan bahwa nilai yang lebih tinggi di halaman manual berasal dari saat HZ = 100 adalah default).

Namun di luar ini, burstjuga merupakan alat kebijakan. Ini mengkonfigurasi sejauh mana Anda dapat menggunakan lebih sedikit bandwidth sekarang untuk "menyimpan" itu untuk digunakan di masa depan. Satu hal yang umum di sini adalah Anda mungkin ingin mengizinkan unduhan kecil (katakanlah, halaman web) berjalan sangat cepat, sambil membatasi unduhan besar. Anda melakukan ini dengan menambah burstukuran yang Anda anggap unduhan kecil. (Padahal, Anda sering beralih ke qdisc classfull seperti htb, sehingga Anda dapat membagi jenis lalu lintas yang berbeda.)

Jadi: Anda mengkonfigurasi burst paling tidak cukup besar untuk mencapai yang diinginkan rate. Selain itu, Anda dapat meningkatkannya lebih lanjut, tergantung pada apa yang ingin Anda capai.

Model Konseptual dari Token Bucket Filter

Filter Token Bucket

"Ember" adalah objek metaforis. Properti utamanya adalah dapat menahan token, dan jumlah token yang dapat ditahan terbatas — jika Anda mencoba untuk menambah lebih banyak, itu "meluap" dan token tambahan hilang (seperti halnya mencoba memasukkan terlalu banyak air ke dalam ember yang sebenarnya). Ukuran ember disebut burst.

Untuk benar-benar mengirimkan paket ke jaringan, paket itu harus memperoleh token yang sama dengan ukurannya dalam byte atau mpu(mana yang lebih besar).

Ada (atau bisa) satu baris (antrian) paket yang menunggu token. Ini terjadi ketika ember kosong, atau secara alternatif memiliki token yang lebih sedikit daripada ukuran paket. Hanya ada begitu banyak ruang di trotoar di depan ember, dan jumlah ruang (dalam byte) diatur langsung oleh limit. Atau, dapat diatur secara tidak langsung dengan latency(di dunia yang ideal, perhitungannya adalah rate× latency).

Ketika kernel ingin mengirim paket keluar dari antarmuka yang difilter, ia mencoba untuk menempatkan paket di akhir baris. Jika tidak ada ruang di trotoar, itu sangat disayangkan untuk paket tersebut, karena di ujung trotoar ada lubang tanpa dasar, dan kernel menjatuhkan paket.

Bagian terakhir adalah mesin pembuat token yang menambahkan rate/ HZtoken ke ember setiap centang. (Inilah sebabnya ember Anda harus setidaknya sebesar ini, jika tidak, beberapa token yang baru dicetak akan segera dibuang).

derobert
sumber
Saya berpikir bahwa ledakan itu adalah kebalikannya, bahwa Anda membiarkan melampaui tingkat sejenak, yang dikompensasi oleh tingkat yang lebih rendah kemudian untuk mencapai tingkat rata-rata ...
sebelk
@sebelk Saya tidak yakin tanpa RTFS, tetapi akan berhasil dengan hasil yang sama, kecuali untuk kasus ketika tbf ditambahkan ke antarmuka yang saat ini berjalan di atas rate. Atau tidak, seperti yang Anda bisa katakan ember mulai penuh ...
derobert
@sebelk: Itu juga benar. Katakanlah kita memiliki ember 1000 byte (ukuran burst) dan laju tokennya adalah 10 byte pr. kedua. Jadi jika tidak ada paket yang tiba selama 100 detik, ember akan terisi. Maka 1000 byte berikutnya dari paket yang tiba akan ditransmisikan segera tanpa harus antri, alias. ledakan dalam kecepatan data yang bisa di atas tingkat pembuatan token.
Bjarke Freund-Hansen
5

Jawaban lain untuk melengkapi derobert.

Pertama pada CPU Intel modern, manualnya sudah ketinggalan zaman. CPU modern memiliki pengatur waktu resolusi tinggi, dan Linux modern memiliki centang yang lebih sedikit - secara harfiah berarti tidak ada kutu waktu. Jadi semua komentar yang membuat ember cukup besar untuk menahan token dalam satu waktu tidak relevan. Bahkan analogi bucket hanya ada di sana untuk membantu pengguna memahami interaksi antara rincian waktu dan kecepatan pengiriman. Sekarang Linux memiliki timer nanosecond pada perangkat keras modern sehingga kehilangan kegunaannya.

Untuk TBF, parameter burst adalah jumlah byte yang dapat dikirim dengan kecepatan tak terbatas sebelum pembatasan laju (ditentukan oleh laju ) dimulai. Setelah pembatasan laju menendang satu-satunya cara untuk meledak lagi adalah membatasi pengiriman Anda ke bawah laju itu .

Sebagai contoh, katakanlah parameter burst tbf Anda adalah 10K byte, dan parameter laju tbf Anda adalah 2K byte / detik, dan Anda saat ini dibatasi oleh tingkat (yaitu burst habis, sehingga Anda terbatas mengirim pada 2kbps). Jika Anda secara sukarela mengurangi kecepatan yang Anda kirim menjadi 1Kbps selama 10 detik, Anda akan mengakumulasikan kembali 10K byte burst allowance Anda kembali (= (2000 [byte / detik] - 1000 [byte / detik]) * 10 detik). Menyimpannya di bawah 1kbps selama lebih dari 10detik tidak akan berpengaruh karena tbf tidak memungkinkan Anda tidak diperbolehkan untuk mengakumulasi lebih dari parameter burst .

Jika Anda berhenti menghabiskan seluruhnya maka Anda akan mendapatkan kembali tunjangan burst Anda lagi dalam 5dtk (= 100000 [byte] / 2000 [byte / detik]).

Anda tidak harus mendapatkan kembali seluruh tunjangan burst Anda untuk menggunakannya, Anda dapat menggunakan sebanyak yang telah Anda kumpulkan.

Cara lain untuk melihat ini adalah: Anda diizinkan untuk mengirim byte meledak dengan kecepatan tak terbatas, setelah itu kecepatan rata-rata jangka panjang Anda tidak pernah bisa melebihi tingkat . Namun, karena ini adalah rata-rata jangka panjang, jika Anda turun di bawah kurs Anda diizinkan untuk mengejar ketinggalan dengan mengirim dengan kecepatan penuh - tetapi bahkan kemudian Anda hanya diperbolehkan mengirim penuh untuk paling banyak byte burst (dan jika itu tidak memungkinkan Anda untuk mengejar Anda tidak bisa).

Kerut lainnya adalah TBF memiliki dua pembatas tarif ini, dan lalu lintas Anda harus melewati keduanya. Dalam yang kedua, parameter burst disebut mtu dan, dan laju disebut memuncak . Anda seharusnya menggunakan yang kedua ini untuk membatasi kecepatan yang pertama dapat mengirimnya meledak. Menggunakan yang kedua ini adalah opsional, dan jika Anda tidak menggunakannya, semburan dikirim dengan kecepatan perangkat.

Akhirnya, tbf memiliki parameter batas . Jika program terus-menerus mengirim lebih cepat daripada kecepatan , maka paket-paket akan bertambah dalam antrian. Tidak ada memori kernel yang tidak terbatas, jadi batas mengatakan berapa banyak byte dapat membangun sebelum kernel mulai membuang paket.

Russell Stuart
sumber