マルチキャスト経由で UDP パケットを送信するサーバーと、それらのマルチキャスト パケットにリストされている多数のクライアントがあります。各パケットのサイズは 1040 バイトの固定サイズで、サーバーから送信されるデータ全体のサイズは 3G バイトです。
私の環境は次のとおりです。
1 ギガビット イーサネット ネットワーク
40 のノード、1 つの送信側ノードおよび 39 の受信側ノード。すべてのノードのハードウェア構成は同じです: 2 つの AMD CPU、各 CPU には 2 つのコア @2,6GHz があります。
クライアント側では、1 つのスレッドがソケットを読み取り、データをキューに入れます。追加の 1 つのスレッドがキューからデータをポップし、軽い処理を行います。
マルチキャスト送信中に、ノード側で 30% のパケット ドロップ率を認識します。netstat –su 統計を観察することで、クライアント アプリケーションによって欠落しているパケットは、netstat 出力の RcvbufErrors 値と同じであると言えます。
これは、ソケット バッファがいっぱいになったため、不足しているすべてのパケットが OS によってドロップされたことを意味しますが、キャプチャ スレッドがバッファを時間内に読み取れない理由がわかりません。送信中、4 つのコアのうち 2 つが 75% 使用され、残りはスリープ状態です。これらのノードを使用しているのは私だけですが、この種のマシンは 1 ギガビットの帯域幅を問題なく処理できると思います。amd cpus に g++ コンパイラ フラグを追加することで、既にいくつかの最適化を行っています。これにより、パケット ドロップ率が 10% に減少しますが、それでも私の意見では高すぎます。
もちろん、UDP が信頼できないことはわかっています。私は独自の修正プロトコルを持っています。
管理権限がないため、システム パラメータを変更することはできません。
どうすればパフォーマンスを向上させることができますか?
編集:ソケットを読み取っている2つのスレッドを使用して、この問題を解決しました。recv ソケット バッファがいっぱいになることがあります。しかし、平均ドロップは1%未満なので、対処するのに問題はありません。