서버 성능테스트, 클릭 한 번으로 끝내볼 수 있을까?
feat. 김덕수님(배민서비스개발팀)
세션이 도움이될 사람
- 현재 운영중이 서비스에 트래픽이 많고, 서버 성능테스트를 자주 하는 사람
- 운영중인 서비스에 점점 트래픽이 늘어나는 사람
- 대규모 트래픽을 안정적으로 처리하기 위해, 서비스 배포 전에 어떤 일을 해야 하는지 알고 싶은 사람
발표에서 전제하는점
1.서버환경
서버환경은 온프레미스가 아니라, 클라우드
환경인 것을 전제 함
2.모니터링 환경
웹 콘솔을 통해서, 모니터링
이 가능한 환경인 것을 전제로 함
서버 성능테스트 세션 내용
서버 성능테스트란, API 요청이 많은 상황에서 서버가 어떻게 동작하는지 확인
하기 위해 수행하는 테스트
서버 성능 테스트를 하는 이유?
- 서버가 얼마나 요청을 잘 처리하는지 측정하기 위해
- 요청을 잘 처리하지 못할 때, 어떤 지점이 병목이 되는지 확인하기 위해
서버 성능테스트, 보통 언제 할까?
- 트래픽 인입이 많을 것으로 예상되는 새로운 서비스를 오픈하는 경우
- 기존 서비스에 병목의 가능성이 있는 변경사항이 생기는 경우
- 평소보다 트래픽을 훨씬 많이 받아야 하는 경우
서버 성능테스트를 하려고 보니...
가상의 클라이언트를 생성하여, 부하를 일으키는 부분
은 이미 자동화가 많이 되어있음.
그럼에도 성능 테스트를 하려고 하면, 고된 부분이 존재한다.
무엇이 고될까?
- API서버 스케일아웃
- DB변경시 시간이 많이 걸리는 경우가 많음
- 테스트시마다, 지표를 관측하고 기록하는 일
어떻게 해결할까?
- 성능테스트 과정 도식화
- 성능테스트 시나리오 구상
- 테스트 환경 구축
- 성능테스트 생성 및 수행
- 테스트 결과 지표 관층 및 기록
- 테스트 결과 분석
성능테스트 시나리오 구상
- (input) 시스템의
어느 부분
에어떻게
부하를 줄 것인지 결정 - (output) 부하 상황에서 시스템의 동작 예측
- 필요한 데이터 준비
테스트 환경 구축
- 서버 수, 서버 스펙 결정
- scale up & scale out
성능테스트 생성 및 수행
- 구축한 성능테스트 시나리오에 따라 실제 부하 발생시킴
테스트 결과 지표 관측 및 기록
- 부하 상황에서 모니터링 보드 지표 관측 및 기록
테스트 결과 분석
- 요청을 잘 처리하는지 확인
- 시스템이 기대한 대로 동작하였는지 확인
여기서 우리가 자동화 해야하는(할 수 있는) 부분은 반복적인 작업 부분이다.
즉, 테스트 환경 구축
, 성능테스트 생성 및 수행
, 테스트 결과 지표 관측 및 기록
단계를 자동화 할 수 있다.
반복적인 작업을 자동화 했기 때문에, 개발자는 성능테스트 시나리오 구상
및 테스트 결과 분석
에 더 집중할 수 있게 된다.
어떤 기술을 사용할까?
Naver에서 개발한 성능 테스트 도구인 Ngrinder
와 Jenkins
, AWS
를 사용하였다.
Ngrinder
는 REST API를 지원하기 때문에, 자동으로 테스트를 생성 및 수행할 수 있다.
Jenkins
는 Groovy script 기반으로 설정하여 pipline을 구축할 수 있다.
AWS-CLI
는 sdk를 통해 cli로 AWS 인프라 구성 작업이 가능하다.
먼저 AWS-CLI
를 통해, API서버 인스턴스나 Replica DB를 scale-up 또는 scale-out 한다.
그 다음, Ngrinder
REST API를 통해 테스트를 생성 및 수행한다.
테스트 중에는 Ngrinder
의 성능테스트를 수행 시간을 Jenkins
가 측정한다.
테스트가 끝나면, Jenkins
는 테스트 결과를 Slack으로 알림을 보낸다.
그리고 마지막으로 AWS-CLI
로 테스트에 사용한 모든 자원들을 정리한다.
어떻게 구현할까?
테스트 수행에 관련된 부분을 기능단위로 쪼개서, 각각을 Jenkins Job으로 만들어서 조합하여 사용하였다.
그리고 Groovy script로 설정 및 파이프라인을 구축하였다.
아직 팀에서도 사용한지 3~4개월정도 밖에 안된 방식이라고 하지만, 이번 발표를 보며 배운것이 많았다.
개발자라면 역시 귀찮은건 자동화 라는것을 우아하게 보여주신 김덕수 님께 박수를 보냅니다.