Наше приложение быстро считывает данные по сокетам TCP/IP в Java. Мы используем библиотеку NIO с неблокирующими сокетами и селектором, чтобы указать готовность к чтению. В среднем общее время обработки для считывания и обработки прочитанных данных составляет субмиллисекунду. Однако мы часто наблюдаем всплески в 10-20 миллисекунд. (работает в Linux).
Используя tcpdump, мы можем видеть разницу во времени между чтением tcpdump двух конфиденциальных сообщений и сравнить это с временем приложений. Мы видим, что tcpdump не задерживается, тогда как приложение может показывать 20 миллисекунд.
Мы уверены, что это не GC, потому что в журнале GC практически нет полного GC, а в JDK 6 (по тому, что я понимаю) GC по умолчанию параллелен, поэтому он не должен приостанавливать потоки приложения (если только не делать Полный GC).
Он выглядит почти так, как будто существует некоторая задержка для метода Java Selector.select(0), чтобы вернуть готовность к чтению, потому что на уровне TCP данные уже доступны для чтения (и tcpdump читает его).
Дополнительная информация: при пиковой нагрузке мы обрабатываем около 6000 x 150 байт за сообщение или около 900 МБ в секунду.