Назад | Перейти на главную страницу

Удаление сокетов CLOSE_WAIT без остановки родительского процесса в Linux

Tomcat оставляет мне сокеты CLOSE_WAIT, которые в конечном итоге насыщают максимальное количество подключений.

Я пробовал много методов в своем клиентском и серверном коде, чтобы избавиться от них безрезультатно, включая закрытие соединений, вызов System.gc () и т. Д.

Теперь я пытаюсь найти способ просто быстро отключить их в ОС. У меня работает conntrack, но я не уверен, как использовать это, чтобы убить эти соединения. Я также установил / proc / sys / net / ipv4 / netfilter / ip_conntrack_tcp_timeout_close_wait в 1, что, конечно, слишком мало, но соединения сохраняются.

Есть ли способ убить эти зомби-сокеты?

Запуск Ubuntu.

Я считаю, что CLOSE_WAIT на стороне сервера соединения означает, что сервер получил FIN от клиента, подтвердит это обратно клиенту, а затем сообщит приложению, что он может закрыть соединение.

Затем приложение должно разорвать соединение, как только оно убедится, что все данные были прочитаны из соединения.

Как только он откажется от соединения, сервер отправит окончательный FIN обратно клиенту, и соединение будет полностью закрыто.

Предполагает, что это не имеет ничего общего с "TCP_tuning"

Вы уверены, что ваше приложение закрывает сокеты?

Когда я написал сервер Python, я узнал следующее: D

ОБНОВИТЬ
В зависимости от версии Tomcat вы могли столкнуться с этой проблемой из-за ошибки, появившейся в Tomcat 6 с функцией keepAliveTimeout в протоколе Coyote AJP.
Природа этой проблемы была вызвана тем, что Tomcat не смог закрыть сокеты после истечения срока действия keepAliveTimeout. Сокеты Tomcat останутся в состоянии CLOSE_WAIT, но соответствующие сокеты mod_jk закроются как обычно.

его ошибка была исправлена ​​в SVN commit r589062 и выпущена в Tomcat 6.0.15