Причины TIME_WAIT или CLOSE_WAIT и способы их решения
Причины TIME_WAIT или CLOSE_WAIT и способы их решения

Четыре волны TCP

MSL — это английское сокращение от Maximum Segment Lifetime, которое можно перевести на китайский как «максимальное время выживания пакета».

Рекомендация, данная 2MSL в протоколе RFC 793, составляет две минуты, но в Linux это обычно 30 секунд, что означает, что 2MSL составляет 60 секунд.

Причины CLOSE_WAIT

CLOSE_WAITПассивное закрытие соединения сформировано?,Согласно конечному автомату TCP,Сервер получает FIN, отправленный клиентом.,Стек протоколов TCP автоматически отправит ACK.,Подключитесь, чтобы войтиCLOSE_WAITсостояние。Но если сервер не выполняетSOCKETизCLOSE()действовать,состояние Это не может быть вызваноCLOSE_WAITМигрировать вLAST_ACK,тогда их будет много в системеCLOSE_WAITсостояниеизсоединять.

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

в целом,CLOSE_WAIT Статус сохраняется на сервере непродолжительное время, поэтому если вы обнаружите большое количество CLOSE_WAIT статус, то это означает, что пассивно закрытая сторона не рассылала FIN Пакеты обычно имеют следующие возможности:

(1) Процедурные вопросы:Если вы забыли на уровне кода CLOSE Соответственно socket соединение, то естественно оно не будет отправлено FIN пакет, в результате чего CLOSE_WAIT Накопление или код не является строгим и возникают такие проблемы, как бесконечные циклы, даже если он написан позже; CLOSE Это никогда не сможет быть реализовано.

(2) Реакция слишком медленная или установленное время ожидания слишком мало.:Если обе стороны связи не гармоничны,Одна сторона нетерпелива и прямолинейна. тайм-аут, но другая сторона все еще занята трудоемкой логикой, это приведет к close было отложено. Медленная реакция является основной проблемой, но, если посмотреть на нее под другим углом, она также может быть timeout Настройка слишком мала.

Причины TIME_WAIT

Роль TIME_WAIT

Проще говоря, причина, по которой timewait ожидает 2MSL, заключается в следующем:,Это делается для того, чтобы избежать ненадежной передачи TCP, вызванной потерей сетевых пакетов или задержкой в ​​сети.,И этоTIME_WAITсостояниетогда вы сможете максимизироватьиз Улучшите передачу данных по сетиизнадежность。

в то же времяTCPЭто вообще запрещено ВTIME_WAITизсоединять Восстановить новый наизTCPсоединять, В основном это делается для того, чтобы избежать объединения старых и новых пакетов данных. Итак, подводя итог, Роль TIME_WAIT выглядит следующим образом:

  • Для достижения надежного освобождения полнодуплексных TCP-соединений.
  • Чтобы старые пакеты данных исчезали в сети по истечении срока действия

Опасности слишком большого количества состояний TIME_WAIT

  • Номер локального порта, занятый сокетом, не будет освобожден до тех пор, пока не закончится состояние TIME_WAIT сокета. Обратите внимание, что порт клиента всегда ограничен (65535), и если он исчерпан, то сетевое соединение не удастся.
  • При высоком параллелизме (десятки тысяч запросов в секунду) и использовании короткое соединениеспособ взаимодействияиз После работы в системе в течение определенного периода времени,В системе будет большое количество состояний time_wait.,Если состояние time_wait заняло все доступные порты системы и еще не было переработано системой,Возникнет ситуация, когда новое соединение сокета не может быть создано с сервером. На этом этапе система почти глохнет.,Никакие ссылки не могут быть установлены.
  • Большое количество состояний time_wait также будет использовать определенный объем ресурсов памяти, памяти и процессора. Конечно, этот объем обычно относительно невелик и не представляет серьезной опасности.

Решение

Просмотр TCP-соединений со статусом TIME_WAIT.

Язык кода:shell
копировать
$ netstat -tan |grep TIME_WAIT

Подсчитайте количество соединений в различных состояниях TCP.

Язык кода:shell
копировать
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}'
  • Способ 1: настроить параметры ядра системы
Язык кода:txt
копировать
net.ipv4.tcp_tw_reuse = 1 Указывает, что повторное использование включено. Разрешить TIME-WAIT Сокеты повторно используются для новых TCP-соединений. Значение по умолчанию — 0, что означает закрытие;
net.ipv4.tcp_tw_recycle = 1 Указывает, что TIME-WAIT включен в TCP-соединении. socketsиз Быстрое восстановление,По умолчанию – 0.,значит закрыто.

Или уменьшите значение MSL. Значение MSL в Linux по умолчанию равно 60 с. Мы можем уменьшить значение MSL, чтобы сократить время, необходимое для перехода одного конца активно закрытого соединения из состояния TIME_WAIT в закрытое состояние.

Однако это приведет к тому, что задержанные сообщения не смогут быть очищены, а завершение активно закрытого соединения не сможет принимать повторно переданные запросы FIN. Это также повлияет на повторное использование соединения и настройку многих приложений на основе TCP.

Поэтому в реальных производственных средах нужно действовать с осторожностью.

Просмотр значения MSL по умолчанию

Язык кода:txt
копировать
$ cat /proc/sys/net/ipv4/tcp_fin_timeout

Исправлять

Язык кода:txt
копировать
$echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

Или $ vim /etc/sysctl.con

Язык кода:txt
копировать
fnet.ipv4.tcp_fin_timeout = 30

После оптимизации параметров ядра,Может быть выполненоsysctl -pЗаказ,чтобы активировать вышеуказанные настройки, чтобы они вступили в силу навсегда

  • Способ 2. Измените короткие ссылки на длинные.

Разница между тем, как работают короткие и длинные соединения:

короткое соединение соединять->передавать данные->закрытиесоединять HTTP не сохраняет состояние. Каждый раз, когда браузер и сервер выполняют операцию HTTP, соединение устанавливается, но соединение разрывается после завершения задачи. Вы также можете сказать: короткое Соединение означает, что соединение SOCKET отправляется, данные принимаются и соединение немедленно разрывается. долгое соединение соединять->передавать данные->Держатьсоединять -> передавать данные-> 。。。->закрытиесоединять。 Длинное соединение означает, что после установления соединения SOCKET соединение будет поддерживаться независимо от того, используется оно или нет, но безопасность низкая.

Это видно по разнице,Коэффициент длинных соединений короткое соединение существенно снижает количество закрытых соединений.,уменьшенныйTIME_WAITсостояниеиз Количество производства>количество,В высококонкурентной системе,Изменения таким образом очень эффективны.,Можно существенно сократить количество системных TIME_WAIT.

Мы можем установить значение соединения в заголовке HTTP-запроса на клиенте: Keep-Alive. Замените короткое соединение на длинную ссылку.

Коэффициент длинных соединений короткое соединение фундаментально уменьшает количество раз, когда сервер активно закрывает соединение, и уменьшает генерацию соединений в состоянии TIME_WAIT.

При использовании nginx в качестве обратного прокси-сервера, если вы хотите настроить длинное соединение, вам необходимо установить его как:

Язык кода:txt
копировать
1. Соединение клиента с nginx — долгое.
2. Соединение nginx с сервером — долгое.
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose