У меня есть машина SLES, которая накапливает TCP-соединения в состоянии CLOSE_WAIT для того, что кажется навсегда. Эти дескрипторы в итоге высасывают всю доступную память. На данный момент у меня 3037 из них, но это было намного выше, до недавней перезагрузки.
Интересно то, что они не из соединений с локальными портами, которые я ожидаю прослушивания. У них нет связанных PID, и их таймеры, похоже, истекли.
# netstat -ton | grep CLOSE_WAIT
tcp 176 0 10.0.0.60:54882 10.0.0.12:31663 CLOSE_WAIT off (0.00/0/0)
tcp 54 0 10.0.0.60:60957 10.0.0.12:4503 CLOSE_WAIT off (0.00/0/0)
tcp 89 0 10.0.0.60:50959 10.0.0.12:3518 CLOSE_WAIT off (0.00/0/0)
# netstat -tonp | grep CLOSE_WAIT
tcp 89 0 10.0.0.59:45598 10.0.0.12:1998 CLOSE_WAIT -
tcp 15 0 10.0.0.59:60861 10.0.0.12:1938 CLOSE_WAIT -
tcp 5 0 10.0.0.59:56173 10.0.0.12:1700 CLOSE_WAIT -
Я не черный пояс, когда дело доходит до стека TCP или сетей ядра, но конфигурация TCP кажется разумной, так как эти значения являются значениями по умолчанию для man-страницы:
# cat /proc/sys/net/ipv4/tcp_fin_timeout
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
Так что же дает? Если таймеры истекли, не должен ли стек автоматически очистить это? Я эффективно даю себе долгосрочную DoS, поскольку эти вещи накапливаются.
sudo netstat -tonp
посмотреть, с какой программой это происходит.