何度も読みました。Linux用トークンバケットフィルタ(tbf)そして、私はまだ計算burst
とlatency
パラメータがどのように実行されるべきかを完全に理解していません。恥ずかしいことです:(
合理的な遅延時間は約50ミリ秒程度だと思います。いいですね。しかし、バーストはどのような値を取るべきですか?
マニュアルページには次のように記載されています。
後者の計算では、バケットのサイズ、速度、および可能な最高速度(設定されている場合)を考慮します。これら2つのパラメータは相互に排他的です。
では、遅延時間はバケットやフィルタとどのような関係がありますか?計算する式がありますか?それとも、「いいね、XバイトのバーストとY秒の遅れが私にはいい」という質問ですか?
答え1
マンページの唯一の制限burst
は、設定した速度を可能にするのに十分な高さでなければならないことです。つまり、少なくとも rate/HZ でなければなりません。 HZはカーネル構成パラメーターです。カーネル構成を確認して、システムに何があるかを調べることができます。たとえば、Debianでは次のことができます。
$ egrep '^CONFIG_HZ_[0-9]+' /boot/config-`uname -r`
CONFIG_HZ_250=y
したがって、私のシステムのHZは250です。 10mbpsを達成するには、burst
少なくとも10,000,000ビット/秒 ¼ 250Hz = 40,000ビット = 5000バイトが必要です。 (マンページのより高い値は、デフォルト値HZ = 100から始まります。)
ただし、burst
これはポリシーツールでもあります。後で使用できるように「保存」するために今使用できる帯域幅の量を設定します。ここで一般的な問題は、大量のダウンロードを制限しながら、小さなダウンロード(Webページなど)を非常に高速に実行できるようにすることです。burst
ダウンロードサイズを小さくすると思われるサイズに増やすだけです。 (ただし、さまざまな種類のトラフィックを分類できるように、htbなどのクラス型qdiscに切り替えることがよくあります。)
したがって、必要なものを達成するのに十分な大きさのバーストを構成しますrate
。それに加えて、達成しようとしている目標に応じてさらに増やすことができます。
トークンバケットフィルタの概念モデル
「バケット」は比喩的なターゲットです。主な機能はトークンを保持できることであり、保持できるトークンの数には制限があります。より多くのトークンを追加しようとすると、「オーバーフロー」され、余分なトークンが失われます(たとえば、容器に水が多すぎます)、実際のバケットなど。バケットのサイズを言いますburst
。
実際にパケットをネットワークに転送するには、パケットはバイトサイズまたはmpu
(どちらか大きい方)サイズと同じトークンを取得する必要があります。
トークンを待つパケットのキューがあります(または存在する可能性があります)。これは、バケットが空の場合、またはトークンがパケットサイズより小さい場合に発生します。バレル前の歩道にはこの程度の空間のみあり、空間の量(バイト)は直接設定されますlimit
。または間接的に設定することもできます(理想的な場合は×latency
と評価されます)。rate
latency
カーネルがフィルタリングされたインターフェイスからパケットを送信しようとすると、パケットを行の末尾に配置しようとします。プレスにスペースがない場合、プレスの終わりは床のないピットであり、カーネルがパケットを破棄するため、これはパケットに不幸です。
最後の部分は、サイクルごとにバケットにトークンを追加rate
/トークンを作成するトークンメーカーです。HZ
(これがバケットが少なくともこれほど大きくなければならない理由です。そうしないと、新しく作成されたトークンの一部がすぐに破棄されます。)
答え2
DeRobertの答えにもう一つの追加です。
まず、最新のIntel CPUのマニュアルは古いです。最新のCPUには高解像度タイマーがありますが、最新のLinuxにはティックはありません。文字通りタイマーティックはありません。したがって、タイマーにトークンを入れるのに十分なバケットを大きくすることに関するすべての説明は不適切です。実際、バケットのたとえ話は、ユーザーがタイマーの粒度と転送速度の間の相互作用を理解するのに役立ちます。現在、Linuxには最新のハードウェアにナノ秒タイマーがあるため、使いやすさが失われました。
TBF用飛び出すパラメータは、速度制限が適用される前に速度制限なしで送信できるバイト数です(次のように提供されます)。スピード) 効力が発生します。速度制限が適用された場合に別のバーストを取得する唯一の方法は、送信をその速度以下に制限することです。
たとえば、あなたのtbf飛び出すパラメータは10Kバイトです。スピードパラメータは2Kバイト/秒で、現在の速度が制限されています(つまり、バーストが使い果たされて2kbpsにしか送信できません)。 10秒間自発的に転送速度を1Kbpsに減らすと、再び10Kバイトのバースト制限(=(2000 [バイト/秒] - 1000 [バイト/秒])* 10秒)が累積されます。 10秒以上1kbps未満に維持すると、tbfは次の以上の蓄積を許可しないため、何の効果もありません。飛び出す範囲。
支出を完全に中断すると、5秒(= 100000 [バイト] / 2000 [バイト/秒])以内にバースト許容量が返されます。
急に積立金を全て引き出す必要なく、積立金額のみを使用してください。
これを見るもう一つの方法は次のとおりです。飛び出す無制限の速度バイト、その後、長期平均速度は絶対を超えません。スピード。ただし、長期平均なのでそれ以下ならスピード最高速度で送れば追いつくことができますが、それでも最高速度で送るのがベストです。飛び出すバイト(追いつかないと追いつくことはできません)。
もう一つの問題はTBFです二つこれらのレートリミッタとトラフィックは両方のレートリミッタを通過する必要があります。 2番目では、バーストパラメータが呼び出されます。最大伝送単位そしてこの割合をといいます。最高料金。最初のものがバーストを送信できる速度を制限するには、2番目のものを使用する必要があります。 2番目のものを使用することはオプションです。使用しない場合、バーストはデバイス速度で送信されます。
最後に、tbf限界範囲。プログラムがより速く転送する場合スピード、パケットはキューに蓄積されます。カーネルメモリには無制限がないので限界カーネルがパケットドロップを開始する前に構築できるバイト数を示します。