2 つのシミュレーション アプリケーション (C++ で記述) 間の IO データ転送速度 (帯域幅) を測定しようとしています。実際のアプリケーションでこの計算方法を実装する前に、ネットワーク帯域幅を計算する私の方法が正しいことを確認するためだけに、非常に単純な perfclient および perfserver プログラムを作成しました。したがって、この場合、プログラムで行う必要があります (Iperf は使用しません)。
perfclient および perfserver プログラムをさまざまなドメイン (ローカルホスト、イーサネットに接続されたコンピューター、ワイヤレス接続に接続されたコンピューター) で実行しようとしました。ただし、これらの異なるホストのそれぞれで、約 1900 Mbps (1472 バイトのデータ サイズを使用してテスト) のほぼ同じ帯域幅を取得します。これは妥当な結果ですか、それともより正確な帯域幅を取得できますか?
各 send() と recv() の最大データ サイズとして 1472 (ヘッダーを含まないイーサネット MTU) を使用する必要がありますか? また、さまざまなデータ サイズを使用してみました。これが得られた平均帯域幅 (イーサネット接続を使用してテスト) です。数値が 1Gbps を超えて 28 Gbps のような値に達したため、意味がありませんでした。
SIZE BANDWIDTH
1KB 1396 Mbps
2KB 2689 Mbps
4KB 5044 Mbps
8KB 9146 Mbps
16KB 16815 Mbps
32KB 22486 Mbps
64KB 28560 Mbps
ここに私の現在のアプローチがあります:
私は基本的なピンポン ファッション ループを行いました。このループでは、クライアントはデータ ストリームのバイトをサーバー プログラムに継続的に送信します。サーバーはそれらのデータを読み取り、そのデータをクライアント プログラムに反映 (送信) します。次に、クライアントはそれらの反映されたデータを読み取ります (双方向伝送)。上記の操作を 1000 回繰り返し、その時間を 1000 で割って平均待ち時間を求めました。次に、平均待ち時間を 2 で割り、片道の伝送時間を取得しました。帯域幅は次のように計算できます。
bandwidth = total bytes sent / average 1-way transmission time
私のアプローチに何か問題がありますか?結果が偏っていないことを確認するにはどうすればよいですか? これを正しく理解したら、元のアプリケーション (この単純なテスト アプリケーションではない) でこのアプローチをテストする必要があり、このパフォーマンス テストの結果を科学論文に掲載したいと考えています。
編集: 私はこの問題を解決しました。以下に投稿した回答を確認してください。