Наше приложение быстро считывает данные по сокетам 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 МБ в секунду.