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