FIN_WAIT2 상태의 연결이 Linux 커널에 의해 닫히지 않는 이유는 무엇입니까?


11

나는라는 수명이 긴 과정에 문제가있는 KUBE-프록시 의 존재의 일부 는 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를 기다리고 있음을 의미합니다) 이러한 연결이 시스템에 의해 "닫히지 않은"이유를 알 수 없습니다 .

내가 할 수있는 일이 있습니까?

관련 프로세스를 다시 시작하는 것이 최후의 수단입니다.


1
그건 그렇고, FIN-WAIT2에서 연결이 ACK를 기다리고 있지 않습니다 (전송 된 FIN이 이미 승인되었으므로 FIN-WAIT1에 있지 않습니다). 대신, 다른 쪽 끝에는 여전히 무제한의 데이터를 보낼 수있는 옵션이 있습니다.
— Hagen von Eitzen

답변:


14

커널 시간 초과는 연결이 끊어진 경우에만 적용됩니다. 연결이 여전히 소켓에 연결되어 있으면 해당 소켓을 소유 한 프로그램이 연결 종료 시간 초과를 담당합니다. 아마도 호출 shutdown되어 연결이 완전히 종료되기를 기다리고 있습니다. 종료가 완료되기를 원하는 한 응용 프로그램이 대기 할 수 있습니다.

일반적인 클린 종료 흐름은 다음과 같습니다.

  1. 응용 프로그램은 연결을 종료하기로 결정하고 연결의 쓰기 쪽을 종료합니다.

  2. 응용 프로그램은 다른 쪽이 연결의 절반을 종료 할 때까지 기다립니다.

  3. 응용 프로그램은 상대방의 연결 종료를 감지하고 해당 소켓을 닫습니다.

응용 프로그램은 원하는만큼 2 단계에서 기다릴 수 있습니다.

응용 프로그램에 시간 초과가 필요한 것 같습니다. 연결을 종료하기로 결정한 후에는 일정 시간이 지나면 상대방이 완전히 종료 될 때까지 기다리지 않아야합니다.


Kubernetes 개발자와 함께이 정보를 확인하여 이러한 시간 초과가 구현되었는지 확인합니다. 확인하면 답변을 수락하겠습니다. 그럼에도 불구하고 빠른 응답에 감사드립니다.
— Adam Romanek

귀하의 답변을 더 자세히 이해하고 싶습니다. 고아 연결이 무엇인지 설명해 주시겠습니까?
— Adam Romanek

1
@AdamRomanek 분리 된 연결은 관련 소켓이없는 연결, 즉 커널 자체에서만 액세스 할 수 있고 프로세스가 작업을 수행 할 수없는 연결입니다.
— David Schwartz

도움이 될 것입니다 ... " blog.cloudflare.com/…
— John Greene

2

소켓이 shutdown ()이지만 아직 close ()가 아닌 경우 소켓은 FIN_WAIT2 상태를 유지합니다. 그리고 응용 프로그램은 여전히 ​​파일 디스크립터를 소유하고 있기 때문에 커널은 정리하지 않아도됩니다.


그것은 이미 받아 들여진 대답에 언급되어 있습니다.
— RalfFriedl

나는 close ()가 호출되지 않는다고 구체적으로 덧붙였다.
— L. Yan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.