서버 TIMEWAIT 와 CLOSEWAIT 분석 및 해결 방법
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
다음 과 같은 정 보 를 표시 합 니 다: TIMEWAIT 、CLOSE_WAIT 、FIN_WAIT1 、ESTABLISHED 、SYN_RECV 、LAST_ACK 가 자주 사용 하 는 세 가지 상 태 는: ESTABLISHED 는 통신 중, TIMEWAIT 는 자 진 폐쇄, CLOSEWAIT 는 수 동적 으로 닫 혔 다 고 밝 혔 다.
서버 에 이상 이 가장 오래 발생 한 상황 은:
리 눅 스 시스템 에서 모든 사용자 에 게 나 누 어 주 는 파일 핸들 수 는 한계 가 있다 는 것 을 잘 알 고 있 습 니 다. TIMEWAIT 와 CLOSEWAIT 라 는 두 가지 상태 가 계속 유지 된다 면 해당 하 는 수량의 채널 (여기 서 socket 으로 이해 해 야 합 니 다. 보통 하나의 socket 은 서버 엔 드 의 포트 를 차지 하고 서버 엔 드 의 포트 최대 수 는 65535) 이 계속 점용 되 었 습 니 다. 상한 선 에 도달 하면 새로운 요청 이 처리 되 지 않 습 니 다. 그 다음 에 대량의 Too Many Open Files 이상, 그리고 tomcat, nginx,apache 붕괴...
다음은 이 두 가지 상태의 처리 방법 을 토론 하 겠 습 니 다. 인터넷 에서 도 많은 자료 가 이 두 가지 상황 을 혼동 하여 커 널 파 라 메 터 를 최적화 하면 해결 할 수 있다 고 생각 합 니 다. 사실은 이것 은 적절 하지 않 습 니 다.커 널 매개 변 수 를 최적화 하면 timewait 과 다 한 문제, 하지만 closewait 는 응용 프로그램 자체 에서 출발 해 야 합 니 다.
위의 그림 에서 timewait 는 연결 을 주동 적 으로 닫 는 측 이 유지 하 는 상태 입 니 다. 파충류 서버 에 있어 자신 은 클 라 이언 트 입 니 다. 기어 오 르 기 작업 을 완성 한 후에 주동 적 으로 연결 을 닫 고 time 에 들 어 갑 니 다.wait 상태 에서 이 상태 로 2MSL 시간 을 유지 한 후 회수 자원 을 철저히 닫 습 니 다.여 기 는 왜 자원 2MSL 시간 을 유지 합 니까?이것 도 TCP / IP 디자이너 가 규정 한 것 이다.
TCP 는 모든 가능 한 상황 에서 모든 데 이 터 를 정확하게 전송 할 수 있 도록 해 야 한다.socket 을 닫 으 면 한쪽 socket 을 주동 적 으로 닫 으 면 TIME 에 들 어 갑 니 다.WAIT 상태, 수 동적 으로 닫 힌 쪽 은 CLOSED 상태 로 전 환 됩 니 다. 모든 데이터 가 전송 되 는 것 을 보장 할 수 있 습 니 다.하나의 socket 이 닫 혔 을 때 양 끝 에서 네 번 의 악 수 를 통 해 이 루어 졌 습 니 다. 한 끝 에서 close () 를 호출 할 때 이 단 에 데이터 가 전송 되 지 않 았 음 을 설명 합 니 다.악수 가 끝 난 후에 socket 은 모두 최초의 CLOSED 상태 에 있 을 수 있 을 것 같 지만 사실은 그렇지 않다.그 이 유 는 이러한 배정 상태 에 두 가지 문제 가 있 기 때문이다. 우선, 우 리 는 마지막 ACK 가 정상적으로 전송 할 수 있 도록 보장 하 는 어떠한 메커니즘 도 없다. 둘째, 네트워크 에 남아 있 는 패 킷 (wandering Duplicates) 이 있 을 수 있 고 우리 도 정상적으로 처리 해 야 한다.
TIMEWAIT 는 이 두 가지 문 제 를 해결 하기 위해 태 어 났 다.
네트워크 의 한 단락 을 참조 하 십시오:
서버 가 대량의 close 를 유지 하 였 습 니 다.wait 상태
time_wait 문 제 는 커 널 파라미터 조정 과 웹 서버 의 kep - alive 값 을 적 절 히 설정 하여 해결 할 수 있 습 니 다.왜냐하면 timewait 는 자신 이 제어 할 수 있 는 것 입 니 다. 상대방 이 연결 한 이상 이거 나 자원 을 신속하게 회수 하지 않 았 습 니 다. 어쨌든 자신의 프로그램 오류 로 인 한 것 이 아 닙 니 다.하지만 closewait 는 다 릅 니 다. 위의 그림 에서 서버 가 대량의 close 를 유지 하 는 것 을 볼 수 있 습 니 다.wait 는 한 가지 경우 만 있 습 니 다. 바로 상대방 이 FIN 을 보 낸 후에 프로그램 은 자신 에 게 더 이상 ACK 를 보 내지 않 았 습 니 다.다시 말 하면 상대방 이 연결 을 닫 은 후에 프로그램 에서 감지 되 지 않 았 거나 프로그램 자체 가 연결 을 닫 아야 한 다 는 것 을 잊 어 버 렸 기 때문에 이 자원 은 프로그램 에 의 해 계속 점용 되 고 있다.이때 빠 른 해결 방법 은:
주:
이 글 을 쓸 때 가 되 어서 야 나 는 이전에 업무 중 에 겪 었 던 문 제 를 완전히 알 게 되 었 다.프로그래머 는 파충류 (phop) 가 채집 서버 A 에서 실행 되 고 있다 고 썼 다. 프로그램 은 B 서버 에 가서 자원 을 수집 하 였 으 나 A 서버 는 곧 대량의 close 가 나 타 났 다 는 것 을 발견 하 였 다.wait 상태의 연결.나중에 수 동 으로 검사 해 보 니 closewait 상태의 요청 결 과 는 404 입 니 다. B 서버 에 요청 할 자원 이 없다 는 뜻 입 니 다.
다음은 네티즌 분석의 결론 을 인용 한다.
서버 A 는 파충류 서버 입 니 다. 간단 한 HttpClient 를 사용 하여 자원 서버 B 에 있 는 apache 에 파일 자원 을 가 져 오 라 고 요청 합 니 다. 정상 적 인 상황 에서 요청 이 성공 하면 자원 을 캡 처 한 후에 서버 A 는 자발적으로 연결 을 닫 아 달 라 는 요청 을 합 니 다. 이 때 는 주동 적 으로 연결 을 닫 는 것 입 니 다. 서버 A 의 연결 상 태 는 TIME 임 을 알 수 있 습 니 다.WAIT。이상 이 생기 면?요청 한 자원 서버 B 에 존재 하지 않 는 다 고 가정 하면 이 럴 때 서버 B 에서 연결 을 닫 아 달 라 는 요청 을 보 냅 니 다. 서버 A 는 수 동적 으로 연결 을 닫 았 습 니 다. 서버 A 가 수 동적 으로 연결 을 닫 은 후에 프로그래머 가 HttpClient 에 연결 을 풀 어 달라 고 하 는 것 을 잊 어 버 리 면 CLOSE 가 됩 니 다.WAIT 상태 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
TCP/IP 프로토콜 패밀리 이름 및 국제 네트워크 조직 이름의 약어 및 전체 이름WAN 广域网 Wide Area Network LAN 局域网 Local Area Network BP 批处理 Batch Processing IP 互联网协议 Internet Protocol SNA 系统网络结构 Syste...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.