ネットワーク遅延のあるアプリケーションのテスト


このブログ記事は、ネットワーク上のパケットの送信に遅延を導入するためのLinux機能についてです.
最初の質問は明らかにあります:なぜあなたはこれが欲しいですか?さて、いくつかの理由で実際に.
あなたが複数の可用性地帯で雲に何かを配備するならば、パケットがその距離を旅行しなければならなくて、それが最終的に光の速度によって制限されるので、物理的な距離が遅れを強制するので、物理的な距離が遅れを強制するので、これらの地帯の中でノードの間で遅れがあります.その上に、論理的な距離があります.そして、それはどのように2つの間のネットワークがより多くの待ち時間をもたらすことができる形ですか.
別の理由は、あるネットワークレイテンシがネットワーク化されたアプリケーションに導入されるとき、何かが振る舞うかをテストすることです.yugabytedbは分散データベースであり,yugabytedbクラスタ内のノード間通信にネットワークを使用する.
私はAlma Linuxのバージョン8.5を使用しています.
それは非常に単純に見える:Googleの簡単な検索方法(この場合:100ミリ秒)の遅延を追加する方法を示します.
tc qdisc add dev eth1 root netem delay 100ms
これは、TCユーティリティがインストールされている必要があることを意味します.インストールされていない場合は、iproute-tcパッケージをインストールする必要があります.
しかし、これはLinuxマシンに以下のエラーを投げます:
# tc qdisc add dev eth1 root netem delay 100ms
Error: Specified qdisc not found.
TCのチェックを設定します.
# tc qdisc show dev eth1
qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64
多くの詳細は、遅延はありません.
ネットワーク遅延の実行だけでなく、パケット損失や重複パケットをシミュレートするなどの他の機能は、' nedisc 'と呼ばれる' netem '(ネットワークエミュレータ)の一部です.
' nedisc '' qdisc 'はTCユーティリティの一部であることがわかりますが、これはTCのmanページで指定されていますが、実際にはこの機能を利用できるカーネルモジュールです.これを利用可能にするために、パッケージ242479142をインストールしなければなりません.そして、それは、TC NETEM機能性を提供するkernel-modules-extraカーネル・モジュール(他の中で)をインストールします.カーネルモジュールが利用可能になれば、TCコマンドは成功するでしょう.
tc qdisc add dev eth1 root netem delay 100ms
(黙って成功する)
tc qdiscで確認してください.
# tc qdisc show dev eth1
qdisc netem 8003: root refcnt 2 limit 1000 delay 100ms
netem ( network emulator ) qdisc setを持つマシンに送信されたネットワークトラフィックは、100 msの遅れで送信されます.
netem無しで:
$ ping -c 3 192.168.66.82
PING 192.168.66.82 (192.168.66.82) 56(84) bytes of data.
64 bytes from 192.168.66.82: icmp_seq=1 ttl=64 time=0.373 ms
64 bytes from 192.168.66.82: icmp_seq=2 ttl=64 time=0.367 ms
64 bytes from 192.168.66.82: icmp_seq=3 ttl=64 time=0.264 ms
netem :
$ ping -c 3 192.168.66.82
PING 192.168.66.82 (192.168.66.82) 56(84) bytes of data.
64 bytes from 192.168.66.82: icmp_seq=1 ttl=64 time=101 ms
64 bytes from 192.168.66.82: icmp_seq=2 ttl=64 time=100 ms
64 bytes from 192.168.66.82: icmp_seq=3 ttl=64 time=101 ms
削除:
# tc qdisc del dev eth1 root
しかし、これは今ではかなり野蛮な遅れです:トラフィックコントロールの設定を持っているホスト上のデバイスeth 1から送信されるすべてが影響を受けます.ホスト(IPアドレス)の限られた数の遅延を適用するホストを持っている場合は、通常の遅延出力を分割することができますし、フィルタと遅延出力されるように一致する!
私の場合では、ホスト192.168.66.80および192.168.66.81(ノード192.168.66.82)から送信されたものに対して遅延を適用するだけです.このように、私はノード192.168.66.82を模倣することができます.
# tc qdisc add dev eth1 root handle 1: prio
# tc qdisc add dev eth1 parent 1:3 handle 30: netem delay 100ms
# tc filter add dev eth1 protocol ip parent 1:0 priority 3 u32 match ip dst 192.168.66.80 flowid 1:3
# tc filter add dev eth1 protocol ip parent 1:0 priority 3 u32 match ip dst 192.168.66.81 flowid 1:3
最初の行では、デバイスのルートに接続されているキューの規律を作成し、2行目にflowid 1 : 3で親を付けます.第3行目および第4行目は、デバイスeth 1上の出てくるトラフィックをIPアドレス192.168.66.80および192.168.66.81に結合し、flowid 1 : 3を通過させるフィルタを追加する.
削除:
# tc qdisc del dev eth1 root
あなたが本当にこれを好むならば、例を考えてください、特定のIPアドレスへのフィルタリングでさえ、まだかなり単純です:可変的な遅れ、固定されたか可変的なパケット損失のようなトラフィックシェイプ可能性の全世界があります、そして、ネットワーク問題をシミュレーションするために同一のパケットを生み出します!sch_netemユーティリティのマニュアルを参照してください.

結論


トラフィックシェーピングは、含まれている任意のアプリケーションのネットワーク影響をテストするための貴重なツールであり、yugabyteデータベースなどのネットワークトラフィックに依存していますが、また、データベースをシャープにすると、レプリケーションセットアップを持つデータベースは、それ以外の場合にのみ、物理的に世界中で実装することによって可能となる.Linux Tcユーティリティを使用すると、独自のラップトップ上でこれをテストすることができます.
あなたがこれをさらにして、より密接にノードの(地方の)クラスタのノードのノードのために高いレイテンシをシミュレーションしたいならば、あなたは遠いノードと考えられる1つ以上のノードにローカルノードからの発信に遅れをセットしなければなりません、そして、逆もローカルのものに「遠いノード」から送らなければなりません.