2009-11-30 7 views
1

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

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

ответ

1

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

0

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

1

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

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

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

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

+0

Это действительно веб-сервер (Tomcat), который иногда отказывается от соединений. – ripper234

3

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

+0

Вы уверены? Вы получили больше голосов, но есть и другие, которые утверждают, что видели, как GC влияет на это. – ripper234

+0

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

+1

В этом случае вы можете получить отказ в соединении: у вас одновременно подключено несколько клиентов, но вы не можете их принять (например, GC блокирует приложение или любое количество других причин). Если достаточное количество клиентов заблокировано, вы достигнете предела отставания в сокете для ожидающих accepts(), и ОС откажется от дальнейших попыток подключения. – nos

0

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

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

2

Лучший способ узнать, что ваше приложение сообщит вам, как долго проходят GC. Запуск с опцией -verbose:gc, и вы получите STDOUT запись прогонов GC и сколько времени они взяли. Больше интро GC-материала is at this summary

2

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

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

0

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

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

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

0

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

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

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