rperf は、3D-P によって開発された Rust ベースのiperf の代替品で、 iperf3に見られる信頼性と一貫性の問題を回避することを目的としていますが、同時に、損失耐性が高く、より IoT に近い環境での運用に重点を置いて、より豊富なメトリクス データを提供します。これは、 iperfのほぼドロップイン代替品として使用でき、そうすることには利点があるかもしれませんが、閉じたネットワークの監視機能での定期的なデータ収集に重点が置かれているため、すべてのドメインに適しているわけではありません。 iperf が提供できること。
rperfは独立した実装であり、 iperf3とzapwirelessのアルゴリズムを参照して正確さを評価し、適切な修正を導き出しますが、どちらのコードもコピーしません。
特に、 iperf3で対処される最も重要な問題は次のとおりです。
複数の同時クライアントは、任意のサーバーでサポートされます。
rperfによるストリーミング ジッター計算のための RFC 1889 の実装は、シーケンス内の最初と 2 番目のパケット間のデルタとシーケンス内のギャップがカウントのリセットをトリガーすると仮定することから始まります。比較すると、 iperf3 は0 から始まり、人為的に低い値を作成し、ギャップがある場合は単純に継続し、人為的に高い値を作成します。
重複パケットは UDP 交換で考慮され、順序が乱れたパケットは独立したイベントとしてカウントされます。
すべてのトラフィックは一定の 1 秒未満の間隔で比例的に送信できるため、実際のデータ送信および送信アルゴリズムをより正確に反映する構成が可能になります。
ストリーム設定と結果は専用接続を介して交換され、すべてのデータ パスにはタイムアウト、完了、および失敗のセマンティクスが明確に定義されているため、主要なパケットが失われた場合でも、テストのどちらの側でも実行が無期限にハングすることはありません。
rperfの JSON 出力は構造的に正当です。引用符で囲まれていない文字列、キーの繰り返し、またはぶら下がりカンマは使用されません。これらはすべて、使用前に前処理が必要であり、予期しないエラーの原因となります。
zapwirelessとは対照的に、次の改善が実現されています。
rperf は従来のクライアント/サーバー アーキテクチャを使用しているため、テスト実行リクエストを待機するデバイス上で実行中のプロセスを維持する必要はありません。
ジッターが計算されます。
IPv6がサポートされています。
テストの一部として複数のストリームを並行して実行できます。
TCP ランプアップ時間を結果から無視するためにomit
オプションを使用できます。
出力は JSON で利用できるため、テレメトリの収集が容易になります。
rperf はすべての主要なプラットフォームで構築および動作する必要がありますが、その開発と使用は Linux ベースのシステムに重点を置いているため、機能が最も充実しています。
他のシステム用の同等の機能の実装に関するプルリクエストは歓迎されます。
--help
の出力にはすべての概要が記載されており、同様のツールに慣れているほとんどのユーザーはすぐに安心できるはずです。
rperf はiperf3とよく似た働きをし、多くの概念とコマンドライン フラグさえも共有します。主な相違点の 1 つは、クライアントがすべての構成プロセスを主導するのに対し、サーバーは能力の限り最善に従って結果のストリームを提供するだけであるということです。これは、サーバーがそのインターフェースを介してテスト結果を直接提示しないこと、また、TCP および UDP テストを同じインスタンスに対して、場合によっては多数のクライアントによって同時に実行できることを意味します。
通常の動作モードでは、クライアントはデータをサーバーにアップロードします。 reverse
フラグが設定されている場合、クライアントはデータを受信します。
iperf3とは異なり、 rperf はデフォルトでは予約されたポート範囲を使用しません。これは、実際には少数の連続ポートしか存在しないリソース競合を発生させることなく、任意の数のクライアントを並行してサポートできるようにするためです。本来の機能では、これは問題にはなりませんが、非寛容なファイアウォールと NAT セットアップが関係する場合、 --tcp[6]-port-pool
および--udp[6]-port-pool
オプションが問題になる可能性があります。トラフィックの受信に使用されるセットに不連続なポートを割り当てるために使用されます。
また、固定量のデータに対するスループットをテストするという概念もありません。むしろ、ほぼ既知の期間にわたるスループットを測定することだけに重点を置いています。
また、サーバーが IPv6 モードで実行されており、そのホストがデュアルスタック構成で IPv4 マッピングをサポートしている場合、IPv4 クライアントと IPv6 クライアントの両方が同じインスタンスに接続できることも関連します。
rperf はカーゴを使用します。一般的なプロセスは、単にcargo build --release
です。
Cargo-debもサポートされており、デフォルトで無効になっているrperf
systemdサービスをインストールする使用可能な Debian パッケージを生成します。起動すると、デフォルトで IPv6 がサポートされることを前提として、 nobody:nogroup
として実行されます。
同時代のものと同様に、 rperfの中心的な概念は、事前に設定されたターゲット速度で IP ターゲットに TCP または UDP データのストリームを送信することです。実際に受信したデータの量が観察され、ネットワーク リンクの容量を測定するために使用されます。
これらのドメイン内では、交換の品質に関する追加データが収集され、レビューに利用できるようになります。
アーキテクチャ的には、 rperf はクライアントにサーバーへの TCP 接続を確立させます。その後、クライアントは実行するテストの詳細を送信し、サーバーはテスト プロセス全体を通じて観察結果をクライアントに報告することを義務付けます。
クライアントは、テストに複数の並列ストリームの使用を要求する場合があります。これは、両側に独自の専用スレッドを持つ複数の TCP 接続または UDP ソケットを確立することによって容易になります。ページの影響を軽減するために、単一の論理 CPU コアにさらにピン留めすることもできます。 -データ交換での障害。
クライアントとサーバーの関係は、よりピアに近いiperf3や、各参加者が独自のデーモンを実行し、3 番目のプロセスが通信を調整するzapwirelessとは対照的に、この設計の非常に中心的な側面として扱われます。
特に、すべてのデータ収集、計算、表示はクライアント側で行われ、サーバーは監視したものを返すだけです。これにより、特に時間が関係する場合、記録に多少のずれが生じる可能性があります (サーバーの間隔が対応するクライアントの値よりも数ミリ秒長いことは、まったく珍しいことではありません)。ただし、接続が失われていないと仮定すると、観察されたデータの合計はすべての動作モードで一致します。
サーバーは 3 つのスレッド層を使用します。メイン スレッド用に 1 つ、サービスを受ける各クライアント用に 1 つ、クライアントと通信する各ストリーム用にもう 1 つあります。クライアント側では、メインスレッドはサーバーとの通信に使用され、サーバーと通信するストリームごとに追加のスレッドを生成します。
サーバーがクライアントからリクエストを受信すると、そのクライアントの特定のリクエストを処理するスレッドを生成します。内部的には、テストの各ストリームはどちらかの側で反復子のようなハンドラーを生成します。クライアントとサーバーの両方は、テスト期間が終了するまで、これらの反復子類似物を相互に非同期で実行します。テスト期間が終了すると、送信者はストリーム内で完了を示します。
ストリーム レベルで切断の可能性に確実に対処するために、クライアント/サーバー ストリームのキープアライブ メカニズムにより、定期的にテスト結果がサーバーから送信され、非アクティブ状態が数秒続くと未処理の接続が終了します。
ホスト OS の TCP および UDP メカニズムは、交換されるすべての実際のトラフィックに使用され、一部の調整パラメータは公開されます。このアプローチは、現実世界のアプリケーションの動作を最も正確に表すため、レイヤー 2 またはレイヤー 3 上のユーザー空間実装よりも選択されました。
JSON でシリアル化された間隔データに表示される「タイムスタンプ」値はホスト相対であるため、環境のシステム クロック精度が非常に高い場合を除き、送信タイムスタンプは他の送信タイムスタンプとのみ比較し、受信タイムスタンプについても同様に比較する必要があります。ただし、一般に、このデータは正確性の検証以外には役に立ちません。
各交換間隔中、ストリームに書き込まれる量が帯域幅目標を満たすか超えるまで、一度にlength
バイトの送信が試行され、その時点で送信者は次の間隔が始まるまで沈黙します。ある間隔内で送信されるデータは、その期間にわたって均一に分散される必要があります。
ストリーム インデックスは1
ではなく0
から始まります。これに驚く人はいないでしょうが、レポートに「ストリーム 0」が表示されても心配する必要はありません。
rperf は、Evtech Solutions, Ltd. (dba 3D-P) によって GNU GPL バージョン 3 に基づいて配布されており、そのテキストはCOPYING
にあります。
著者の詳細、著作権の詳細、および譲渡可能性に関する注記は、ソース コード自体の中に存在します。