배민이 어떻게 서버 성능테스트를 자동화하는지 슬쩍 엿보았다.

2 minute read

우아콘2021 첫째날, 서버 성능테스트, 클릭 한 번으로 끝내볼 수 있을까? 영상을 보고 공부하기위해 정리한 글 입니다.


누구를 위한 내용인가

  • 현재 운영중인 서비스에 트래픽이 많고, 서버 성능테스트를 자주 한다.
    • 이벤트 시스템과 같이 새로운 기획이 잦고, 일회성으로 많은 트래픽을 받아야 하는 경우
    • 피크타임과 그렇지 않은 시간대에 트래픽 변동이 커서 scale 변경이 자주 일어나는 경우
    • 저장소 변경이 비교적 잦은 경우
  • 운영중인 서비스에 트래픽이 점점 늘어나고 있다.
  • 대규모의 트래픽을 안정적으로 처리하기 위해 서비스 배포 전에 어떤 일을 해야하는지 알고 싶다.

전제가 되는 서버환경

  • AWS 클라우드 환경
    • on-promise (X)
  • CLI를 통해 서버자원 조작 가능
  • 시각적인 모니터링 수단 존재

온프레미스(on-premise)는 소프트웨어 등 솔루션을 클라우드 같이 원격 환경이 아닌 자체적으로 보유한 전산실 서버에 직접 설치해 운영하는 방식을 말한다. 출처-해시넷


211221125552.png

서버 성능테스트란?

  • 성능테스트, 스트레스 테스트, 부하테스트
  • 가상의 클라이언트(Virtual Client)를 만들고 API 요청이 많은 상황을 가정하여(부하 발생) 서버가 어떻게 동작하는지 확인하기 위해 수행하는 테스트
    • 서버가 요청을 얼마나 잘 처리하는가?
    • 병목이 되는 지점은 어디인가?

언제 할까?

  • 트래픽 인입이 많을 것으로 예상되는 새로운 서비스를 오픈하는 경우
  • 기존 서비스에 병목의 가능성이 있는 변경사항이 생기는 경우
  • 평소보다 트래픽을 훨씬 많이 받아야 하는 경우

가상 클라이언트 부분은 자동화가 많이 되어 있다. 그럼에도

고된 부분은,

  1. API 서버를 스케일조절 등 재구축 하는 변경 과정 (신경써야할 설정들과 DB 변경 대기시간)
  2. 모니터링 보드에서 테스트를 할 때마다 지표를 관측하고 기록하는 일

211221125924.png

서버 성능테스트 자동화

클릭 한 번으로 환경도 구축해주고 성능테스트도 돌려주고 결과 지표도 기록해주면 얼마나 좋을까?

성능 테스트 과정 분석

211221130444.png

개발자가 시간을 쏟고 집중해야하는 부분 (자동화가 어려운 부분)

  • 성능테스트 시나리오 구상
    • 시스템의 어느 부분에 어떻게 부하를 줄 것인지 (input)
    • 부하 상황에서 시스템의 동작 예측 (output)
    • 필요한 데이터 준비
  • 테스트 결과 분석

반복되는 파이프라인 구조로 자동화 가능하며 자동화 해야하는 부분

  • 테스트 환경 구축
    • scale up/out
  • 성능테스트 생성 및 수행
  • 테스트 결과 지표 관측 및 기록

사용 기술

  • nGrinder : REST API 지원
    • 네이버에서 개발한 오픈소스 스트레스 테스트 도구 github
  • AWS CLI : CLI 환경에서 인프라 제어
  • Jenkins : Groovy script로 pipeline 구축
  • Java로 제작된 오픈소스 CI/CD 툴

동작 과정

211221134815.png 211221134842.png 211221134300.png 211221134313.png 211221134325.png

  • 테스트 환경 구축
    • Jenkins 서버 준비
    • Ngrinder agent를 준비
    • 자동으로 ASG에서 인스턴스를 추가하고 Replica node를 늘리도록 파이프라인을 실행
    • 헬스 체크
  • 신규 테스트 생성 및 수행
    • Ngrinder에 REST API를 통해서 신규 테스트를 생성하고 수행하도록 요청
    • Ngrinder agent에서 실제 API 요청을 생성해서 API 서버에 부하 발생
  • 테스트 모니터링 및 결과 기록
    • Jenkins는 성능테스트가 진행되는 동안 테스트 진행 시간 측정
    • Jenkins에서 테스트 결과 레포트 만들어서 슬랙에 전달
  • 자원 정리

구현

구현 요구사항

  • 사용하는 인프라나 성능테스트 시나리오가 달라지더라도 파이프라인을 쉽게 수정하고 재사용할 수 있어야 한다.
  • 최소한의 코드 작성으로 자유롭게 파이프라인을 구성할 수 있어야 한다.

구현 상세

  1. 각각의 실행 가능한 최소 단위의 Jenkins Job으로 나누어 구성
  2. Jenkins groovy 스크립트에서 환경변수를 설정하고, 구축해놓은 Job 들에 변수를 넘겨서 Job이 순서대로 실행되도록 파이프라인을 조립할 수 있다.

211221141510.png

211221141713.png

결과

한 번의 클릭으로 위 모든 테스트과정을 수행하고 Slack 메세지를 통해 결과를 모아볼 수 있다.

211221134617.png

자동화로 얻을 수 있는 이점

  • 실수 없이 같은 성능테스트를 여러 번 재현 가능
  • 옆에서 항상 기록하면서 지켜봐야하는 사람이 필요 없음
  • 불필요한 자원 낭비를 줄일 수 있음

정리를 하면서

  • 발표내용 구성에 아래 과정이 반복되어,
    • 어떤 부분을 왜 고민했는지
    • 도출해낸 문제가 무엇인지
    • 어떻게 해결했는지
  • 내용과 필요성을 이해하고 흐름을 따라가기 좋았다.

Reference

  • https://www.youtube.com/watch?v=Ovcy02QFt9c&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech