Portfolio

API 서버 인프라 부하 테스트 및 최적화

date
Jan 15, 2024
slug
api-서버-인프라-부하-테스트-및-최적화
author
status
Public
tags
Elastic APM
Performance Test
JMeter
summary
type
Post
thumbnail
Untitled (3).png
updatedAt
Jan 15, 2024 01:46 PM
categories
Portfolio
Language
English
Korean

진행한 집단

디어코퍼레이션

누구와 함께 만들었는가?

본인 외 1명 (전체 부하 테스트 프로젝트 참여 인원은 본인 외 3명)

진행한 이유

사업이 성장함에 따라, 서비스를 이용하는 유저의 수도 기하급수적으로 증가했습니다. API 서버는 수평적 확장을 위한 인프라가 갖춰져 있었지만, 기하급수적으로 부하가 증가해 잠재적으로 문제를 야기할 수 있는 API를 찾고 인프라 비용을 최적화 하기 위해 진행했습니다.

진행 과정

  • 1단계, 현 상태의 부하 확인하기
먼저, 현 상태의 부하가 어느정도인지 확인하기 위해, Elastic APM 을 이용하여 부하 상위 10개의 API를 추렸습니다.
해당 API들을 분석해본 결과 DB와 서버에 n^2에서 n^3 정도의 부하를 줄 수 있는 API들을 찾아냈습니다. 이러한 API들은 서버의 성장에 따라 산술급수가 아닌 기하급수적으로 부하를 만들어낼 수 있기에 잠재적으로 인프라를 붕괴시킬 가능성을 파악했습니다.
Elastic APM의 결과창
Elastic APM의 결과창
  • 2단계, 가상의 서버 환경 구축
당시 API서버, 데이터베이스와 동일한 가상의 서버, 데이터베이스를 만들고, 더미 데이터를 집어넣었습니다. 그리고 매 테스트마다 데이터를 당시 규모의 2배, 4배, 8배, 10배 등으로 Scale Up 하였습니다.
더미 데이터를 생성하기 위한 테스트 시나리오 및 생성 결과
더미 데이터를 생성하기 위한 테스트 시나리오 및 생성 결과
  • 3단계, 부하 가하기 - Artillery
처음에는 nodejs의 Artillery를 이용하여 개발에 사용하는 개인 노트북을 통해 부하를 가했습니다.
그러나 가상 서버에 설치된 Elastic APM을 이용하여 확인해본 결과 스크립트에 적힌 대로 부하가 가해지지 않았음을 확인했습니다. 로컬 노트북 환경에서 만들어낼 수 있는 부하에는 한계가 있었기 때문입니다.
  • 4단계, 부하 가하기 - JMeter, Master-Slave
동시 접속자 수 만 ~ 수 십만의 요청을 모방하기 위해서는 부하를 가하는 부분의 인프라를 강화하는 것이 필요했습니다. 따라서 총 5개의 EC2 서버 (Master 1개, Slave 4개)를 이용해 가상 서버에 부하를 가했습니다.
  1. 로컬 노트북에서 JMeter를 이용하여 부하 스크립트를 작성하였습니다.
  1. SCP를 이용하여 Master 서버로 부하 스크립트를 보냈습니다.
  1. Master 서버와 Slave 서버를 연결하였습니다.
  1. Master 서버로 공격 명령을 보냈습니다.
  1. Master 서버는 각 Slave 서버에 공격 명령을 전달하여 유의미한 부하를 만들어냈습니다.
당시 만들었던 프로젝트 성과 발표자료
당시 만들었던 프로젝트 성과 발표자료
  • 5단계, 부하 및 최적화 프로세스 반복
다음과 같은 과정을 반복하여 API 최적화를 진행 했습니다.
  1. APM을 이용하여 부하 상위 API를 추리기
  1. 가상의 서버/데이터 환경으로 모방
  1. JMeter를 이용해 부하 테스트
  1. API 최적화 (로직 개선 및 DB 저장 방식, 스키마 개선)
  1. JMeter로 다시 부하 테스트 및 최적화 성공 여부 확인
  1. 1로 돌아가기
notion image
를 반복하며 기하급수적으로 부하가 증가하는 API가 없어질 때까지 반복했습니다.