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