Наш сервер перегружен сессиями TCP / IP, у нас их 1200 - 1500. Большинство из них висят в состоянии TIME_OUT. Оказывается, что соединение в состоянии TIME_OUT занимает сокет, пока не истечет 60-секундный тайм-аут.
Проблема в том, что сервер перестает отвечать на запросы, а многие клиенты не обслуживаются.
Я сделал простой тест: загрузите файл XML с сервера с помощью Internet Explorer 8.0. Загрузка заканчивается за доли секунды. Но потом я вижу, что соединение TCP / IP висит в состоянии TIME_OUT в течение 60 секунд.
Есть ли способ избавиться от ожидания TIME_OUT или сделать его меньше, чтобы освободить сокет для новых соединений?
Я понимаю, почему соединение TCP / IP переходит в состояние TIME_OUT, но я не понимаю, почему Internet Explorer не закрывает соединение после окончания загрузки файла XML.
Детали.
На нашем сервере работает веб-сервис, написанный на Perl (mod-perl). Сервис предоставляет данные о погоде клиентам. Клиент - это приложение Flash (фактически элемент управления Flash ActiveX, встроенный в приложение Windows).
ОС: Ubuntu
Параметр Apache "Keep Alive" установлен на 0
источник
KeepAlive on|off
.KeepAlive 0
является синтаксисом Apache 1.1; Я полагаю, вы не используете это.Ответы:
Это настройка в вашем стеке TCP. Поскольку мы не знаем, на какой платформе вы находитесь, мы не можем точно сказать, как она называется и как ее изменить.
ОБНОВИТЬ
Итак, вы используете Ubuntu. Вы можете использовать
sysctl
для уменьшенияnet.inet.tcp.msl
значения до половины желаемойTIME_WAIT
продолжительности (в миллисекундах - см.man -S 4 tcp
), Напримерsysctl net.inet.tcp.msl=2500
. Остерегайтесь последствий этого в отношении блуждающих пакетов, которые могут прибыть послеTIME_WAIT
истечения периода.источник
Я полагаю, вы имеете в виду
TIME_WAIT
. Одноранговый узел, который инициирует активное закрытие, является тем, который входитTIME_WAIT
(см. Диаграмму перехода состояния здесь ), поэтому, если вы можете заставить свой клиент закрыть соединение, то вы переместитеTIME_WAIT
выключение клиенту. Смотрите этот ответ для более подробной информации и ссылки на хорошую статью оTIME_WAIT
проблемах и способах их решения.Другой вариант, если клиент не может выполнить активное закрытие, это сбросить соединение, установив linger в false перед закрытием. Это вызывает
RST
отправку, а неFIN
.источник
TIME_WAIT
это нормально, и если производительность вашего сервера не страдает из-за этого, я не слишком беспокоюсь об этом. Когда сокетTIME_WAIT
подключен, он потребляет некоторые ресурсы, но это не означает, что соединение все еще открыто или сервер его обрабатывает.Сервер, который не отвечает, скорее всего, не имеет никакого отношения к количеству соединений в состоянии TIME_WAIT. Непонятно, что вы подразумеваете под "занимает сокет" - сервер должен был уже давно иметь
close
сокет в этой точке. Система должна обрабатывать десятки тысяч соединений в состоянии TIME_WAIT.источник