애플리케이션 성능을 테스트하기 위해 Artillery 를 사용해보자.
Artillery 란?
개발자를 위한 강력한 클라우드 기반 부하 테스트 도구이다. 이 도구는 복잡한 시스템에 대한 부하 테스트와 성능 모니터링을 간단하고 접근하기 쉽게 만들어 사용자 경험과 시스템 성능을 최적화하는 데 도움을 준다. AWS 와 같은 클라우드 서비스에서 직접 테스트를 실행하여 실시간으로 피드백을 받을 수도 있다.
Artillery 설치하기
1. node.js 설치 ( 공식문서 )
2. artillery 설치 ( 공식문서 )
> npm install -g artillery@latest
- 설치 확인
> artillery version
성능 테스트 with Artillery
먼저 간단한 테스트 스크립트를 작성하여 성능 테스트 결과를 확인해보자.
그 전에 테스트할 API 가 필요한데 기존 프로젝트에 저장되어있는 회원들의 닉네임을 모두 조회하는 API 로 테스트를 해 볼 생각이다.
1. 타깃 설정
public class UserController {
..
/** 정의되어있는 모든 닉네임 조회 **/
@GetMapping("/nicknames")
public ResponseEntity<?> getNicknames() {
List<String> nicknames = userServiceImpl.getNicknames();
return ResponseEntity.ok().body(nicknames);
}
}
2. 테스트 스크립트 작성
test-config.yaml 파일을 프로젝트 내 가장 상위 폴더에 생성한다.
config:
target: 'http://localhost:8080'
phases: # 100 초 동안 초당 3번의 요청에서 시작하여 초당 요청 수를 30까지 증가
- duration: 100
arrivalRate: 3
rampTo: 30
scenarios:
- name: "Get nicknames"
flow:
- get:
url: "/nicknames"
- config.target : 부하 테스트의 대상이 되는 기본 URL
- phases : 여러개로 구성이 가능하며, 각 phases 는 테스트의 특정시간 동안 특정 부하 수준을 의미.
- phases.duration : 지속 시간을 초 단위로 나타냄.
- phases.arrivalRate : 초당 새로운 가상 사용자가 시스템에 도착하는 비율.
- phases.rampTo : phases 가 끝날 때까지 도달해야 하는 목표 도착률.
- scenarios : 실제로 가상 사용자가 수행할 작업의 시퀀스를 정의.
- scenarios.name : 시나리오의 이름 정의.
- scenarios.flow : 가상 사용자가 수행할 작업의 시퀀스 정의.
3. 테스트 실행
프로젝트 내 가장 상위 폴더에서 아래의 명령어를 실행한다.
> artillery run --output report.json test-config.yaml
정상적으로 테스트가 수행되었다면 같은 위치에 report.json 파일이 생성되어있음을 확인할 수 있다. 이를 보기 편한 html 로 변경하기 위해 아래 명령어를 실행한다.
> artillery report report.json --output report.html
# Report generated: report.html
그럼 프로젝트 내 report.html 을 확인할 수 있다.
테스트 결과 분석하기
report.html 을 열어서 보게되면 리포트로 분석 결과가 잘 나와있음을 확인할 수 있는데 이를 쪼개서 정리해보자.
먼저 가장 상단에 있는 Summary, Scenario counts, Codes, Errors, Charts 이다.
1. Summary
- 테스트 기간과 생성 및 완료된 요청/응답 수 등의 전체 테스트 통계를 보여준다.
2. Scenario Counts
- 테스트된 다양한 시나리오의 수를 표현하며 name 을 따로 설정하지 않으면 name 부분이 0 부터 시작한다.
- 각 테스트 케이스가 몇 번 실행되었는지 이해하는 데 유용하다.
3. Codes
- 테스트 중 받은 HTTP 응답 코드를 여기에서 확인할 수 있다.
4. Errors
- 테스트 중 발생한 모든 오류를 나열한다.
- 체크 표시는 네트워크 오류가 발생하지 않았음을 뜻한다.
5. Charts
- Latency 분포와 같은 테스트 결과를 차트로 보여준다.
- Charts 내 지표 중 P95 는 모든 요청 중 95% 가 주어진 시간 내에 완료됨을 말한다.
- Charts 내 지표 중 P99 는 모든 요청 중 99% 가 주어진 시간 내에 완료됨을 말한다.
이 이후로는 특이 사항이 없다면 5개의 차트를 추가적으로 확인할 수 있다.
1. Latency At Intervals
- 시간 간격에 따른 지연 시간을 보여준다.
- 지표로는 min, p50, p95, max 가 있다.
2. Concurrent users
- 테스트 기간 동안의 동시 사용자 수를 시간별로 보여준다.
- CPU 연산 혹은 메모리가 많이 쓰이는 작업일수록 처리 속도가 느려지기 때문에 동시 사용자 수가 높아진다.
3. Mean RPS
- 평균 초당 요청 수를 시간에 따라 보여준다.
- 시스템이 얼마나 많은 트래픽을 처리할 수 있는 지 알 수 있다.
4. RPS Count
- 특정 시간 간격 동안 초당 요청 수를 나타낸다.
5. HTTP codes
- 발생한 HTTP 응답 코드가 시간에 따라 얼마나 발생했는 지를 보여준다.
- 서버의 응답 상태와 오류를 식별하는 데 유용하다.
정리
배포한 상태의 사이드 프로젝트를 대상으로 부하테스를 해보고싶었지만 비용을 나눠 부담해야하기 때문에 우선 로컬에서 진행하였다. 이전에 locust 로 부하 테스트를 진행한 적이 있는데 Artillery 는 yaml 파일 하나만 작성하면 되어 좀 더 편안하다고 느꼈다. 개인 토이프로젝트를 진행하며 가설을 잘 세워 테스트 해봐야겠다.
참고
'Tools' 카테고리의 다른 글
[SonarQube] SonarQube 로 정적 분석하기 (0) | 2024.01.21 |
---|---|
[Git] merge 와 rebase (0) | 2023.11.12 |