Skip to content

TPS 및 톰캣 & HikariCP 설정

김민종 edited this page Oct 24, 2024 · 20 revisions

측정 환경

  • 월 예산 초과로 인해 테스트 데이터베이스 환경을 운영 환경과 동일하게 구성하지 못했다.
    • 데이터베이스: db.m6gd.large(운영), t4g.micro(테스트)
  • 테스트 환경에서 최대한 성능 개선을 한 뒤, 그 결과를 운영에 적용하기로 결정했다.
  • 데이터베이스 테이블당 더미 데이터 70만~100만건 적재

TPS 목표

벤치마크 할 서비스 - 백준

  • 프로그래밍 관련 교육 서비스 중 보편적으로 많이 사용되는 알고리즘 서비스 백준 선택

TPS 목표

  • 백준 페이지 뷰 수를 초 단위로 나눈 값을 목표 TPS로 설정했다.
  • 페이지 뷰 수 / 86,400(초/일)
  • 19,080,000 / 86,400 = 220.69 TPS

테스트 유형

  1. 페어 프로그래밍에 직접적으로 도움을 주는 주요 API 단일 테스트
  2. 서비스 사용 흐름을 예측하는 시나리오 기반 API 다중 테스트

1. 단일 테스트

  • ‘코딩해듀오’ 서비스 사용자들이 페어 프로그래밍을 진행에 도움을 주는 몇가지 기능을 추려, 하나의 API건 별로 TPS 측정을 실시하고 특이사항을 관찰한다.

image.png

  • 가상 사용자 200백명을 대상으로 2분간 50명씩 늘려가며 총 8분동안 테스트

페어룸

페어룸 생성 TPS

시나리오: 각 사용자는 1초에 한번씩 [POST] /api/pair-room API를 호출한다.

image.png

  • TPS 추이

image.png

  • 성능 테스트 실행 결과 메트릭

시나리오 TPS

  • 16TPS

특이사항

  • DB 병목: HikariCP pending이 최대 168개까지 올라간다.
  • 0.17 %(즉, 07705 요청 중 13개 요청 실패)

페어룸 조회 TPS

시나리오: 각 사용자는 1초에 한번씩 [GET] /api/pair-room/{accessCode} API를 호출한다.

image.png

  • TPS 추이

image.png

  • 성능 테스트 실행 결과 메트릭

시나리오 TPS

  • 22.61TPS

페어룸 상태 변경 TPS

시나리오: 각 사용자는 1초에 한번씩 [PATCH] /api/pair-room/{accessCode}/status API를 호출한다.

image.png

  • TPS 추이

image.png

  • 성능 테스트 실행 결과 메트릭

시나리오 TPS

  • 25.80 TPS

특이사항

  • DB 병목: HikariCP pending이 최대 148개까지 올라간다.

투두

투두 생성 TPS

시나리오: 각 사용자는 1초에 한번씩 아래 API 호출

  1. [POST] /api/pair-room 방 생성
  2. [POST] /api/{accessCode}/todos 방에 TODO 리스트 생성

image.png

  • TPS 추이

image.png

  • 성능 테스트 실행 결과 메트릭

시나리오 TPS

  • 16.78

특이사항

  • DB 병목: HikariCP pending이 최대 179개까지 올라간다.
  • 페이룸 생성 타임아웃: 338개 발생

투두 조회 TPS

시나리오: 각 사용자는 1초에 한번씩 아래 API 호출

  1. [POST] /api/{accessCode}/todos 방에 TODO 리스트 생성
  2. [GET] /api/{accessCode}/todos TODO 리스트 조회

image.png

  • TPS 추이

image.png

  • 성능 테스트 실행 결과 메트릭

시나리오 TPS

  • 5.30

특이사항

  • JVM 쓰레드 live max312개
  • 저조한 TPS
  • 낮은 성공률

레퍼런스 링크

레퍼런스 링크 생성 TPS

시나리오: 각 사용자는 1초에 한번씩 [POST] /api/{accessCode}/reference-link API를 호출한다.

image.png

  • TPS 추이

image.png

  • 성능 테스트 실행 결과 메트릭

시나리오 TPS

  • 24.39 TPS

카테고리

카테고리 생성 TPS

각 사용자는 1초에 한번씩 [POST] /api/{accessCode}/category API를 호출한다.

image.png

  • 초당 요청 성공률

image.png

  • 성능 테스트 실행 결과 메트릭

시나리오 TPS

  • 22.04

단일 테스트 - 결과 분석

TPS

  • 최소: 5.3
  • 최대: 25.8
  • 평균: 18.9

문제 상황

  • 가상 사용자가 약 150명에 도달했을 때, hikariCP 고갈 문제 발생

결론

데이터베이스 병목 현상이 발생함을 확인하고, 시나리오 테스트를 통해 개선한다.


2. 시나리오 테스트

시나리오 명세

  1. 페어룸 생성
    1. SSE 커넥션 생성
    2. 투두 목록 조회
    3. 레퍼런스 링크 조회
    4. 타이머 정보 조회
  2. 타이머 시작
  3. 레퍼런스 링크 생성
  4. 투두 목록 생성 10회
  5. 카테고리 생성 3회
  6. 페어 역할 변경
    1. 페어룸 상태 변경
  7. 타이머 중지

테스트 환경

image.png

  • 0~4분: 50명 순차적으로 증가
  • 4~8분: 100명 순차적으로 증가
  • 8~12분: 150명 순차적으로 증가
  • 12~16분: 200명 순차적으로 증가

실험 목표

  • HikariCP max-pool 조정
  • 톰캣 threads max, max connections, accept count 설정 조정

HikariCP pool 개수 조정

1. Max Connection Pool 20개

image.png

  • TPS: 7.9
  • 특정 상황에서 connection이 반환되지 않아 요청이 pending 상태가 된다.
    • 150명 이상 접속 시 hikari connection 급격하게 증가

2. Max Connection Pool 10개

image.png

  • TPS: 10.8
  • 특정 상황에서 connection이 반환되지 않아 요청이 pending 상태가 된다.
    • 178명 이상 접속 시 hikari connection 급격하게 증가

Max Pool Size 별 수치 변화

image.png

image.png

  • 왼쪽부터 시간 순으로 max-connection-pool의 수는 10개, 20개, 5개이다.
  • 측정 결과 default 설정인 10개일 때 가장 TPS가 높았고, 20개와 5개일 때 비슷한 수치를 보였다.
  • 측정 결과 default 설정인 10개일 때 pending 상태인 커넥션 수가 가장 적었다.

결론: HikariCP maxPoolSize는 10개 일때 가장 효율이 좋음을 확인했다.


톰캣 설정 조정

데이터베이스 병목으로 인해 유미의한 측정이 불가능하여, 시나리오를 단순화하고 순간적인 대량 부하로 HTTP 요청 한계와 TPS를 측정한다.

테스트 환경

  • 0~1분: 100명
  • 1~2분: 200명
  • 1분~1분30초: 300명

1. max-thread

image.png

max-thread: 100

  • TPS:30.72
  • 성공률: 94.79

max-thread: 150

  • TPS: 29.35
  • 성공률: 98.25

max-thread: 200

  • TPS: 29.10
  • 성공률: 97.03

결론: TPS에서 유의미한 차이가 없지만, 성공률에서 max-thread 150개가 98.53으로 가장 안정적이다.

2. max-connection

image.png

image.png

max-connection: 4000

  • 성공률: 97.47
  • TPS : 27.98
  • GC stop the world: 13.4ms

max-connection: 6000

  • 성공률: 98.58
  • TPS: 27.8
  • GC stop the world: 16.6ms

max-connection: 8000

  • 성공률: 98.53
  • TPS:29.95
  • GC stop the world: 66.1ms

결론: Tomcat의 Max-connection 조정으로 인한 뚜렷한 TPS 수치 변화는 몇지만, 8192개에서 6000개로 하향 조정한 결과 GC stop the world 지속시간이 약 4배 개선되었다.

3. Accept count

accept-count: 100

image.png

accept-count: 200

image.png

결론: 약 2%대의 Request Timeout의 개선을 위해 Tomcat acceptCount를 상향 조정하였지만, 뚜렷한 변화를 관찰하지 못하였다.

결과

적용 값

  • HickariCP Max-pool-size: 10
  • Tomcat Max-Thread: 150
  • Tomcat Accept-Count: 100
  • Tomcat Max-connection: 6000

실험을 통해 예측한 예상 값과 함께 운영서버와 같은 환경(db.m6gd.large)의 데이터베이스를 사용하여 최종 TPS를 측정한다.

image.png

220.47TPS로 목표치와 근사한 결과를 확인했다.

Clone this wiki locally