ネットワークの状態を時間とともに変化させる
10%固定のパケットロスは、実験室の条件です。実際の回線は悪くなり、回復し、4秒間止まっては戻ります。追いかけているバグが潜んでいるのは、たいてい定常状態ではなく、その変化のほうです。
シナリオは時系列
1つのJSONファイルです。各ステップにこの秒に、これらの設定と書き、触れなかったものは値が保たれます:
{
"loop": true,
"steps": [
{"at": 0, "settings": {"latency": 20, "jitter": 15, "down": 4096}},
{"at": 20, "settings": {"loss": 8, "latency": 180}},
{"at": 45, "settings": {"block_ip": "203.0.113.0/24"}},
{"at": 65, "settings": {"block_ip": "", "loss": 0, "latency": 20}}
]
}
時刻は、ステップ間の間隔ではなく、実行開始からの秒数です。"loop": true を付けると、終わったところでタイムラインが最初から始まります。長時間の耐久テストに向いています。動かしたままにして、アプリを使います。
BeanNetworkTester.exe --scenario cafe-wifi.json --target myapp.exe
8個の用意済みシナリオがプログラムに付属します
実行ファイルの隣の scenarios フォルダーにあります。それらのファイルから読み取った内容なので、実際に手元にあるのはこれです:
| ファイル | ステップ数 | 長さ | 繰り返し |
|---|---|---|---|
blocked-endpoint.json | 4 | 65 s | あり |
cafe-wifi.json | 5 | 85 s | あり |
congested-vpn.json | 4 | 70 s | あり |
failing-dns.json | 6 | 85 s | あり |
mobile-lte-to-3g.json | 7 | 85 s | あり |
overloaded-game-server.json | 5 | 72 s | あり |
same-loss-in-runs.json | 5 | 100 s | あり |
upload-drop-midway.json | 7 | 75 s | なし |
ただのテキストです。1つ開いて、数字を変えて、保存します。名前が再現するものを表しています。混雑したカフェ、LTEから3Gに落ちるモバイル回線、途中で死ぬアップロード、過負荷になるサーバー、応答しなくなるDNSなどです。
変化をつけるもっと簡単な2つの方法
順序が重要なときは、シナリオを書く価値があります。そうでないときは、2つの設定が自動で変化します:
- 回線のオン・オフ:周期の長さと、そのうちどれだけが断になるか。10秒周期で4秒断、を永遠に。
- 速度スケジュール:制限が順に通っていく速度の並びで、ファイルなしで接続を悪化させ、回復させます。
BeanNetworkTester.exe --flap-period 10 --flap-down 40 --target myapp.exe
アプリの実行中でも動くのはなぜか
シナリオが触れる設定はすべて、すでに進行中のセッションにそのまま適用されます。アプリの再起動は不要で、ツールの再起動も要りません。イベントログが各ステップを発生時に記録するので、何かが壊れたとき、どの変更の直後だったかがわかります。シードと組み合わせれば、中のランダムなパケットロスも含めて、全体の流れが正確に繰り返されます。