Вопрос

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

Это было полезно?

Решение

Коллекция Eden по -прежнему входит в паузу STW, поэтому 20 мс может быть совершенно нормальным в зависимости от поведения распределения и размера кучи/размера живого набора.

Другие советы

Ваш код Java работает под RTLINUX, или какое-то другое дистрибутив с трудным планированием в режиме реального времени? Если нет, то 10-20 мсек джиттера в время обработки кажется совершенно разумным и ожидаемым.

У меня была такая же проблема в Java-сервисе, над которым я работаю.При неоднократном отправке того же запроса от клиента сервер блокирует в том же месте в потоке на 25-35 мс.Отключение алгоритма Нэгла в сокете исправило это для меня.Это можно сделать, вызвав setTcpNoDelay(true) в Socket.Это может привести к увеличению перегрузки сети, потому что ACK теперь будут отправлены в виде отдельных пакетов.Видеть http://en.wikipedia.org/wiki/Nagle%27s_algorithm для получения дополнительной информации об алгоритме Нэгла.

От TCPDUMP FAQ:

Когда пакет наклеивается? Насколько точны марки времени?

В большинстве OSES, на которых запускаются TCPDUMP и LibpCAP, пакет отпечатана временем как часть процесса драйвера устройства сетевого интерфейса или стека сети, обрабатывая его. Это означает, что пакет не является отпечатанным временем в тот момент, когда он прибывает в сетевой интерфейс; После того, как пакет прибывает в сетевой интерфейс, будет задержка до тех пор, пока не будет доставлено прерывание, или сетевой интерфейс будет опробован (т.е. сетевой интерфейс может не прервать хост немедленно - драйвер может быть настроен для опроса интерфейса, если сеть Трафик является тяжелым, чтобы уменьшить количество прерываний и обрабатывать больше пакетов на прерывание), и между тем, как прерывание начинает обрабатывать прерывание, будет дальнейшая задержка.

Таким образом, есть шансы, что метка времени сделана в привилегированном уровне ядра, а потерянные 20 мс-это переключение контекста, переключающие накладные расходы обратно в пространство пользователя, в Java и логику сети JVMS. Без большего анализа системы в целом я не думаю, что можно сделать позитивный выбор причины.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top