Я использую dante v1.2.1 в качестве прокси-сервера SOCKS. Прокси-сервер работает нормально, но в конце дня работает около 40-50 или более дочерних процессов sockd, даже если нет активных подключений.
lsof показывает, что все дочерние процессы имеют сокеты в состояниях CLOSE_WAIT и FIN_WAIT2. Эти дочерние процессы остаются в этом состоянии, если я вручную не убью / не перезапущу демон.
Я запускаю Gentoo Linux на ядре 2.6.24-23-xen. Я недавно обновился с dante v1.1.19-r4, что дало мне ту же проблему.
Это проблема конфигурации Dante, моей системы или проблема с кодированием в исходном коде dante?
CLOSE_WAIT означает, что другая сторона закрыла соединение. Сокет будет закрыт после того, как локальная программа закроет дескриптор сокета. Для CLOSE_WAIT нет тайм-аута, поэтому процесс может застрять с сокетом в этом состоянии на неопределенное время. Когда вы убиваете процесс и его потомков, они закрывают сокеты, и они закрываются. Бегать lsof
и посмотрите, открыты ли у детей розетки. Если да, то это похоже на ошибку в их коде.
Что касается FIN_WAIT2, это когда локальная сторона ожидает FIN, ACK с другой стороны, чтобы подтвердить закрытие соединения. Однако для этого состояния существует общесистемный тайм-аут (см. /proc/sys/net/ipv4/tcp_fin_timeout
), который по умолчанию составляет 60 секунд, поэтому ничто не должно задерживаться в этой фазе дольше минуты. НО, если кажется, что можно закодировать программу таким образом, чтобы полузакрытое соединение выглядело как активное для ядра, поэтому тайм-аут не сработает. Опять же, похоже, что вы нашли Жук.