10개의 연결이 TCP 수신기를 차단하고 차단을 해제하는 방법

10개의 연결이 TCP 수신기를 차단하고 차단을 해제하는 방법

여러 s로 인해 CLOSE_WAIT. 기존 연결의 총 개수가 CLOSE_WAIT10이면 새 연결이 실패합니다. 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를 유발할 수 있는 특정 연결 사고를 "치료"합니다.

관련 정보