私たちのアプリケーションは、JavaのTCP/IPソケットを介して非常に高速にデータを読み取っています。読み取りの準備ができていることを示すために、ノンブロッキングソケットとセレクターを備えたNIOライブラリを使用しています。平均して、読み取られたデータの読み取りと処理の全体的な処理時間は1ミリ秒未満です。ただし、10〜20ミリ秒のスパイクが頻繁に見られます。(Linuxで実行)。
tcpdumpを使用すると、tcpdumpが2つの個別のメッセージを読み取ったときの時間差を確認し、それをアプリケーションの時間と比較できます。tcpdumpには遅延がないように見えますが、アプリケーションは20ミリ秒を表示できます。
GCログには実質的にフルGCが表示されないため、これはGCではないと確信しています。JDK6では(私が理解しているように)デフォルトのGCは並列であるため、アプリケーションスレッドを一時停止しないでください(フルGCを実行しない限り)。 。
Selector.select(0)
TCP層では、データを既に読み取ることができる(そしてtcpdumpがデータを読み取っている)ため、Javaのメソッドが読み取りの準備を返すのに多少の遅延があるように見えます。
追加情報:ピーク負荷では、メッセージあたり平均約6,000 x 150バイト、つまり1秒あたり約900MBを処理しています。