서버 http 연결 대량 TIMEWAIT 문제 해결 방법
최근 사용자 의 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 입 니 다).
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_*
일반적으로 이런 것들 을 수정 하면 기본적으로 쓰기 에 충분 하 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
k8spacket 및 Grafana를 통한 kubernetes용 TCP 패킷 트래픽 시각화보고 있지 않을 때 k8s 클러스터가 무엇을 하는지 알고 있습니까? 누가 그와 TCP 통신을 설정합니까? k8spacket 및 Grafana 를 사용하여 클러스터의 TCP 트래픽을 시각화할 수 있습니다. 설정된 연결...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.