Linux TCクラス/フィルターの番号付け


12

現在、ISPレベルの企業向けのトラフィックシェーピングソリューションに取り組んでおり、興味深い(一種の哲学的な)問題に遭遇しました。

システムが処理するエンドポイントの数(約20k程度)を見ると、より多くのユーザーのトラフィックをポリシー化/シェーピングする必要がある場合に何が起こるか少し心配になりました。現在、ネットワーク全体でHFSCシェーピングツリーを使用しているので(tc-hfscを参照してください。ほとんどがよく知られているHTBと同じです)、より多くのClassIDを使用する必要があります(明らかに、通信網)。私が見つけた問題は、TC ClassIDの種類が限られていることでした-それらは16ビットの数値であり、このソリューションによって形成された最大64kユーザーの可能性があります。

同様に、TCフィルターを効率的に管理したい場合(「すべての手法を使用しない」など)、個々のフィルターエントリを削除または変更できる必要があります。(LARTC [1]のハッシュテーブルに似たものを使用しています)。繰り返しますが、これで動作していると思われる唯一の方法は、個々の優先順位を使用してすべてのフィルターに番号を付けることです(tc filter add dev ... prio 1)。この目的に使用できる他のパラメーターはありません。残念ながら、prioも16ビットのみです。

私の質問は次のとおりです:「tc class」コマンドの32ビットclsid、「tc filter」の32ビット優先度(またはその他の変更ハンドル)など、利用可能な「識別子スペース」を拡大するための良い方法はありますかコマンド?

どうもありがとう、

-mk

(ところで、これは「64kユーザーですべての人に十分なはずです」シナリオに行かないことを願っています...)


これらの値はすべてカーネルスペースに保存されるため、それらを大きくするには、カーネルとユーザースペースユーティリティを再コンパイルする必要があります。64ビットカーネルを使用してみましたか?それらはそこで32ビットとして定義されるかもしれません。
ヒューバートカリオ

64ビットカーネルは同じサイズを使用します。たとえば、フィルター番号はu32-integerで、上部(プロトコル)と下部(プリオ)で構成され、どちらも明らかに16ビットです。クラスIDはu16としてハードコードされています。おそらくLKMLで誰かに聞いてみよう。
エクサ

1
フィルターにハッシュを使用していても、それだけのフィルターを使用していると、多くのIO問題が発生します(アップストリームとダウンストリームに推測します)。私は多くの時間を費やし、カーネル内のキュー実装にパッチを適用して、ksoftirqdで機能するようにしました。4年前にLARTCで出会ったSimon Lodalという男のパッチを使用しました。彼のパッチmail-archive.com/lartc@mailman.ds9a.nl/msg16279.htmlを見てください。彼は常に(最新のカーネルに対して)非常に更新されたバージョンを持っているので、彼に電子メールを送信してみてください。
パブルーツ

@Pabluezどうもありがとう、私はそれを最大限に活用しようとします。
エクサ

1
あなたの要件は有効だと思いますが、Pabluezが書いたように、これには確かに多くのカーネルの変更が含まれます。「間違っている」とは言いたくありませんが、パケット処理の下位部分がスイッチレベルで行われ、ポリシングがカスタムソフトウェアで行われていると思われるopenflowをチェックすることをお勧めします。ユーザースペースで実行しています。それがあなたの要件に合うかどうかはわかりませんが、調査する価値は確かにあります。
アンドレアスM

回答:


2

64kのユーザーにアップストリームクラスとダウンストリームクラスを配置し、それぞれのインターフェイスを同じインターフェイスに配置しないでください。使用しているインターフェイスごとにハンドラーを繰り返すことができるため、インターフェイスを追加します。これを行うには、信じられないほどの作品/サーバー/ NICが必要です。サーバーがクラッシュすると、64kユーザーがオフラインになります(そのトラフィック量で簡単にクラッシュします)。ネットワークカードを通過する各パケットは、フィルターによってチェックおよび分類され、キューに入れられるクラスに送信されることを忘れないでください。これは、64kの顧客を持つISPゲートウェイのNICにとって多くの作業です。主に、現在あるすべてのビデオストリーム(適切にキューイングするのが難しい)です。


他のレベルでサービスの可用性を確保していますが、懸念をお寄せいただきありがとうございます。実際、優れたNICを使用すれば、10ギガビットを転送できるLinuxルーターを用意するのはそれほど難しくありません。
エクサ

元の質問については、各ユーザーに5つの異なるクラスを追加するようなものに興味がありました。これにより、本当に良いQOSジョブを行うことができます(ストリームとリアルタイムトラフィックを別々に処理するなど)が、現在の状況ではほとんど考えられません(私の〜20kエンドポイントの現在のユースケースでは、すでに限界に達しています)。
エクサ

1
大丈夫、10Gbitsを転送することは問題ではなく、問題は多くの64k * 2(アップダウン)フィルターとクラスを持つことです。しかし幸運:D
Pabluez

0

1台のマシンですべてのトラフィックを処理する代わりに、トラフィック処理を2台のマシンに分割できます(3台目のマシンを使用)。トラフィックは、単に送信元IPアドレスに基づいてルーティングできます。そのため、IP範囲を均等に分割できれば、1万人のユーザーが最適になります。

もちろん、必要に応じて3台以上のマシンを使用できます。これは、Linuxカーネルにパッチを適用して他のハッキングを行うよりも良いと思う。つまり、トラフィックシェーピングは複数のマシンに分散されます。中央ノードは、トラフィックを適切な処理ノードに転送するだけです。

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