IT

CLOSE_WAIT 소켓 연결을 제거하는 방법

lottoking 2020. 10. 10. 10:25

CLOSE_WAIT 소켓 연결을 제거하는 방법


특정 포트의 서버와 상호 작용하는 작은 프로그램을 작성했습니다. 프로그램은 잘 작동하지만 :

이 예기치 않게 프로그램 종료되면 해당 소켓 연결이 CLOSE_WAIT상태 로-display됩니다 . 을 실행하려고 프로그램하면 중단되고 강제로 닫아야하므로 더 많은 CLOSE_WAIT 소켓 연결 이 축적 됩니다.

플러시하는 방법이 있습니까?


CLOSE_WAIT프로그램이 여전히 실행 중이고 소켓을 닫지 갑자기 발생하는 것을 의미합니다 (커널이 그렇게하기를 기다리고 있음). 추가 -pnetstatPID를 위해, 다음 (더 강력하게 죽일 SIGKILL필요한 경우). 그것은 당신의 CLOSE_WAIT소켓을 제거해야합니다 . 를 사용 하여 pid 를 사용 ps하여 수도 있습니다 .

SO_REUSEADDR서버 및 TIME_WAIT출시를 위해 도입하기 시작합니다.


Crist Clark에 의해 설명 된대로 .

CLOSE_WAIT는 연결의 로컬 끝이 다른 쪽 끝에서 FIN을 거쳐 OS는 로컬 끝의 프로그램이 실제로 연결을 닫을 때 기다리고 있음을 의미합니다.

문제는 로컬 컴퓨터에서 실행중인 프로그램이 소켓을 닫지 않는다는 것입니다. TCP 튜닝 문제가 아닙니다. 연결은 프로그램이 연결을 열린 상태로 유지하는 동안 CLOSE_WAIT에 영원히있을 수 있습니다 (정확하게).

로컬 프로그램이 소켓을 닫으면 OS는 FIN의 ACK를 기다리는 동안 LAST_ACK로 전환하는 원격 끝으로 FIN을 보낼 수 있습니다. 수신 연결이 완료되고 연결 테이블에서 삭제됩니다 (엔드가 CLOSE_WAIT 인 경우 TIME_WAIT 상태 가 발생하지 않습니다 ).


CLOSE_WAIT 연결이 너무 많으면 처음에는 코드에 문제가 있음을 의미하며 좋은 방법이 아닙니다.

https://github.com/rghose/kill-close-wait-connections 에서 확인할 수 있습니다.

이 펼쳐 놓는 작업 연결이 대기중인 ACK를 대기합니다.

이것이 나를 위해 일한 것입니다.


최신 Tomcat 서버 (7.0.40) 동일한 문제가 발생합니다. 며칠 동안 한 번 응답하지 않습니다.

열린 연결을 보려면 다음을 사용할 수 있습니다.

sudo netstat -tonp | grep jsvc | grep --regexp="127.0.0.1:443" --regexp="127.0.0.1:80" | grep CLOSE_WAIT

이 게시물 에서 언급했듯이 사용 /proc/sys/net/ipv4/tcp_keepalive_time하여하여 값을 볼 수 있습니다 . 값은 초 단위로 보이며 주소는 7200 (예 : 2 시간)입니다.

변경 비용을 수정해야합니다 /etc/sysctl.conf.

Open/create `/etc/sysctl.conf`
Add `net.ipv4.tcp_keepalive_time = 120` and save the file
Invoke `sysctl -p /etc/sysctl.conf`
Verify using `cat /proc/sys/net/ipv4/tcp_keepalive_time`

Socket클라이언트와 서버 끝 모두 인스턴스가 명시를 호출 해야한다는 점을 명시해야합니다 close(). 끝 중 하나만 호출 close()하면 소켓은 CLOSE_WAIT 상태로 유지됩니다.

참고 URL : https://stackoverflow.com/questions/15912370/how-do-i-remove-a-close-wait-socket-connection