OS/Linux

network connection 상태 확인 [TIME_WAIT]

아르비스 2016. 7. 11. 10:14

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


설정변경

# echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse