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

Oracle 11g TNSLSNR LAST_ACK лавинное соединение соединения

У нас установлена ​​Windows 2k3 EE SP2 с установленной БД Oracle 11.2.0.1.0. БД используется различными приложениями (включая веб-приложения и сервисы). Время от времени у нас возникают некоторые проблемы с веб-приложением, которые вызывают в нем неожиданное поведение, например медленные или не полностью загруженные страницы, странные редиректы. Перезапуск служб Tomcat и Oracle устраняет проблему.

Однажды, когда проблема возникла снова, я просмотрел журналы tomcat и заметил исключение:

java.sql.SQLException: Io exception: The Network Adapter could not establish the connection

Мне пришло в голову, что сервер базы данных может быть занят, перегружен или что-то в этом роде, поэтому я исследовал сетевую активность (с помощью CurrPorts). Были десятки зависших подключений со статусом «Last Ack», которые исходили из процесса Oracle TNSLSNR.exe, запрашивающего локальный порт 1521 (который, как мы знаем, является портом, на котором процесс сам "Слушает).

В программе CurrPorts есть опция «Закрыть выбранные TCP-соединения» при щелчке правой кнопкой мыши, поэтому я использовал ее для всех этих мертвых соединений. Он немедленно устранил проблемы с подключением, с которыми сталкивалось веб-приложение. Хуже всего то, что эта ситуация повторяется, так как один или два раза в час появляется новое соединение, застрявшее при последнем подтверждении.

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

Итак, мне интересно, в чем может быть причина этого?

(Образ проблемы)

Вот изображение диаграммы состояний TCP:

Система попадает в LAST_ACK когда он получает FIN и становится «пассивным» ближе.

Стек IP системы затем отвечает на это FIN с ACK и устанавливает соответствующий сокет на CLOSE_WAIT.

Затем приложению необходимо понять, что сокет завершен, вызовите close() на сокете, то системный IP-стек отправляет FIN и устанавливает сокет на LAST_ACK.

Затем удаленный конец должен ответить ACK и сокет становится CLOSED. Это шаг, которого не происходит.

Я вижу, вы используете IP-адрес локальной системы как в качестве источника, так и в качестве пункта назначения. Извините, я не знаю больше о взаимодействии с локальным хостом в Windows. Это может быть проблема Windows или Oracle. Я надеюсь, что это хотя бы поможет вам понять какие происходит, если нет Зачем.