私はJBoss+EJBベースのエンタープライズアプリケーションの一部を開発しています。私のモジュールは、大量の着信UDPパケットを処理する必要があります。負荷テストを行ったところ、11ミリ秒間隔でパケットを送信した場合はすべて問題ないようですが、10ミリ秒間隔の場合は一部のパケットが失われます。私の意見ではかなり奇妙ですが、10 / 11msの間隔の負荷テストの比較を数回行ったところ、常に同じ結果になりました(10ms-いくつかの「失われた」パケット、11ms-すべてが正常です)。
同期に問題がある場合は、11msのテスト(少なくとも1つのパケットが失われたか、少なくとも1つの間違ったカウンター値)の場合にも表示されると思います。したがって、同期が原因でない場合は、パケットを受信するDatagramSocketが期待どおりに機能しない可能性があります。
受信バッファサイズ(SO_RCVBUF)のデフォルト値は57344であることがわかりました(おそらく、基になるIOネットワークバッファに依存します)。このバッファがいっぱいになると、新しい着信UDPデータグラムが拒否される可能性があります。この値をもう少し高く設定しようとしましたが、誇張すると、バッファがデフォルトのサイズに戻ることに気付きました。基盤となるレイヤーに依存している場合、JBossレベルから特定のOS /ネットワークカードの最大バッファーサイズを確認するにはどうすればよいですか?
受信バッファサイズが原因である可能性はありますか、または57344値がほとんどの場合を処理するのに十分な大きさである可能性がありますか?そのような問題の経験はありますか?
DatagramSocketにタイムアウトが設定されていません。私のUDPデータグラムには約70バイトのデータが含まれています(データグラムヘッダーを含まない値)。
[編集 済み]CiscoNetflowデータを受信するため、UDPを使用する必要があります。UDPは、ネットワークデバイスがトラフィック統計を送信するために使用するプロトコルです。また、送信バイト形式には影響しません(たとえば、パケットのカウンターを追加できないなど)。すべてのパケットが処理されるとは限りませんが(一部のデータグラムが失われる可能性があります)、ほとんどのパケットを処理することを期待しています。10ms間隔のテスト中に、パケットの約30%が失われました。
処理が遅いとこの問題が発生する可能性はほとんどありません。現在、シングルトンコンポーネントは、ループ内でreceiveメソッドを呼び出すDatagramSocketへの参照を保持しています。パケットが受信されると、キューに渡され、プールのステートレスコンポーネントから選択されて処理されます。「ファサード」シングルトンは、パケットを受信して処理に渡すことのみを担当します(完了イベントの処理を待機しません)。
よろしくお願いします、Piotr