
Когда TIME_WAIT становится врагом
Andrey_Biryukov 7 минут назад Когда TIME_WAIT становится врагом Средний 6 мин 190 Блог компании OTUS Высоконагруженные системы * Сетевые технологии * Настройка Linux * Туториал Привет, Хабр! Меня зовут Андрей Бирюков. Я...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: Andrey_Biryukov 7 минут назад Когда TIME_WAIT становится врагом Средний 6 мин 190 Блог компании OTUS Высоконагруженные системы * Сетевые технологии * Настройка Linux * Туториал Привет, Хабр! Меня зовут Андрей Бирюков. Я — независимый эксперт в области ИТ и ИБ, преподаю в учебных центрах и пишу статьи и книги.
При построении инфраструктуры высоконагруженных систем можно столкнуться с множеством различных проблем. Так, каждый инженер, работающий с высоконагруженными сервисами на Linux, рано или поздно сталкивается с загадочной ошибкой: Cannot assign requested address. Или внезапными обрывами соединений без видимых причин.
Технические детали
Проблема почти всегда кроется в сетевых настройках ядра — той части инфраструктуры, которую принято настраивать по принципу «работает — не трогай». В высоконагруженных системах этот подход может быть смертельно опасен. Почему порты заканчиваютсяДля начала давайте разберемся в одном важном вопросе: почему сетевые порты имеют свойство заканчиваться.
Здесь сразу стоит отметить, что TCP‑соединение не закрывается мгновенно. После того как одна из сторон инициирует закрытие, сокет переходит в состояние TIME_WAIT и остаётся там по умолчанию 60 секунд. Это необходимо для того, чтобы все пакеты, задержавшиеся в сети, успели дойти или были отброшены.
Также это делается для того, чтобы случайно не переиспользовать тот же порт и IP‑адрес для нового соединения, которое получит «призрачные» пакеты от старого. Казалось бы, все вполне логично и правильно. Но в высоконагруженных системах, где клиентское приложение создаёт множество короткоживущих соединений (например, PHP‑FPM, подключающийся к Redis или внешнему API через connect() без пулинга), эти TIME_WAIT‑сокеты накапливаются с огромной скоростью.
Отраслевые последствия
Каждое закрытое соединение занимает порт из диапазона ip_local_port_range, который по умолчанию часто составляет всего около 28 тысяч портов. Когда приложение создаёт 1000 новых соединений в секунду, а порт освобождается только через 60 секунд, в системе одновременно может находиться до 60 тысяч сокетов в состоянии TIME_WAIT. Это неизбежно приводит к исчерпанию доступных портов и ошибке Cannot assign requested address.
Про tcp_tw_recycle и tcp_tw_reuseПервое желание инженера, увидевшего горы TIME_WAIT, — включить «быстрое переиспользование» портов через параметры tcp_tw_recycle и tcp_tw_reuse. Многие руководства по настройке производительности до сих пор содержат эти параметры в примерах, и это огромная ловушка. В Linux ядрах версии 4.
12 и выше параметр tcp_tw_recycle был полностью удалён.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.




