[TCP] TCP의 Keepalive 기능 및 튜닝

# TCP의 KeepAlive란?

TCP의 Keepalive 기능 및 튜닝

-> HTTP의 KeepAlive보다 더 Raw한 개념
-> TCP Level에서의 KeepAlive (3Way-HandShake로 인한 손실 줄이기 위함
-> 허나 쌓일경우 좀비 커넥션 발생 가능하기에, 관리가능하게 튜닝 필요

# 사용방안?

-> 연결간 어느 한쪽이 사용해도 Session 유지 가능
-> 기본적으로 setsockopt의 SO_KEEPALIVE관련 설정 필요


# 기본적으로 셋팅된 시간?

-> 아래 명령어로 확인 필요
$ sudo /sbin/sysctl -a | grep -i keepalive


[centos@ap-northeast-2.compute.internal external] (master) $ sudo /sbin/sysctl -a | grep -i keepalive

net.ipv4.tcp_keepalive_intvl = 75 (KeepAlive Idle 체크 주기)
-> 연결이 끊겼는지 확인 하는 주기 

net.ipv4.tcp_keepalive_probes = 9 (KeepAlive Idle 발생 이후 Probe 갯수)
-> 연결이 끊겼다면, Ping의 개념으로 보내는 패킷 횟수

net.ipv4.tcp_keepalive_time = 7200 (KeepAlive Probe를 보내는 주기)
-> 9개의 Ping을 보낼때, Ping과 Ping 사이 간격


# 테스트

$ netstat -napo로 주기적 체크 확인

1. Keepalive Mode로 서버 띄움
2. Client <-> Server간 통신
3. Client 강제 종료 시 동작 (IDLE 발생)
4. Server 측 Probe 보내서 체크
5. 설정된 Probe 다 보냈다면, 강제 종료

TCP의 Keepalive 기능 및 튜닝











































# TCP와 HTTP의 KeepAlive

= 예로 각각 60초 설정 되었다고 가정
- TCP KeepAlive(60 Sec) : KeepAlive 주기(60초 마다) Ping, 응답 있다면 연결 유지
- HTTP KeepAlive(60 Sec) : 60초 동안 유지, 요청 없으면 끊음

-> 아래 상황의 경우
HTTP Keepalive 30sec
TCP KeepAlive 60Sec * 1(Probe Cnt) * 1(Probe Interval)

HTTP가 먼저 반응 연결 종료 시킴
(무조건은 아니고 Probe Cnt * KeepAlive 주기 * Probe Interval에 따라 달라질수 있음)


# 튜닝시 고려사항

(Case1). Latency가 긴 경우, TCP Keepalive 동작 여부
= 1Sec Test, KeepAlive 못 받는 경우 없음

(Case2). 네트워크 부하 상황 (iperf3 사용)
= (네트워크 트래픽 사용률 99%) , 1Sec Test, KeepAlive 못 받는 경우 없음

(Case3). Latency가 길며, 네트워크 부하 상황 (iperf3 사용)
= (네트워크 트래픽 사용률 99%)
  • (Interval) 1~5 Sec
    = 70 ~ 80% 확률로 실패로 인한 확인 Probe 패킷 보냄, 1Probe Cnt, 1Probe Interval → 연결 유지
  • (Interval) 6~7 Sec
    = 60 ~ 70% 확률로 실패로 인한 확인 Probe 패킷 보냄, 1Probe Cnt, 1Probe Interval → 연결 유지
  • (Interval) 8~9 Sec
    = 20 ~ 30% 확률로 실패로 인한 확인 Probe 패킷 보냄
  • (Interval) 10 Sec 이후
    = 테스트 시, Probe 패킷 보내는 횟수 확인 되지 않음. 안정권으로 보임


저의 결론은
  • KeepAlive Interval → 10 Sec (Probe 패킷 실패하지 않는 Interval 기준)
  • KeepAlive Probe → 1개
  • KeepAlive Probe Interval → 1Sec

이었습니다.
모두 각 상황에 맞게 튜닝하시면 됩니다. 


# 튜닝 명령어

sysctl -a : 현재 설정된 값 출력

1. vi /etc/sysctl.conf (보통 sudo가 필요함) 로 열고 값 수정
2. sysctl -w $KERNELKEY=$VALUE (보통 sudo 필요함)


[centos@ap-northeast-2.compute.internal ~] $ sudo sysctl -w net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_keepalive_intvl = 10

[centos@ap-northeast-2.compute.internal ~] $ sudo sysctl -w net.ipv4.tcp_keepalive_probes=1

net.ipv4.tcp_keepalive_probes = 1

[centos@ap-northeast-2.compute.internal ~] $ sudo sysctl -w net.ipv4.tcp_keepalive_time=1

net.ipv4.tcp_keepalive_time = 1

[centos@ip-172-31-18-59.ap-northeast-2.compute.internal ~] $ sudo sysctl -a | grep keepalive
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes = 1

net.ipv4.tcp_keepalive_time = 1








댓글

이 블로그의 인기 게시물

윤석열 계엄령 선포! 방산주 대폭발? 관련주 투자 전략 완벽 분석

대통령 퇴진운동 관련주: 방송·통신·촛불수혜주 완벽 분석

키움 OPEN API MFC 개발 (1)