본문 바로가기
Operating System

[Linux] TCP KeepAlive에 대한 고찰

by 기린2 2021. 12. 13.

지난 7월 XXXX 이벤트 때 저희 운영 Web 서버에서 연결 오류가 발생했습니다.

Webtob / JEUS로 사용을 하는 서버였기 때문에 TMAX 엔지니어의 점검 후, 권고에 따라 OS Kernel의 TCP KeepAlive 설정 변경을 진행했습니다.

이와 관련해, Linux OS Kernel에는 TCP KeepAlive와 관련한 어떤 parameter가 있고 Web에서 설정하는 KeepAlive와는 어떤 차이점이 있는지 적어보았습니다.

 

1. KeepAlive를 왜 쓰지?

먼저 keepalive 기능에 대한 사용 목적입니다.

네트워크 통신에서 가장 기본이 되는 것은 TCP 3way-handshake 연결 방식입니다.

TCP 3way-handshake

위 그림과 같이 Syn > Syn+Ack > Ack 과정을 통해 Client/Server 양쪽에서는 서로 데이터 전송할 준비가 되었다는 것을 인지하고 세션을 맺게 됩니다.

그렇기 때문에 우리는 TCP 통신을 신뢰성 있는 연결이라고 하며 패킷 유실 방지 측면에서는 분명 효과적입니다.

하지만, 해당 과정이 매우 빈번하게 일어난다면?

매번 Client/Server간 네트워크 통신 때마다 TCP 세션을 생성하고 관리하며, 자원 할당 등으로 인해 결국 어플리케이션 성능 저하를 유발할 수 있습니다.

Keepalive 설정은 이런 불필요한 TCP 연결 과정을 줄이고 일정 시간 동안 TCP 세션을 유지하기 위해 사용합니다.

 

2. (OS Kernel) KeepAlive

Linux OS 기준으로 TCP Keepalive 관련 Kernel Parameter 3가지가 있습니다.

 ① net.ipv4.tcp_keepalive_time : TCP 세션에 대해 keepalive를 유지하는 시간 (기본 7200)

 ② net.ipv4.tcp_keepalive_probes : Keepalive가 끊어졌다고 판단한 후 세션을 정리하는 동안 보낼 ping-pong 패킷의 수 (기본 9)

 ③ net.ipv4.tcp_keepalive_intvl : 첫 번째 체크 이후, ping-pong 패킷의 주기 (기본 75)

 

OS Keepalive 설정 상태에서는 TCP 세션이 7200초 동안 통신을 하지 않게 되면, 서로 살아있는지 체크하는 ping-pong 패킷을 주고 받아 계속 연결을 유지하게 됩니다.

만약 상대방으로부터 Ack을 받지 못하면 75초의 간격으로 최대 9 ping-pong 패킷을 보내고 세션을 정리하게 됩니다.

 

3. (Web Application) KeepAlive

Web Application에서의 Keepalive 설정은 OS Kernel 설정과는 별개로 ping-pong 패킷을 통해 상대가 살아있는지 확인하지 않으며,

단순 Web Application config에서 설정한 시간이 경과하면 세션을 정리합니다.

사진1                                                                                    사진2                

위의 사진은 NginX Web Application의 설정입니다.

1) 사진1 처럼 keepalive_timeout으로 설정된 20초 동안 서로 간의 통신이 없다면 Web Application에서는 Client와 연결을 끊으며,

이후 Client에서 추가 요청이 발생하면 Server(Web Applicaion) 3way-handshake 과정을 통해 다시 세션을 맺어야 합니다

2) 물론 사진2 처럼 Web Application에서도 OS Kernel TCP keepalive 기능을 사용할 수 있습니다.

 Webtob의 경우는 OS Kernel KeepAlive 사용이 기본 설정(default)이며, 특별한 경우가 아니면 대부분 기본 설정을 사용하고 있다고 합니다.

 

4. 정리

OS Kernel Web Application KeepAlive 설정은 모두 TCP 세션을 유지/관리하기 위한 목적이지만 큰 차이점이 있습니다.

1) 첫 번째는 OS Kernel 방식의 경우 keepAlive에 대한 유지/관리를 OS Kernel이 직접하고, Web Application 방식은 config timeout 설정 값에 따라 결정된 다는 것입니다.

2) 두 번째는 OS Kernel 방식의 경우 TCP Parameter에 의한 ping-pong 패킷을 주고 받으면 계속해서 세션을 유지하지만, Web Application 방식은 config 설정 시간이 지나면 Client와 연결을 능동적으로 끊는다는 점입니다.

따라서, 동일한 KeepAlive 기능이라도 OS Kernel Web Application 에서 동작 방식은 상이하며 상호 비슷해 보이지만 실제 연관성은 없습니다

 Web Application Keepalive 기능을 설정하면, OS Kernel에서 TCP KeepAlive Parameter 설정을 변경하더라도 영향을 받지 않는다는 의미

 

“중요한 것은 내가 사용중인 WEB에서 OS Kernel을 통해 TCP KeepAlive를 관리하는지, 아니면 Web Application 설정을 통해 KeepAlive를 관리하는지, timeout 값을 얼마로 사용 중인지를 먼저 정확하게 파악하는 것입니다”

 

해당 내용에 대해 궁금한 사항이나 오류 발견 시 댓글달아주세요!

 

참고1 : “DevOps와 SE를 위한 리눅스 커널 이야기”

참고2 : https://brunch.co.kr/@alden#articles

'Operating System' 카테고리의 다른 글

Max user processes & Open files  (0) 2022.10.18
[Kubernetes] Container Runtime  (0) 2022.01.26
[Linux] 메모리 재할당  (0) 2022.01.10