서버 성능테스트, 클릭 한 번으로 끝내볼 수 있을까?

서버 성능테스트란?

[상황] API 서버가 있고 외부의 DB와 외부 API 들을 사용한다. 이 API를 사용하는 클라이언트가 있다.

API 요청이 많ㅇ느 상황에서 서버가 어떻게 동작하는지 확인하기 위해 수행하는 테스트. 가상의 클라이언트를 많이 발생시켜서 서버에 부하를 발생하는 것이다.

서버 성능테스트, 보통 언제 할까?

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

서버 성능테스트를 하려고 보니…

가상 클라이언트는 이미 자동화가 많이 되어있다. 하지만 이는 아직도 고된 작업이다.

무엇이 고될까?

모니터링 보드가 필요하고, 부하 생성기는 이미 자동화가 많이 되어있다. 그런데 API 서버와 DB 외부 API를 연동하는 부분에 있어서 성능이나 구축의 어려움이 있다. 그리고 테스트 할 때마다 지표를 관측하고 기록하는 일이 고된 일이다.

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

어떻게 해결할까?

  • 성능테스트 시나리오 구상

  • 테스트 환경 구축 -> 성능테스트 생성 및 수행 -> 테스트 결과 지표 관측 및 기록 이 부분이 계속 반복된다. 하지만 실제로 개발자가 시간을 쏟고 집중해야 하는 부분은 처음과 마지막 부분이다. 그리고 자동화가 어려운 부분이다. 따라서 반복되는 이 부분을 자동화 하는것이 바람직하다.

  • 테스트 결과 분석

어떤 기술을 사용할까?

젠킨스 서버를 따로 띄우고 파이프라인을 구축해둔다.

핵심은?

핵심은 Build Now 버튼 하나로 테스르 반복과정을 자동화 할 수 있고, 그 결과를 슬랙 메시지로 받아볼 수 있다는 것이다.

어떻게 구현할까?

구현 요구사항

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

-> 각각의 실행 가능한 작은 단위의 Jenkins Job으로 나누어 구상한다.

테스트 환경 구축 Job -> AWS CLI와 shell script 구현 성능테스트 수행 & 지표 기록 Job -> Ngrinder REST API와 shell script로 구현

자동화를 통해 얻을 수 있는 이점들

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

보통 성능테스트를 진행하면 자원을 일일이 조절하지 않는데 자동화를 통해 쉽게 조절 가능하다.

성능테스트 자동화, 어떤 시스템에 유용할까?

  • 트래픽이 많고, 서버 성능 측정을 해야할 일이 잦은 경우
    • 이벤트 시스템과 같이 새로운 기획이 잦고, 일회성으로 많은 트래픽을 받아야 하는 경우
    • 저장소 변경이 비교적 잦은 경우
    • 피크타임과 그렇지 않은 시간대 사이에 트래픽 변동이 커서 scale out & scale in 이 자주 일어나는 경우

반드시 할 필요는 없으며, 오히려 테스트 환경 구축 비용이 비싼 경우도 있겠지만, 위와 같은 조건에서는 괜찮은 결과를 낼 수 있다.