TIME_WAIT이 많이 발생해서, DB 연결등의 문제가 발생한 경우..
해결 방안..
우선 연결중인 connection과 상태 확인을 위한 query
# netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n |
결과는 현재 상태를 sortm 형태로 보여준다.
[home]# netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n 1 Foreign 1 established) 60 CLOSE_WAIT 73 LISTEN 774 TIME_WAIT 1897 ESTABLISHED # |
Connection 의 TIME_WAIT 지속시간 확인
# netstat -top | grep TIME_WAIT |
IP로 확인하기
# netstat -antop | grep TIME_WAIT |
Time wait 시간만 표시 (sort 해서 max 시간
netstat -antop | grep TIME_WAIT | awk '{print $9}' | sort -n |
TIME_WAIT의 개수가 많은 경우....
해결 방법은
1) TIME_WAIT의 Timeout 시간 줄이기..
timewait 설정 변경
커널레벨에서 TIME-WAIT자원에 대한 사용을 변경할 수도 있다
현재 설정값 확인
# cat /proc/sys/net/ipv4/tcp_fin_timeout 60 |
기본 설정값은 60 초 이다.
30초로 해당 설정값 변경
# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout |
2) Socket Reuse 설정 변경'
커널레벨에서 TIME-WAIT자원에 대한 사용을 변경할 수도 있다.
tcp_tw_recycle
기본값은 0인데, 1로 할경우 TIME-WAIT 상태를 빠르게 recycling 하도록 도와준다. 이에 대한 명확한 정보를 얻기 힘들었다.
tcp_tw_reuse
기본값은 0인데, 1로 할경우 TIME-WAIT 상태의 소켓을 재사용할 수 있게 해준다. TIME-WAIT 문제를 피하기 위한 가장 확실한 방법이다.
- tcp_tw_reuse=1 ## 기본값은 0 //TCP TIME_WAIT Socket 재사용 여부
기본값은 0인데, 1로 할경우 TIME-WAIT 상태를 빠르게 recycling 하도록 도와준다. 이에 대한 명확한 정보를 얻기 힘들었다.
사용하지 않으면, 시스템 과부하시 TIME_WAIT Socket 증가로 인한 local port 소진에 의해 신규 Connection을 생성 못할 수 있다.
위에 1024 65535로 변경하였지만, 해당포트 자체를 소모할 경우 문제발생할 경우도 있을 것입니다.
- tcp_rw_recycle=0 ## 기본값은 0 // TCP TIME_WAIT Socket Recycle 여부
기본값은 0인데, 1로 할경우 TIME-WAIT 상태의 소켓을 재사용할 수 있게 해준다. TIME-WAIT 문제를 피하기 위한 가장 확실한 방법이다. setsockopt()에 SO_REUSEADDR을 사용한 것과 같은 효과.
Packet Reordering이 발생하여 Timestamp 역전 현상이 발생하면, Client로 부터 수신한 SYN Packet이 Drop 된다.
현재 설정값 확인
# cat /proc/sys/net/ipv4/tcp_tw_recycle 0 # cat /proc/sys/net/ipv4/tcp_tw_reuse 0 |
설정변경
# echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse |