1. 개요

본 문서는 Keepalive에 대한 정리이다.


2. Keepalive

2-1. Keepalive

  • HTTP/1.1부터 지원하는 기능으로 TCP 연결을 재사용하는 기능이다. 즉, Handshake 과정이 생략되므로 성능 향상을 기대할 수 있다.
  • 단, 모든 TCP 세션을 무한정 유지할 수는 없으므로 Timeout 및 Max 설정을 통해 관리되어야 한다. 
  • keepAliveTimeout : 요청에 대한 응답을 보낸 후 Timeout을 위한 timer가 동작하기 시작한다.
  • 최근에는 N/W 환경이 개선되면서 keepAliveTimeout이 점점 줄어드는 추세이다.
  • Event-driven 구조여서 non-blocking을 사용하는 Nginx 등은 Keepalive를 하면서도 Thread를 점유하지 않기 때문에 동시 처리에 유리하다.

2-2. ThreadPool과 Keepalive

  • 웹 서버만 놓고 볼 때, 웹 서버 역시 ThreadPool을 사용하는 방식으로 설정할 수 있다.
  • 이때 ThreadPool은 사용자 수와 관련이 있는데, 동시 사용자가 500명이라면 최소한 500개 이상으로 ThreadPool을 설정해야 한다.
  • 하나의 웹 페이지 호출 시 사용자는 동시에 여러 Connection을 생성할 수 있다. 만약 특정 웹 페이지 하나를 구성하는데 많은 자원이 필요하다면 Thread Pool은 그에 비례하여 증가시켜야 한다.
  • 이때 Keepalive까지 적용되어 있다면 idle thread까지 고려하여 ThreadPool 설정을 해야 한다.

2-3. 동시 사용자 계산과 Keepalive

  • 초당 50TPS 시스템 기준
  • 사용자 요청 간격 10초
  • 동시 사용자는 500명 (500TPS X 10초)
  • 한 화면 당 3개 Connection 사용하고 keepAlive가 요청 간격과 동일한 10초라면 총 Connection 수는 1,000개 (50TPS X 10초 X 2개)

3. Keepalive 활용

3-1. 데드 피어 식별

3-2. Disconnection 방지