tbfでのバケットサイズ


11

Linuxのトークンバケットフィルター(tbf)について何度も読みましたがburstlatencyパラメーターとパラメーターを計算する方法を完全には理解していません。

妥当なレイテンシは約50 msだと思います。わかりましたが、バーストはどの値を取る必要がありますか?

マンページは言う:

後者の計算では、バケットのサイズ、レート、および場合によってはピークレート(設定されている場合)が考慮されます。これら2つのパラメーターは相互に排他的です。

では、レイテンシはバケットとフィルタにどのように関連していますか?それを計算する式はありますか?それとも、「OK、XバイトのバーストとY秒のレイテンシは私にとって良いこと」の問題ですか?


1
これが不明確であることに気付いたすべての人にとって、これtbfはLinuxトラフィック制御フレームワークの一部です。man tbfまたはman tc-tbfドキュメントを表示する必要があります。
derobert 2013

1
編集から、トークンバケットフィルターが概念的に何であるかを説明する必要があるようです。私は戻って、コンピュータ(。自分の携帯電話でこれを書いて)の前でだ後、私は私の答えに1を追加します
derobert

最後に、概念の説明に追加
デロベルト

回答:


16

マンページからの唯一の制約burstは、設定されたレートを可能にするのに十分な高さでなければならないことです。少なくともレート/ HZでなければなりません。HZはカーネル構成パラメーターです。カーネル構成を確認することで、システム上での内容を把握できます。たとえば、Debianでは次のことができます。

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

したがって、私のシステムのHZは250です。10mbpsのレートに到達するにburstは、少なくとも10,000,000ビット/秒÷250 Hz = 40,000ビット= 5000バイトが必要です。(マンページのより高い値は、HZ = 100がデフォルトであった場合のものであることに注意してください)。

しかし、これを超えて、それburstは政策ツールでもあります。それは、将来使用するためにそれを「保存」するために、より少ない帯域幅を使用できる範囲を構成します。ここでよくあることの1つは、大きなダウンロードを抑制しながら、小さなダウンロード(たとえば、Webページ)を非常に高速にしたい場合があることです。これburstは、小さなダウンロードと見なすサイズに増やすことによって行います。(ただし、htbのようなクラスフルqdiscに切り替えることが多いため、さまざまなトラフィックタイプをセグメント化できます。)

だから、:あなたが希望を達成するために、少なくとも十分な大きさであることをバースト構成しますrate。それを超えて、達成しようとしていることに応じて、さらに増やすことができます。

トークンバケットフィルターの概念モデル

トークンバケットフィルター

「バケット」は比喩的なオブジェクトです。その主要な特性は、トークンを保持できること、および保持できるトークンの数が制限されていることです。追加しようとすると、「オーバーフロー」し、余分なトークンが失われます(水を入れすぎようとするのと同じです)。実際のバケット)。バケットのサイズはと呼ばれburstます。

パケットを実際にネットワークに送信するには、そのパケットは、バイト単位のサイズまたはmpu(どちらか大きい方)に等しいトークンを取得する必要があります。

トークンを待っているパケットの行(キュー)が存在します(または存在する可能性があります)。これは、バケットが空であるか、パケットのサイズよりもトークンが少ない場合に発生します。歩道のバケットの前のスペースは非常に多く、スペースの量(バイト単位)はによって直接設定されlimitます。または、それを間接的に設定することもできますlatency(理想的な世界では、計算はrate×になりますlatency)。

カーネルがフィルターされたインターフェースからパケットを送信する場合、カーネルはパケットを行末に配置しようとします。歩道の端に底のないピットがあり、カーネルがパケットをドロップするため、歩道にスペースがない場合、それはパケットにとって残念です。

最後のピースは、追加トークン製造機であるrate/ HZトークンをバケットにすべてのダニを。(これがバケットが少なくともこの大きさでなければならない理由です。それ以外の場合、新しく作成されたトークンの一部はすぐに破棄されます)。


バーストは反対だと思いました。少しの間レートを上回り、後で平均レートに到達するために低いレートで補正されました...
sebelk

@sebelk RTFSがないとわかりませんが、tbfが現在で実行されているインターフェイスに追加された場合を除いて、同じ結果になりrateます。かといって、バケツが満杯になっていると言えばいいのですが…
derobert

@sebelk:それもまた真実です。1000バイト(バーストサイズ)のバケットがあり、トークンレートが10バイトprであるとします。第二。したがって、100秒間パケットが到着しなかった場合、バケットはいっぱいになります。次に、到着した次の1000バイトのパケットは、キューに入れられることなく、直ちに送信されます。トークン作成のレートを超える可能性があるデータレートのバースト。
Bjarke Freund-Hansen

5

デロベルトを補完する別の答え。

まず、最新のIntel CPUでは、マニュアルが古くなっています。最近のCPUには高解像度のタイマーがあり、最近のLinuxはティックが少ない-文字通りタイマーの刻みがないことを意味します。したがって、1つのタイマーでトークンを保持するのに十分な大きさのバケットを作成するすべてのコメントは無関係です。実際、バケットのアナロジーは、タイマーの粒度と送信速度の間の相互作用をユーザーが理解できるようにするためだけにありました。Linuxが最新のハードウェアでナノ秒タイマーを備えているため、その有用性は失われています。

TBFの場合、バーストパラメータは、レート制限(rateで指定)が開始する前に、無制限の速度で送信できるバイト数です。レート制限が開始されて再びバーストする唯一の方法は、送信をそのレート未満に制限することです。 。

たとえば、tbf バーストパラメータが10Kバイトで、tbf レートパラメータが2Kバイト/秒であり、現在レート制限されている(つまり、バーストが使い果たされているため、2kbpsでの送信に制限されている)とします。送信速度を10秒間1Kbpsに自発的に下げた場合、10Kバイトのバースト許容量が再び蓄積されます(=(2000 [バイト/秒]-1000 [バイト/秒])* 10秒)。tbfではバーストパラメータ以上の蓄積が許可されないため、10秒を超えて1 kbps未満に維持しても効果はありません。

支出を完全に停止した場合、5秒(= 100000 [バイト] / 2000 [バイト/秒])でバースト許容量が再び得られます。

あなたはそれを使用するためにあなたのすべてのバースト許容量を取り戻す必要はありません、あなたは蓄積したのと同じくらい使用できます。

これを見ているのもう一つの方法は次のとおりです。あなたが送信することが許可されているバースト無制限の速度でバイトを、その後、あなたの長期的な平均速度が超えることはできません率を。ただし、これは長期的な平均であるため、レートを下回ると、フルスピードで送信することで追いつくことができますが、それでも最大でバーストバイトのフル送信のみが許可されます(それができない場合あなたが追いつくことができないようにすることができます)。

TBFにはこれらのレートリミッターが2つあり、トラフィックは両方を通過する必要があります。2番目のものでは、バーストパラメータはmtuと呼ばれ、レートはpeakrateと呼ばれます。この2番目のものを使用して、最初のものがバーストを送信できる速度を制限することになっています。この2番目の使用はオプションです。使用しない場合、バーストはデバイスの速度で送信されます。

最後に、tbfには制限パラメーターがあります。プログラムが持続的にrateより速く送信する場合、パケットがキューに蓄積されます。カーネルメモリは無限ではないので、制限は、カーネルがパケットの破棄を開始する前に何バイトまで蓄積できるかを示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.