이번엔 Artilery로 성능 테스트를 하는 법과 어떻게 봐야하는지에 대한 글 남겨보겠습니다!
성능 테스트는 사용자가 많아졌을 때를 가정한 연습을 해볼 수 있는 수단입니다.
사용자가 많아지면, 서버 요청이 많아지고, 이건 서버의 부하를 빠르게 증가시킵니다. 이때 필요에 따라 서버를 늘릴 것입니다. 그런데 사용자들이 발생시키는 트래픽을 감당하기 위해서 얼마나 많은 서버가 있어야 할 지 가늠하기 어렵습니다. 무턱대고 서버를 필요 이상으로 늘리는 것은 비용을 증가시키는 일이니 이런 상황에 대한 연습이 필요합니다.
성능 테스트를 하기 전 알아야할 키워드가 있습니다.
네트워크를 통해 흐르는 데이터입니다. 즉 많은 데이터가 흐르면 트래픽이 많다고 합니다.
요청 한건 한건의 처리 시간입니다.
클라이언트가 요청을 보낸 후 응답을 받기까지 걸린 시간이라고 생각하면 됩니다. 주로 ms, s단위입니다.
서비스나 기능에 따라 사용자가 기대하는 지연 시간은 달라질 수 있으며, 목표 지연 시간 역시 사용자들이 기대하는 지연 시간에 맞춰줘야 합니다.
ex) 항공권 검색 기능이 지연 시간이 수십 초가 되어도 우리는 느릴 것을 이미 감안하고 검색하기 때문에 큰 문제가 되지 않는다.
단위 시간 동안 얼마나 많은 요청을 처리할 수 있는지입니다.
주로 tps 단위입니다.
지연시간 vs 처리량
지연시간은 한 건 한 건 얼마의 시간동안 처리할 수 있는지, 처리량은 일정 시간 동안에 몇 건이나 처리할 수 있는지, 주로 1초에 몇 건의 요청을 처리할 수 있는지로 표현합니다. 1초에 1000개의 요청을 처리할 수 있다면 1000tps
네트워크가 단위 시간 동안 전송할 수 있는 최대한의 처리량입니다.
해당 네트워크를 최대한으로 활용했을 때 얼마나 빠른 속도로 많은 데이터를 보낼 수 있는지를 나타냅니다.
처리량 vs 대역폭
반면에 처리량은 우리가 측정해본 데이터의 전송량, 처리량을 계속 올리면서 테스트하다 보면 결국 대역폭에 가까워질 수 있습니다.
대역폭은 네트워크에서는 유의미하게 사용될 수 있는 개념이지만 백엔드 애플리케이션은 여러 요소들이 간섭을 주기 때문에 정확한 대역폭을 측정할 수 없습니다.
일단 지연 시간과 처리량에 우선 집중하면 됩니다.
artilery 홈페이지로 가면 설치 방법이 나옵니다.
이전에 npm을 쓰기 위해서는 node를 깔아야 하는데, 이건 설치가 되어있다고 가정합니다.
npm install -g artillery@1.7.6
artilley --version
정상적으로 설치가 됐다면 다음과 같은 화면이 나오게 됩니다.

이제 artillery 홈페이지에 있는 대로 test yml을 작성하면 됩니다.
처음에 프로젝트 루트 부분에 test-config.yml을 작성합니다.
// test-config.yml
config:
target: http://localhost:8080
phases:
- duration: 60 // 테스트 시간
arrivalRate: 5 // 매 초당 처리량
// 테스트 60초 시간 동안 매 초 5번씩 처리
scenarios:
- flow:
- get:
url: '/hello'
이 코드는 hello라는 get 요청 api를 60초 동안 테스트 하는데, 매 초당 5번씩 요청해서 총 300번 요청한다는 의미입니다. 여기서 hello api는 단순히 hello world를 리턴하는 api로 구성했습니다.
artillery run --output report.json test-config.yml
이제 이 명령어를 통해 yml 파일을 실행하고, 리포팅해줍니다.
이걸 실행하게 되면 결과 내용을 report.json이라는 파일을 생성해주게 됩니다. 하지만 저희가 json 데이터를 보기는 어려우니 html 파일로 예쁘게 데이터를 가공해주는 명령어를 사용하도록 하겠습니다.
artillery report report.json --output report.html
이제 이 명령어를 쓰면, json에 있는 데이터를 다음 그림처럼 그래프로 가공해서 보여줍니다.


html 파일을 들어가보면, 이 표가 제일 먼저 보입니다.
테스트가 70초 동안 실시됐으며, 300번의 시나리오가 발생했고, 전부 통과과 됐다는 뜻입니다.
60초 동안 테스트 진행했는데 70초로 나와있는 이유는 요청이 하나씩 늦게 보내지거나 응답이 늦게 왔을 때, 60.xx 초 등으로 합쳐져서 10초가 더 진행된 것입니다.

이 차트를 해석해보면, 최소 지연 시간이 0, 최대 지연 시간이 2, 95퍼센트가 1ms, 99퍼센트가 1ms가 걸렸다는 뜻입니다.

이 그래프는 시간 당 똑같은 양의 요청을 보내기 때문에 의미가 없습니다.
나중에 점점 요청을 늘리다가 요청을 줄일 때, 치솟는 부분이 있는데 그때가 성능 최적화를 해야 하는 부분입니다.

매 초마다 요청을 보내는 양입니다.
초마다 5번 요청을 보내고 있기 때문에 이렇게 찍히게 됩니다.

1초마다 5개의 요청을 보냈기 때문에 10초에 50 RPS가 찍히게 됩니다.
Artillery 말고도 k6, 그라인더 등 다양한 성능 테스트 툴이 있습니다.
Artillery 같은 경우는 성능 테스트를 시작하기 가장 쉽지만, 성능 테스트 진행 파악이 어렵다. 10초마다 텍스트 형태로 보여주기 때문에, 10초 사이의 진행은 보기 어렵다는 단점이 있습니다.
각 테스트 툴에는 각각의 장단점이 있고, 이걸 생각하면서 써야 합니다.