LinuxでUDP
およびTCP
のパケットの遅延と損失をシミュレートして、アプリケーションのパフォーマンスを測定したいと思います。これを行う簡単な方法はありますか?
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
。
ドロップされたパケットの場合、単純にiptablesと 統計モジュール を使用します。
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
上記は、1%の確率で着信パケットをドロップします。注意してください、0.14以上とtcp接続のほとんどは完全に失速するでしょう。
Man iptablesを見て、詳細については「統計」を検索してください。
同僚の1人がtcを使用してこれを行っています。詳細については、manページを参照してください。その使用法の例を見ることができます here 。
iptables(8)には、n番目ごとのパケットを照合するために使用できる統計モジュールがあります。このパケットをドロップするには、単に-j DROPを追加します。
ネットワーク物理シミュレーションに関するこの チュートリアル には、UDP接続でのレイテンシーとパケット損失をシミュレートするための サンプルコード にC++クラスが含まれています。指導する。パブリックlatencyおよびpacketLossのConnectionクラスの変数を参照してくださいConnection.hのファイル ダウンロード可能なソースコード 。
試してみることができます http://snad.ncsl.nist.gov/nistnet/ これはかなり古いNISTプロジェクト(最終リリース2005)ですが、私にとってはうまくいきます。
自分で試したことはありませんが、 このページ には、Linuxに組み込まれたiptables IPフィルタリングシステムで実行されるプラグインモジュールのリストがあります。モジュールの1つは「nth」と呼ばれ、設定可能なレートのパケットをドロップするルールを設定できます。少なくとも始めるには良い場所かもしれません。
使いやすいネットワーク障害注入ツールは Saboteur です。以下をシミュレートできます。
- 合計ネットワークパーティション
- リモートサービスが停止しています(予想されるポートでリッスンしていない)
- 遅延
- パケット損失-TCP接続タイムアウト(2つのシステムがステートフルファイアウォールによって分離されている場合によく発生します)