Проблема производительности сокета TCP / IP Java

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

10
задан Sam Goldberg 14 March 2011 в 22:46
поделиться