トラフィックフローの速度の制限(シェーピング)は、かなりリソースを消費するタスクです。 したがって、ネットワーク内に少なくとも数百の加入者が存在し、大量のトラフィックが通過する場合、シェーパー最適化の問題は特に深刻です。
Linuxを実行するシェーパーを検討します。このOSは、高負荷下でのパフォーマンスに関して最高の結果を示しています。
簡単な紹介
シェーパーは、パケットキューを提供する分野です。 規律は、クラスの有無にかかわらず可能です。 クラスあり-特定のクラスに従ってトラフィックを「損なう」ことができることを意味します。
どのクラスによってどのトラフィックがシェーピングされているか-フィルターを決定します。
簡単に言えば、フィルターツリーとクラスツリーの2つのツリーがあります。 フィルタは、特定の基準に従ってトラフィックをクラスにスローします。 クラスでは、トラフィックはクラスで指定されたパラメーターに従って優先順位付けまたはシェーピングされます。
ハッシュあり、ハッシュなし
他のツリーと同様に、特定のしきい値に達すると、フィルターツリーはリソースを大量に消費します。
あるIPアドレスからのパケットがフィルターツリーに分類されると、各フィルターの基準との比較が開始されます。 一致する場合、パケットは適切なクラスに送信されます。 つまり 着信パケットごとに、一致が発生するまでツリー内の各フィルターの基準に準拠しているかどうかのチェックが一貫して行われます。
たとえば、24番目のマスクを使用するネットワークの場合、必要なクラスを検索するとき、各パケットに平均128ステップがあります。
これは、少量のトラフィックと少数のサブスクライバでは重要ではありません。 数万人の加入者とギガビットがインターネットにアクセスすると、このアプローチはまったく不可能になります-シェーピングサーバーは単に負荷に対処しません。
ツリー全体がIPアドレスのチェックのシーケンスである場合、ハッシュを使用する方がはるかに効率的です。 ハッシュは、特定の「値」と特定の「キー」の対応表です。 この場合、キーはIPアドレスであり、値はパケットをクラスに導くフィルターです。
したがって、キー(IPアドレス)により、パケットに必要なフィルターをすばやく見つけることができます(1ステップ)。
実際、記事のハッシュの使用についてはすでに多くのことが書かれています-これは「軍事的なもの」ではありません。 ソースを参照できます。
シェーパーを作成するスクリプト
高速U32ハッシュフィルタージェネレーターは、シェーパーを構築する際の作業をはるかに容易にします。これは、ルーマニア(?)システム管理者によって作成されたCプログラムです。
入り口で、彼女には次のパラメーターが与えられます。
- prefix.in-<prefix> <class>の形式のプレフィックスと対応するクラスのリスト
- u32filters.out-出力ファイル、フィルターはここに保存されます
- interface-シェーパーが構築されるインターフェースの名前
- src / dst-フロー方向(インバウンドまたはアウトバウンド)
- batch-このパラメーターを指定すると、tc –bの実行に適した出力ファイルが生成されます
詳細な例は、上記のプロジェクトページにあります。
厳密に言えば、このプログラムの作業の本質を特に深く掘り下げる必要はありません。この場合、対処する必要はありません。
便宜上、特定の構成に基づいてプレフィックスとクラスのテーブルを構築し、必要なパラメーターを使用してフィルターを構築するために上記のプログラムを起動し、すべての長所からシェーパーの既製の構成を構築し、tc -bを実行する小さなスクリプトを作成しました
必要なのは、ファイルでいくつかの構成パラメーターを指定することだけです。
スクリプト構成
スクリプトフォルダーには、次のフォルダーとファイルが含まれます。
- データ-ここには、スクリプトの中間結果と、シェーパーの最終構成があります:_classes-完成したシェーパー構成、_filters-ハッシュ付きフィルター、_prefixes-プレフィックスとクラスの対応表、_speeds-クラスと速度の対応
- lib-作業に必要なライブラリ
- log-スクリプト操作中のイベントログ
- pid-ここには、スクリプトの複数のコピーが同時に実行されるのを防ぐためのプロセスのpidがあります
- config-メインスクリプト構成ファイル
- networks-シェーパーを構築するネットワークのリスト
- prefixtree.c-ハッシュを持つフィルタービルダーのソース
- shaper.php-シェーパースクリプト自体
スクリプトの構成全体は、構成ファイルにあります。 構成するには、必ず以下のパラメーターを自分で変更してください。
- 構成の最初に、IPアドレスと速度パラメーターの収集のためにデータベースに接続するためのパラメーター
- DEV-シェーパーを構築するインターフェース
- DIR-サブスクライバーに関連するトラフィックフローの方向:着信または発信(それぞれ着信および発信)
残りを変更する必要はありません。
networksファイルでは、シェーパーを作成するネットワークを記述できます。 ファイルが空の場合-すべてのサブスクライバー用のシェーパーが作成されます。
サブスクライバのIPアドレスは、MySQLのデータベースから選択されます。
テーブルシェーパー:
- shaper_id-一意のサブスクライバー識別子
- id-シェーパーID
Cl_statusテーブル:
- ip-加入者のIPアドレス
- shaper_id-一意のサブスクライバー識別子
- status-サブスクライバーステータス(3-オン)
- sin-着信速度
- sout-発信速度
ほとんどの場合、サブスクライバーのIPアドレスの選択要求を特定のデータベースに適応させる方が、その逆の場合よりも簡単です。 これを行うには、それに応じてshaper.phpファイルの70行目のリクエストを調整する必要があります
prefixrtee.cのコンパイル
スクリプトを機能させるには、添付のprefixtree.cファイルをコンパイルする必要があります
これは次のコマンドで実行されます:gcc prefixtree.c –o prefixtree
このスクリプトと共に、prefixtreeのわずかに修正されたバージョンが添付されており、そのような使用に適応していることに注意してください。
スクリプト実行
構成に適切な変更を加えた後、shaper.phpで選択を行い、prefixtree.cをコンパイルし、ネットワークで必要なネットワークを(必要に応じて)作成しました-スクリプトを実行できます。
起動はルートから実行する必要があり、単純に以下で構成されます。
/ usr / bin / php –q shaper.php
このスクリプトの後:
- 設定を読む
- 読み取りネットワーク
- (ネットワークに基づいて)各IPのデータベースから必要な選択を行います
- データ/ _prefixesファイルを作成します
- データ/ _speedsファイルを作成します
- 実行時にprefixtreeを実行し、データ/ _filtersファイルを作成します
- データ/ _classesファイルを作成します
- tc –b data / _classesを実行します
その結果、シェーパーが構築され、指定されたIPアドレスの指定されたパラメーターに従って、指定されたインターフェイスで起動されます。
サブスクライバに複数のIPアドレスがある場合、指定された速度パラメータで1つのクラスが構築され、すべてのサブスクライバIPアドレスがこのクラスに向けられます。 したがって、加入者が複数のIPを持っている場合、特定の速度の1つの「チャネル」が作成され、それがIP間で分割されます。
結果のシェーパー構成はdata / _classesにあります-これは、バッチ(-b)オプションでtcに供給することができる既製の構成ファイルです。
ログ
スクリプトのすべての段階がログ(ログフォルダー)に反映されます。
統計
このようなシェーパーは、5000を超えるサブスクライバーに正常にサービスを提供します。
注釈
shaper.phpファイル内の特定の帯域幅とhtbパラメーターは、それぞれの場合に編集する必要があります。
ダウンロードスクリプト
ここに全体を提供するにはコードが多すぎるため、 ホームページからスクリプトをダウンロードできます。