CLOSE_WAIT 소켓 연결을 제거하는 방법
특정 포트의 서버와 상호 작용하는 작은 프로그램을 작성했습니다. 프로그램은 잘 작동하지만 :
이 예기치 않게 프로그램 종료되면 해당 소켓 연결이 CLOSE_WAIT
상태 로-display됩니다 . 을 실행하려고 프로그램하면 중단되고 강제로 닫아야하므로 더 많은 CLOSE_WAIT
소켓 연결 이 축적 됩니다.
플러시하는 방법이 있습니까?
CLOSE_WAIT
프로그램이 여전히 실행 중이고 소켓을 닫지 갑자기 발생하는 것을 의미합니다 (커널이 그렇게하기를 기다리고 있음). 추가 -p
할 netstat
PID를 위해, 다음 (더 강력하게 죽일 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
'IT' 카테고리의 다른 글
포함 () 연산자가 Entity Framework의 성능을 향상시키는 이유는 무엇입니까? (0) | 2020.10.10 |
---|---|
팬더 read_csv 및 usecols로 열 필터링 (0) | 2020.10.10 |
Flexbox 레이아웃이 100 % 수직 공간을 차지하게해야합니까? (0) | 2020.10.10 |
EQATEC 약력 러로 ASP.NET 웹 사이트 약력 링 (0) | 2020.10.10 |
URL 인코딩과 HTML 인코딩의 차이점 (0) | 2020.10.10 |