라이브 전, 기능이 모두 정상적으로 돌아간다고 하더라도 실제 유저가 없다면 얼마나 서버가 버틸 수 있는지 또는 병목 현상이 어디서 발생하는지 확인하기란 매우 어렵다. 이러한 미지속 어둠같은 상황에서 그 문제를 깨닫는 상황이라면 제대로된 대응을 하기도 어렵게된다.
이러한 상황을 최대한 방지하고자 스트레스 테스트를 진행하고 서버와 내가 짠 코드가 어디까지 버틸 수 있는지 먼저 알고 있어야한다.
스트레스 테스트를 진행할때는 Jmetar , nGrinder 등 여러 테스트 툴이 있는데, 내가 사용한 툴은 Node 기반의 툴로 스크립트를 이용한 시나리오 테스트를 진행 할 수 있는 artillery를 선택했다.
Artillery.io | Load & Smoke Testing
네이밍을 참 잘 지었는데 Artillery의 의미인 포병이라는 말 그대로 폭격처럼 트래픽을 유발시긴다
node가 설치된 상태에서 전역으로 artillery를 설치해주면 된다.
npm install -g artillery
artillery quick --duration 60 --rate 10 -n 20 http://127.0.0.1:3000
duration 60 : 60초 동안 테스트를 한다 rate : 초당 10개의 요청을 보낸다 n : 동시 접속은 20으로 한다.
자세한 옵션 확인하려면 -h를 사용하여 조회 할 수 있다.
target.json 같은 파일을 하나 만들어준다
{
"config": {
"target": "http://localhost:3000", // 서버 주소 지정
"phases": [
{"duration": 10, "arrivalRate": 500} // 60초 동안 매초 500번 요청 전송
],
"defaults": {
"headers": {
"User-Agent": "Artillery" // 해더 정보
}
}
},
"scenarios": [
{
"name": "customMap", // 테스트명
"flow": [ // 진행 플로우 , 순차적으로 진행된다
{"get":
{
"url": "/around/v1/list/37.48/126.93", // GET
"headers": {
"Authorization": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZHgiOjI0NzQsImlkIjoiYW5vbnltb3VzIiwibHYiOjAsInN0YXR1cyI6MiwiaWF0IjoxNjQ4MTk0MjczLCJleHAiOjE2NDgxOTUxNzMsImp0aSI6IjI0NzR0MTY0ODE5NDI3MzYxNCJ9.XjeYaTTAFBB6y1V-o6jsslGHEE31RBIfCAldi7XQLms"
} // 해더 추가
}
}
]
}
]
}
이후 동일 폴더에서 다음 명령어 실행
artillery run -o 결과파일.json target.json
target에 설정한대로 테스트가 진행된다.
이후 html 템플릿이 적용된 화면은 아래 명령어로 리포트로 받아 볼 수 있다
artillery report 결과파일.json
리눅스는 기본 파일 확장이 1024로 설정되어 있어서 수정을 해줘야 성능을 그만큼 사용 할 수 있으니 리미트 제한이 있는지 확인해야한다.