У меня есть проблема в долгоживущем процессе, называемом kube-proxy, являющимся частью Kubernetes .
Проблема в том, что время от времени соединение остается в состоянии FIN_WAIT2.
$ sudo netstat -tpn | grep FIN_WAIT2
tcp6 0 0 10.244.0.1:33132 10.244.0.35:48936 FIN_WAIT2 14125/kube-proxy
tcp6 0 0 10.244.0.1:48340 10.244.0.35:56339 FIN_WAIT2 14125/kube-proxy
tcp6 0 0 10.244.0.1:52619 10.244.0.35:57859 FIN_WAIT2 14125/kube-proxy
tcp6 0 0 10.244.0.1:33132 10.244.0.50:36466 FIN_WAIT2 14125/kube-proxy
Эти соединения со временем складываются, что приводит к неправильной работе процесса. Я уже сообщил о проблеме в баг-трекер Kubernetes, но я хотел бы понять, почему такие соединения не закрываются ядром Linux.
Согласно его документации (поиск tcp_fin_timeout) соединение в состоянии FIN_WAIT2 должно быть закрыто ядром через X секунд, где X можно прочитать из / proc. На моей машине установлено 60:
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
60
поэтому, если я правильно понимаю, такие соединения должны быть закрыты на 60 секунд. Но это не тот случай, они остаются в таком состоянии на несколько часов.
Хотя я также понимаю, что соединения FIN_WAIT2 довольно необычны (это означает, что хост ожидает некоторого ACK от удаленного конца соединения, которое может уже отсутствовать), я не понимаю, почему эти соединения не «закрываются» системой ,
Что я могу с этим поделать?
Обратите внимание, что перезапуск связанного процесса является последним средством.