서버 http 연결 대량 TIMEWAIT 문제 해결 방법

3809 단어 tcptime_waithttp
더 읽 기
 
최근 사용자 의 tomcat 서버 에 TIMEWAIT 상태의 연결 로 인해 뒤의 연결 이 들 어가 지 못 하고 서비스 가 응답 하지 않 는 상황 이 발생 합 니 다.
우선 명령 을 사용 하여 현재 의 각종 상태의 수량 을 봅 니 다:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'    
실행 후 일반적인 결 과 는 다음 과 같다.
    TIME_WAIT 8
    CLOSE_WAIT 323
    SYN_SENT 1
    ESTABLISHED 6171
그 중에서 자주 사용 하 는 세 가지 상 태 는:
ESTABLISHED      통신 중
TIME_WAIT           꺼 짐
CLOSE_WAIT        닫 힘
 
1. TIME 출현WAIT 의 이유
TCP 가 하나의 연결 을 만 들 려 면 적어도 세 개의 그룹 을 교환 해 야 하기 때문에 TCP 의 3 번 악수 (three - way handshake) 라 고도 부 릅 니 다. 그러나 TCP 가 연결 을 종료 할 때 쌍방 이 하나의 FIN 분 절 을 상대방 에 게 보 내 확인 해 야 하기 때문에 TCP 가 연결 을 중지 하려 면 보통 4 개의 분 절 을 교환 해 야 합 니 다.구체 적 으로 보면: 1) 응용 프로 세 스 (active close) 가 먼저 close 를 호출 하여 TCP 에서 FIN 분 절 을 보 냅 니 다. 데이터 가 전송 되 었 음 을 나타 내 고 소켓 을 닫 아 달라 고 요청 합 니 다. 2) 다른 쪽 응용 프로 세 스 (passive close) 는 FIN 을 받 고 이 쪽 의 TCP 에서 확인 합 니 다.FIN 의 수락 도 파일 끝 문자 로 상부 응용 프로 세 스에 전 달 됩 니 다.이 파일 끝 자 는 프로 세 스 의 EOF 가 아 닙 니 다. TCP 바이트 흐름 에서 EOF 의 읽 거나 쓰 기 는 특수 한 FIN 분 절 을 통 해 이 루어 집 니 다. 3) 다른 쪽 (passive close) 응용 프로 세 스 는 파일 빔 을 받 은 후 close 를 호출 하여 소켓 을 닫 습 니 다. 이 로 인해 이 쪽 의 TCP 도 FIN 분 절 을 보 냅 니 다. 4) 액 티 브 클 로 저 (active close) 가 이 FIN 을 받 아들 인 후 TCP 가 이 를 확인 합 니 다.(TCP 가 ACK 분 절 을 보 내 는데 주의해 야 할 것 은 주동 적 으로 닫 는 쪽 이 FIN 을 받 아들 이기 전에 그 상태 가 TIME WAIT 입 니 다). 
服务器http连接出现大量TIME_WAIT问题的解决方法_第1张图片
TIME_OUT 상태의 존재의 의미 그림 에서 TIME 가 선명 하 게 보 입 니 다.WAIT 상 태 는 active close 단 에서 발생 하 는데 발생 하 는 시점 은 ACK K + 1 분 절 을 보 낸 후에 ACK 분 절 이 네트워크 에서 분실 (lost) 되 는 것 을 방지 하기 때 문 입 니 다. 이때 passive close 는 LAST 에 들 어 갑 니 다.ACK 분 절 을 기다 리 는 것 을 뜻 하 는 ACK 상태 로, 이때 ACK 분 절 이 정말로 분 실 된 경우 (passive close 단의 LAST ACK 시간 초과), passive close 단 은 다시 하나의 FIN K 분 절 을 대 단 에 보 냅 니 다.그림 에서 FIN 의 분 절 이 두 번 나 오 는 이유 다.
TCP 기반 HTTP 프로 토 콜 에 대해 TCP 연결 을 닫 는 것 은 서버 엔 드 입 니 다. 그러면 서버 엔 드 는 TIME 에 들 어 갑 니 다.WAIT 상태, 가능 방문 이 많은 웹 에 대해 알 고 싶 습 니 다. Server, 대량의 TIME 가 존재 합 니 다.WAIT 상태, server 가 1 초 에 1000 개의 요청 을 받 으 면 240 * 1000 = 240, 000 개가 쌓 입 니 다. TIME_WAIT 의 기록, 이러한 상 태 를 유지 하 는 것 은 서버 에 부담 을 줍 니 다.물론 현대 운영 체 제 는 빠 른 검색 알고리즘 으로 TIME 를 관리 합 니 다.WAIT, 그래서 새로운 TCP 연결 요청, hit 중 하나의 TIME 여 부 를 판단 합 니 다.WAIT 는 시간 이 많이 걸 리 지 는 않 지만 이렇게 많은 상 태 를 유지 해 야 하 는 것 은 항상 좋 지 않다.
 
2. 해결 대량 TIMEWAIT 상황 의 방법
/ etc / sysctl. conf 파일 수정:
#        ,         SYN          ,     255,    5,   180        
net.ipv4.tcp_syn_retries=2  
#net.ipv4.tcp_synack_retries=2  
#   keepalive     ,TCP  keepalive     。   2  ,  300   
net.ipv4.tcp_keepalive_time=1200  
net.ipv4.tcp_orphan_retries=3  
#              ,           FIN-WAIT-2       
net.ipv4.tcp_fin_timeout=30    
#  SYN     ,   1024,       8192,                。  
net.ipv4.tcp_max_syn_backlog = 4096  
#    SYN Cookies。   SYN       ,  cookies   ,     SYN  ,   0,      
net.ipv4.tcp_syncookies = 1  
  
#      。   TIME-WAIT sockets      TCP  ,   0,      
net.ipv4.tcp_tw_reuse = 1  
#    TCP   TIME-WAIT sockets     ,   0,      
net.ipv4.tcp_tw_recycle = 1  
  
##             
net.ipv4.tcp_keepalive_probes=5   
##             
net.core.netdev_max_backlog=3000   

 수정 후 실행:
/sbin/sysctl -p
이렇게 하면 매개 변 수 는 효력 이 발생 할 수 있다.
위 에서 수 정 된 매개 변수 중에서 가장 중요 한 것 은 4 개의 매개 변수 입 니 다.
net.ipv4.tcp_tw_reuse  
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_fin_timeout net.ipv4.tcp_keepalive_*
일반적으로 이런 것들 을 수정 하면 기본적으로 쓰기 에 충분 하 다.
 

좋은 웹페이지 즐겨찾기