アプリケーションのパフォーマンスを測定するために、Linux 上でパケットの遅延UDP
と損失をシミュレートしたいと考えています。TCP
これを行う簡単な方法はありますか?
9 に答える
netemは、Linux およびユーザー空間ユーティリティに既に組み込まれている機能を活用して、ネットワークをシミュレートします。これは実際には、マークの回答が別の名前で参照しているものです。
彼らのホームページの例は、あなたが求めていたものをどのように達成できるかをすでに示しています:
例
広域ネットワーク遅延のエミュレート
これは最も単純な例で、ローカル イーサネットから発信されるすべてのパケットに一定量の遅延を追加するだけです。
# tc qdisc add dev eth0 root netem delay 100ms
これで、ローカル ネットワークでホストする単純な ping テストで、100 ミリ秒の増加が示されるはずです。遅延は、カーネルのクロック分解能 (Hz) によって制限されます。ほとんどの 2.4 システムでは、システム クロックは 100 Hz で実行され、10 ミリ秒単位の遅延が許容されます。2.6 では、値は 1000 ~ 100 Hz の構成パラメーターです。
後の例では、qdisc をリロードせずにパラメーターを変更するだけです
実際の広域ネットワークは変動性を示すため、ランダムな変動を追加することができます。
# tc qdisc change dev eth0 root netem delay 100ms 10ms
これにより、遅延が 100 ± 10 ms 追加されます。ネットワーク遅延の変動は純粋にランダムではないため、相関値があることをエミュレートします。
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
これにより、追加の遅延が 100 ± 10 ミリ秒になり、次のランダム要素は最後のランダム要素に 25% 依存します。これは真の統計的相関関係ではなく、概算です。
遅延分布
通常、ネットワークの遅延は一様ではありません。正規分布のようなものを使用して遅延の変動を説明する方が一般的です。netem ディシプリンは、テーブルを使用して不均一な分布を指定できます。
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
実際のテーブル (normal、pareto、paretonormal) は iproute2 コンパイルの一部として生成され、/usr/lib/tc に配置されます。したがって、実験データに基づいて独自のディストリビューションを作成することは可能です。
パケットロス
ランダム パケット ロスは、「tc」コマンドでパーセントで指定されます。0 以外の可能な最小値は次のとおりです。
2 −32 = 0.0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
これにより、1/10 パーセント (つまり、1000 分の 1) のパケットがランダムにドロップされます。
オプションの相関関係を追加することもできます。これにより、乱数ジェネレーターのランダム性が低下し、パケットのバースト損失をエミュレートするために使用できます。
# tc qdisc change dev eth0 root netem loss 0.3% 25%
これにより、パケットの 0.3% が失われ、連続する確率は最後のパケットの 4 分の 1 に依存します。
確率n = 0.25 ×確率n-1 + 0.75 × ランダム
tc qdisc add
そのインターフェイスのルールがない場合、またはそのインターフェイスのルールが既にある場合は、を使用する必要があることに注意tc qdisc change
してください。tc qdisc change
ルールのないインターフェイスで使用しようとすると、エラーが発生しますRTNETLINK answers: No such file or directory
。
ドロップされたパケットについては、単純に iptables と統計モジュールを使用します。
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
上記は、1% の確率で着信パケットをドロップします。注意してください。約 0.14 を超えると、ほとんどの tcp 接続が完全に停止する可能性が高くなります。
詳細については、man iptables を参照して「統計」を検索してください。
私の同僚の1人は、これを行うためにtcを使用しています。詳細については、manページを参照してください。ここでその使用例を見ることができます。
iptables(8) には、n 番目ごとのパケットを照合するために使用できる統計照合モジュールがあります。このパケットをドロップするには、-j DROPを追加するだけです。
その目的のために科学界で最も使用されているツールの 1 つがDummyNetです。カーネル モジュールをインストールしたらipfw
、2 台のマシン間で 50 ミリ秒の伝播遅延を導入するには、次のコマンドを実行するだけです。
./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2
また、パケット損失の 50% を導入するには、次を実行する必要があります。
./ipfw pipe 1 config plr 0.5
詳細はこちら。
自分で試したことはありませんが、このページには、Linux に組み込まれている iptables IP フィルタリング システムで実行されるプラグイン モジュールのリストがあります。モジュールの 1 つは「nth」と呼ばれ、パケットの設定可能なレートをドロップするルールを設定できます。少なくとも、始めるには良い場所かもしれません。
http://snad.ncsl.nist.gov/nistnet/ https://www-x.antd.nist.gov/nistnet/
これはかなり古い NIST プロジェクト (最終リリースは 2005 年) ですが、私にとってはうまくいきます。