LINUX.ORG.RU

Накопление сокетов в состоянии TIME_WAIT

 ,


0

2

На одной машине работают входящие в состав многокомпонентной системы TCP-сервер и TCP-клиент: сервер слушает, клиент коннектится, сервер принимает соединение и биндит клиента на отдельный сокет на отдельном порту. Сервер выполняет запрос клиента и закрывает соединенение.
Такие запросы происходят несколько раз в секунду, и уже через пару минут с помощью netstat в системе можно обнаружить множество (~20.000) сокетов, которые уже закрыты с обеих сторон, но всё ещё ждут опаздывающие пакеты:

...
tcp        0      0 127.0.0.1:8001 127.0.0.1:46833 TIME_WAIT 
tcp        0      0 127.0.0.1:8001 127.0.0.1:46234 TIME_WAIT
tcp        0      0 127.0.0.1:8001 127.0.0.1:46234 TIME_WAIT
...
Эта орда висящих соединений занимает неприемлемо много оперативной памяти и файловых дескрипторов.
Можно ли как-то ускорить высвобождение ресурсов в этой ситуации?

Немного ссылок по теме:

Попробуй, например, уменьшить:
net.ipv4.tcp_fin_timeout в /etc/sysctl.conf
или /proc/sys/net/ipv4/tcp_fin_timeout на живую.

tzukko ()

Эта орда висящих соединений занимает неприемлемо много оперативной памяти

Замеры в студию.

и файловых дескрипторов

man 2 close

edigaryev ★★★★★ ()

В идеале - кешировать TCP соединения аля Connection: keep-alive в HTTP. Остальное - костыли

anonymous ()

Эта орда висящих соединений занимает неприемлемо много оперативной памяти и файловых дескрипторов.

Таки, почему ты так решил?

APVS ()

Делай одновременно close с обоих сторон. Была у меня где ссылка на хауту...

Проще всего это использовать so_linger. Про последствия этого думай сам. Либо юникс-сокеты.

gh0stwizard ★★★★★ ()
Последнее исправление: gh0stwizard (всего исправлений: 1)
Ответ на: комментарий от gh0stwizard

Делай одновременно close с обоих сторон.

...и получай TIME_WAIT на обеих сторонах соединения.

edigaryev ★★★★★ ()

как в итоге решил делать? сам такую же проблему обнаружил, но решения не нашел

x905 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.