여러 s로 인해 CLOSE_WAIT
. 기존 연결의 총 개수가 CLOSE_WAIT
10이면 새 연결이 실패합니다. 10개의 연결 제한은 어디입니까? 어떻게 연장하나요? (이를 제거하는 방법을 찾기는 어렵지만 CLOSE_WAIT
이는 다른 질문입니다. 특히 10개의 연결 제한을 확장하는 방법에 대한 것입니다.)
Ubuntu 18.04
커널: 4.15.0-91-일반
아키텍처: x86_64
산출netstat --tcp --numeric-ports -p|grep 2225
tcp 15 0 localhost:2225 localhost:42928 CLOSE_WAIT -
tcp 8 0 localhost:2225 localhost:33860 CLOSE_WAIT 10570/mdp
tcp 15 0 localhost:2225 localhost:41938 CLOSE_WAIT -
tcp 15 0 localhost:2225 localhost:42800 CLOSE_WAIT -
tcp 15 0 localhost:2225 localhost:40912 CLOSE_WAIT -
tcp 25 0 localhost:2225 localhost:33974 CLOSE_WAIT -
tcp 0 1 localhost:51842 localhost:2225 SYN_SENT 12221/telnet
tcp 15 0 localhost:2225 localhost:41808 CLOSE_WAIT -
tcp 0 0 localhost:33202 localhost:2225 ESTABLISHED 33721/controller
tcp 481 0 localhost:2225 localhost:33596 CLOSE_WAIT 10570/mdp
tcp 20 0 localhost:2225 localhost:33582 CLOSE_WAIT 10570/mdp
tcp 0 0 localhost:2225 localhost:33202 ESTABLISHED 10570/mdp
연결하려고 하면 "연결 시간 초과" 메시지가 나타납니다.
청취 백로그는 5로 설정됩니다.
애플리케이션은 (의도적으로) 연결을 제한하지 않습니다.
답변1
그런 제한은 없습니다(물론,예, 그러나 일반 시스템의 경우에도 40,000개의 연결 제한을 훨씬 초과합니다.
거기 무엇이 있나요?예,하지만 그것은제한소켓 백로그플러스 서비스 연결(다중 스레드 서버의 경우)
확인하려면 strace
바이너리를 실행하고 grep을 사용하여 해당 줄의 출력을 찾으세요 listen(x,y)
. CLOSE_WAIT 상태의 연결은 총 백로그에 포함될 수 있으므로 값이 너무 낮으면정상CLOSE_WAIT의 양으로 인해 서버가 새 연결을 수락하지 못할 수 있습니다.
CLOSE_WAIT는 다음을 의미합니다.고객연결이 닫혔지만 서버가 소켓을 해제하지 않았습니다. 소켓에 연결된 모든 스레드나 리소스는 계속 사용 중입니다. 일반적으로 서버의 경우 이는 의미가 없습니다. 연결이 종료되자마자 프로세스도 종료되어야 합니다. 그렇지 않다면 코드 수준에 문제가 있다는 의미입니다(반면 TIME_WAIT는 커널 수준에서 조정할 수 있음). 예를 들어이 기사.
너할 수 있는경우에 따라 CLOSE_WAIT 지연 시간이 단축됩니다(참조:여기), 그러나 실제 문제는 코드에 있으므로 코드에서 해결해야 합니다.
제공할 수 있는 연결 수를 늘리려면 서버 코드에 대한 작업도 필요합니다. 이는 간단한 구성 지시문(예: MaxConnections)일 수도 있고 스키마 변경을 의미할 수도 있습니다.
어떤 경우에는 멀티플렉서를 배치하는 것이 가능할 수도 있습니다.총디르서버 앞에서(예: 원래 프로그램을 포트(예: 127.0.0.1:12225)에서 실행한 다음 redir에게 0.0.0.0:2225의 연결을 수신하고 127.0.0.1:12225로 리디렉션하도록 지시) 과도한 CLOSE_WAIT를 유발할 수 있는 특정 연결 사고를 "치료"합니다.