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


246

私はのためのパケット遅延や損失をシミュレートしたいUDPTCPアプリケーションのパフォーマンスを測定するLinux上を。これを行う簡単な方法はありますか?



1
OS Xの場合は以下を参照してくださいsuperuser.com/questions/173882/...
Lenarホイト

回答:


323

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 msになり、次のランダム要素は最後のものに25%依存します。これは真の統計的相関ではなく、概算です。

配信遅延

通常、ネットワークの遅延は均一ではありません。正規分布のようなものを使用して遅延の変動を説明するのがより一般的です。netemの分野では、テーブルを使用して不均一な分布を指定できます。

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

実際のテーブル(通常、パレート、パレートノーマル)は、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%のパケットが失われ、連続する確率はそれぞれ、最後の確率に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


2
元のウェブサイトにはそのエラーがあります。そのテキストを直接コピーしただけです。しかし、はい、2 ^(-32)= 2.33e-10
ephemient

34
tc -p qdisc ls dev eth0現在定義されているルールを一覧表示し、tc qdisc del dev eth0 rootそれらを削除することに注意してください
Quamis 2013

1
存在しないエントリを変更しようとしたときにエラーを指摘することに賛成
Neo

これらのエラーが発生する理由を知っていますか?ubuntu @ anmol-vm1-new:/ home / hadoop / yarnpp / workloads / RESULTS $ sudo tc qdisc add dev eth0 root netem delay 100ms RTNETLINK回答:ファイルが存在しますubuntu @ anmol-vm1-new:/ home / hadoop / yarnpp / workloads / RESULTS $ sudoをTCなqdisc変更devのeth0のルートnetem遅延がRTNETLINKの答えを100MS:無効な引数のserverfault.com/questions/743885/...
モナジャラル

低速リンクをシミュレートするためにインターフェイス全体のスループットを制限する方法の詳細を含めることは、おそらく良いアイデアでしょう
Pavel P

91

ドロップされたパケットについては、単純にiptablesと統計モジュールを使用します

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

上記は、1%の確率で着信パケットをドロップします。注意してください。約0.14を超えると、ほとんどのTCP接続が完全に停止します。

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


6
TCP接続が14%を超えると停止するのはなぜですか?
David Wolever

2
@DavidWolever:tcpスライディングウィンドウのサイズを調整する方法のため。しかし、14%は純粋に経験に基づくものであり、自分で試してみると、sshは14%以上でほとんど使用できなくなりますが、実際には、パケットドロップ率のレベルが低い場合は非常にうまく機能します。
Bjarke Freund-Hansen 2013

12
安全のために、テストしたいポートにのみ適用するようにルールを制限するのがおそらく最善です:iptables -A INPUT --dport FOO -m statistics ....このように、sshと他の接続は痴漢されないままにしておき、興味のあるサービスのドロップ率を上げて、問題をより迅速に再現できるようにします。
ミハイルT.

5
アウトバウンド接続では、ばかばかしく、単にパケットをドロップするのではなく、オペレーションを返すことDROPに注意してください(本来のように)。send()EPERM
架空の名前

2
このコマンドを元に戻すために必要なのはこれだけですか?iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP
jcalfee314 2016

6

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


iptablesを使用する方が簡単だと思います:)
c4f4t0r

確かに、しかしtcはiptablesよりはるかに高速です
teknoraver

5

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


3

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


1

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



1

Saboteurは、使いやすいネットワーク障害挿入ツールです。シミュレートできます:

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

1
悲しいことに、そのプロジェクトへの最後のコミットは2015年8月28日、つまり、ほぼ4年前でした。未解決の問題は現在5年前のものです。
アリ

1

その目的のために科学コミュニティで最も使用されているツールの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

ここでは詳細。

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