web-dev-qa-db-ja.com

Linuxで遅延およびドロップされたパケットをシミュレートする

LinuxでUDPおよびTCPのパケットの遅延と損失をシミュレートして、アプリケーションのパフォーマンスを測定したいと思います。これを行う簡単な方法はありますか?

227
Alec

netem Linuxおよびユーザー空間ユーティリティに既に組み込まれている機能を活用して、ネットワークをシミュレートします。これは、実際にはマークの答えが別の名前で言及しているものです。

彼らのホームページ の例は、あなたが要求したことを達成する方法をすでに示しています:

広域ネットワーク遅延のエミュレート

これは最も単純な例で、ローカルイーサネットから送信されるすべてのパケットに一定量の遅延を追加するだけです。

# tc qdisc add dev eth0 root netem delay 100ms

ローカルネットワーク上のホストへの簡単なpingテストでは、100ミリ秒の増加が示されるはずです。遅延は、カーネルのクロック解像度(Hz)によって制限されます。ほとんどの2.4システムでは、システムクロックは100µHzで動作し、10µms単位の遅延が可能です。 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」コマンドでパーセントで指定されます。ゼロ以外の最小値は次のとおりです。

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%が失われ、連続する各確率は、最後のパケットの1/4に依存します。

プロブn = 0.25×確率n-1 + 0.75×ランダム

そのインターフェースのルールがない場合はtc qdisc addを使用し、そのインターフェースのルールが既にある場合はtc qdisc changeを使用する必要があります。ルールのないインターフェイスでtc qdisc changeを使用しようとすると、エラーが発生しますRTNETLINK answers: No such file or directory

301
ephemient

ドロップされたパケットの場合、単純にiptablesと 統計モジュール を使用します。

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

上記は、1%の確率で着信パケットをドロップします。注意してください、0.14以上とtcp接続のほとんどは完全に失速するでしょう。

Man iptablesを見て、詳細については「統計」を検索してください。

80

同僚の1人がtcを使用してこれを行っています。詳細については、manページを参照してください。その使用法の例を見ることができます here

7
Mark

iptables(8)には、n番目ごとのパケットを照合するために使用できる統計モジュールがあります。このパケットをドロップするには、単に-j DROPを追加します。

5
hillu

ネットワーク物理シミュレーションに関するこの チュートリアル には、UDP接続でのレイテンシーとパケット損失をシミュレートするための サンプルコード にC++クラスが含まれています。指導する。パブリックlatencyおよびpacketLossConnectionクラスの変数を参照してくださいConnection.hのファイル ダウンロード可能なソースコード

3
Judge Maygarden

試してみることができます http://snad.ncsl.nist.gov/nistnet/ これはかなり古いNISTプロジェクト(最終リリース2005)ですが、私にとってはうまくいきます。

1
Elalfer

その目的のために科学界で最も使用されているツールの1つは、 DummyNet です。 ipfwカーネルモジュールをインストールしたら、2台のマシン間に50msの伝播遅延を導入するには、次のコマンドを実行します。

./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

ここ 詳細。

1
gaetano

自分で試したことはありませんが、 このページ には、Linuxに組み込まれたiptables IPフィルタリングシステムで実行されるプラグインモジュールのリストがあります。モジュールの1つは「nth」と呼ばれ、設定可能なレートのパケットをドロップするルールを設定できます。少なくとも始めるには良い場所かもしれません。

1
unwind

使いやすいネットワーク障害注入ツールは Saboteur です。以下をシミュレートできます。

  • 合計ネットワークパーティション
  • リモートサービスが停止しています(予想されるポートでリッスンしていない)
  • 遅延
  • パケット損失-TCP接続タイムアウト(2つのシステムがステートフルファイアウォールによって分離されている場合によく発生します)
1
Alex Giotis