현재 진행하고 있는 뉴스피드 프로젝트의 기능들을 얼추 마무리하고 나서,
문득 내가 구현한 한 api에 대한 성능을 평가해보고 확장성을 검증해보기 위해 부하 테스트를 진행해 보기로 했다.
개발을 진행하다 어, 이런 상황도 있을 수 있겠구나? 내가 구현한 방향이 이런 상황을 버틸 수 있을까? 라는 의문이 들었기 때문인데 .. 의문에 대한 자세한 상황은 추후 포스팅에서 명시하도록 하고, 일단 기본적인 아틸러리 설치와 테스트 파일 생성에 대해 먼저 포스팅한다!
툴은 Artillery로 선정하고 진행해보았다.
Artillery 란?
먼저, 아틸러리에 대해 간단히 알아보자.
Artillery는 간편하게 사용할 수 있는 기능과 유연성을 제공하여 개발자가 애플리케이션을 효과적으로 테스트할 수 있는 오픈 소스 라이브러리이다. 공식 홈페이지에서 아래와 같은 특징들을 살펴볼 수 있다.
- HTTP, Socket.io, Websocket, gRPC 등 다양한 프로토콜 지원
- 클라우드 규모에서의 테스트 가능 (AWS Lambda 서버리스 로드 테스트)
- HTML, JSON 등 가독성이 좋은 처리량 및 통계 제공
- 시나리오 단위로 테스트 가능
Artillery 선정 이유
1. 좀 덜 정교하더라도, 가볍고 편하게 쓸 수 있는 스트레스 테스트 도구가 필요했다.
사실 필자가 주로 사용하는 언어는 java이므로 JMeter도 고려했으나, 아틸러리가 node.js 기반이더라도 가볍고 타 툴들보다 기능들이 편하다고 여겼다. 커맨드라인으로 간단한 테스트가 가능한 동시에, json이나 yaml로 시나리오를 자세하게 작성할 수 있기 때문이었다.
2. 프로젝트 마감이 3일 남았다 보니 참고할 자료가 많다는 점도 이점이었다.
상단에 작성한 1번 이유 + 참고 자료가 많아서 빠른 기간 내 테스트를 마무리할 수 있을 것 같았다.
또한 부하테스트를 하기 위해 공부하는 시간보다는 부하를 준 후에 내 쿼리의 문제점을 해결하는 데 시간을 더 쓰고 싶었다. 이에 부하테스트에 약 2~3일을 배정했고, 목표 시나리오와 tps를 테스트 하기에 너무 상세하거나 복잡한 기능은 필요하지 않다고 여겼기에 코드나 설정 파일로 간단히 실행 가능한 아틸러리를 선택했다.
Artillery 설치
아틸러리를 설치하려면 먼저 node.js를 설치해야 한다. node.js는 아틸러리를 실행하는 데 필요한 JavaScript 런타임이다.
node.js 설치는 하단의 포스팅을 참고했다. (필자의 운영체제는 윈도우이다)https://kitty-geno.tistory.com/61
Artillery 실행
그 다음부터는 쉽다!
- Command Prompt 열기:
명령 프롬프트(또는 PowerShell)를 사용하여 Artillery를 설치할 수 있다. 시작 메뉴에서 "cmd"를 검색하여 명령 프롬프트를 열거나 "Windows + R" 키를 눌러 "cmd"를 입력하여 명령 프롬프트를 열자. - npm을 사용하여 Artillery 설치:
명령 프롬프트에서 다음 명령어를 실행하여 Artillery를 전역으로 설치하자:
이 명령은 npm(Node Package Manager)을 사용하여 Artillery를 설치하고 -g 플래그를 사용하여 전역으로 설치하라는 명령어이다. 이렇게 하면 어느 위치에서나 Artillery를 실행할 수 있다.
npm install -g artillery
- 설치 확인:
Artillery가 제대로 설치되었는지 확인할 수 있는 명령어가 있다. 이 명령을 실행하면 설치된 Artillery의 버전이 표시된다.
artillery --version
* 참고
공룡을 보여주는 이스터에그도 있다 🦖
테스트 파일로 테스트 진행해보기
1. 테스트 파일 작성
설치가 다 됐다면 기본적인 테스트 파일을 작성해보자. 테스트 파일은 json과 yaml 파일로 만들 수 있다.
필자는 진행하고 있던 프로젝트 루트 파일에 yaml 파일로 만들어주었다.
2. 테스트 파일 실행
artillery run --output report.json C:\파일 경로\test-config.yml
- --output report.json : report.json 이라는 곳에 테스트 결과를 출력해주는 옵션이다. 본인이 작성해 둔 test 파일의 주소를 명시해 주면 되겠다.
3. (필수 아님, 참고) report.json을 html로 보기 위한 명령어
artillery report report.json --output report.html
html로 볼 때의 UI는 이 포스트 말미에 작성해 두겠다.
테스트를 실행하면, 아래와 같은 테스트 지표가 출력된다.
단일 요청 시 response_time.median 응답 평균 소요 시간이 7.9ms 인 것을 확인할 수 있다.
[용어 설명]
- http.codes.200 : 상태 코드가 200(OK) 인 HTTP 응답 수
- http.request_rate : 초당 HTTP 요청 수
- http.requests : 총 HTTP 요청 수
- http.response_time : 최소, 최대, 중앙값, 95번째 백분위수 및 99번째 백분위수 응답 시간을 포함한 HTTP 요청의 응답 시간에 대한 통계
- http.responses : 수신된 총 HTTP 응답 수
- vusers.completed : 테스트를 완료한 총 가상 사용자 수
- vusers:created : 테스트 중에 생성된 총 가상 사용자 수
- vusers.created_by_name : test-config.yml 파일에 정의된 각 시나리오에 대해 생성된 가상 사용자 수
- vusers.failed : 테스트 중 실패한 총 가상 사용자 수
- vusers.session_length : 최소, 최대, 중앙값, 95번째 백분위 수 및 99번째 백분위 수 세션 길이를 포함하여 가상 사용자의 세션 길이에 대한 통계
이 중 지표로 가장 많이 사용되는 필드는 response_time의 median 값과 95 백분위 수 값인 p95라고 한다.
report.json을 html로 보는 명령어를 실행하면, report.html이 생성되고 즉시 확인할 수 있다.
테스트 결과를 간편하게 그래프 UI로 확인할 수 있다.
http_response.median 중앙값과 http_response.p95 백분위 95 값에 큰 격차가 없어야 성능이 좋다고 볼 수 있다.
그러니 그래프를 통해 좀 더 쉽게 격차를 비교해 볼 수도 있을 것 같다.
마치며
이렇게 부하 테스트를 위해 필요한 툴과 설치, 설치 확인, 실행 그리고 테스트 파일 생성과 실행 확인까지 마쳤다. 확실히 설치부터 테스트 파일 실행까지 간단하고 쉽다고 느꼈다.
이제 본격적으로, 다음 포스팅에서는 테스트 파일을 필자가 원하는 상황 대로 변형한 후, api에 부하 테스트를 한 다음 성능 개선까지 해보는 과정을 포스팅으로 옮겨볼까 한다.
<다음 글>
'Project > Newsfeed' 카테고리의 다른 글
[성능 테스트][트러블슈팅] Artillery로 부하 테스트 하기(3/3), 성능 개선을 해보자 (0) | 2024.04.15 |
---|---|
[성능 테스트][트러블 슈팅] Artillery로 부하 테스트 하기(2/3), 성능 저하 원인을 찾아보자 (1) | 2024.04.13 |
[프로젝트] 스택오버플로우 에러 해결 (부제: 드디어 내게도 말로만 듣던 이 에러가) (3) | 2024.04.13 |
[프로젝트] AOP로 'API 수행 시간/회원 별 총 API 사용시간 누적 저장' 기능 다르게 구현하기와 그에 따른 고민 (0) | 2024.04.10 |
[프로젝트] QueryDSL 사용 시 Q클래스 import 불가 문제 해결 (gradle) (0) | 2024.03.02 |