Возможно ли, что длительный цикл GC вызывает исключения «Отказано в соединении»? - PullRequest
1 голос
/ 30 ноября 2009

При подключении к нашему серверу Tomcat время от времени периодически появляется сообщение «ConnectException» с сообщением «Соединение отказано». Могут ли они быть вызваны длинными циклами GC?

(Мы активируем соответствующие флаги JVM, чтобы получить больше сообщений журнала о циклах GC, но я все равно решил задать это здесь)

Ответы [ 9 ]

3 голосов
/ 30 ноября 2009

«Отказано в соединении» означает, что вы достигли удаленного хоста, но решили, что вам не разрешено подключаться. Если проблема с GC, вы получите сообщение об ошибке «Тайм-аут соединения».

2 голосов
/ 01 декабря 2009

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

Например, если у вас есть 10 запросов в секунду и каждый запрос обрабатывается 1 секунда, ваш сервер по крайней мере в среднем справится с поддержкой 10 одновременных подключений. Если клиент (-ы) продолжают отправлять 10 запросов в секунду на ваш сервер, но по какой-то причине каждый запрос обрабатывается вместо 1, вместо 1, сервер должен будет поддерживать 20 одновременных подключений или начать отказывать в попытках подключения, если только меньшее число разрешено.

2 голосов
/ 30 ноября 2009

Лучший способ выяснить это - показать приложению, сколько времени занимает сборщик мусора. Запустите с параметром -verbose:gc, и вы получите на STDOUT запись разверток GC и сколько времени они заняли. Более интро GC вещи в этом резюме

1 голос
/ 30 ноября 2009

Нам нужно больше информации об этом.

Является ли это веб-сервером, который отклоняет соединения?

Сколько памяти, какая платформа и т. Д.

FWIW Я видел замеченных соединений, отклоненных в приложении CORBA во время тяжелого GC. Обратите внимание, что это не то же самое, что получить сообщение об отказе в подключении!

1 голос
/ 30 ноября 2009

Я очень сомневаюсь в этом. Запуск сборки мусора не приведет к тому, что ваш процесс начнет отказывать в соединениях - если среда выполнения занята в фазе GC, то это означает, что в данный момент ваш код не выполняется активно.

0 голосов
/ 01 декабря 2009

Sporadic Connection Refused Ошибки часто бывают вызваны сбоями в работе DNS или сетевого оборудования. Чтобы решить первое, попробуйте использовать IP-адрес вместо имени хоста. Чтобы решить второй вопрос, убедитесь, что аппаратное обеспечение имеет высокое качество (то есть, нет перебоев в кабелях, статического электричества в окружающей среде и т. Д.).

Если бы это было на самом деле вызвано GC (что я не верю, с таким тщательно разработанным программным обеспечением), то вы были бы не единственным, кто столкнулся с этой конкретной проблемой.

Да, чтобы быть понятным, ошибка normal Connection Refused фактически означает, что другая сторона не может быть достигнута. Это часто вызвано неправильным IP-адресом, или неправильным портом, или неразрешимым именем хоста, или каким-либо программным / аппаратным брандмауэром в сетевой линии, который блокирует соединение.

0 голосов
/ 01 декабря 2009

Если я правильно помню, соединение может быть отклонено, если операционная система имеет слишком много соединений, которые были приняты, но которые необходимо обработать. Если это действительно так, Tomcat не может обслуживать сокеты достаточно быстро.

Мое первоначальное предположение состояло бы в том, что у вас есть что-то внутренне удерживающее потоки, поэтому они не могут завершить обработку. Ваш пул потоков достаточно большой? У вас есть глобально синхронизированный объект / метод, через который нужно пройти все?

Пожалуйста, расскажите подробнее о вашей ситуации.

0 голосов
/ 30 ноября 2009

Это возможно, но очень, очень маловероятно. Если вы думаете, что это GC, продолжайте внимательно следить за различными областями памяти от eden вплоть до permgen и особенно за их поведением.

Если бы мне пришлось сделать обоснованное предположение, я бы предположил, что вы исчерпали свой пул соединений, потому что фактические операции, связанные с одним соединением, выполняются очень долго - и это были бы операции 1003 * до на исходное соединение даже ответили, действия после этого вызовут тайм-аут.

0 голосов
/ 30 ноября 2009

Я думаю, что GC никогда не займет так много времени, что сетевые подключения прекратят работу или получат отказ Я очень сомневаюсь, что это проблема.

...