부하 테스트
서버가 얼마만큼의 요청을 견딜 수 있는지 테스트를 해보자.
코드에 문법적, 논리적 문제가 없더라도 서버의 하드웨어 제약 때문에 서비스가 중단될 수 있다.
대표적인 경우가 OOM(Out of Memory)이다. 서버는 접속자들의 정보를 저장하기 위해 각각의 접속자마다 일정한 메모리를 할당한다. 이렇게 사용하는 메모리의 양이 증가하다가 서버의 메모리 용량을 넘어서게 되면 문제가 발생한다.
artillery를 설치하고 서버를 실행해보자.
npm i -D artillery
npm start
그리고 터미널을 하나 더 실행시켜 다음 명령어를 이용하여 100명의 가상 사용자가 50번씩 요청을 보내게 해보자.
npx artillery quick --count 100 -n 50 http://localhost:8001
min이 51.9 밀리초, max가 1057.5 밀리초가 걸렸다. 모두 성공하였으나 차이가 다소 있는걸로 보아 부하가 조금 있는 것으로 판단된다. 하지만 현재는 한 페이지에만 요청을 보냈다. 실제로는 여러 페이지에 요청이 갈 것이다.
이때는 JSON 형식의 설정 파일을 작성해야 한다.
{
"config":{
"target": "http://localhost:8001",
"phases":[
{
"duration": 60,
"arrivalRate": 30,
}
]
},
"scenarios": [{
"flow": [
{
"get": {
"url": "/"
}
}, {
"post": {
"url": "/auth/login",
"json": {
"email": "eminhwan12@gmail.com",
"password": "nodejsbook",
}
}
}, {
"get": {
"url": "/hashtag?hashtag=nodebird"
}
}
]
}]
}
loadtest.json
이제 artillery로 다시 실행해보자.
편차가 그리 크지 않게 부하를 잘 감당한 것 같다.
일반적으로 요청-응답 시 데이터베이스에 접근할 때 가장 많은 시간이 소요된다. 서버는 여러 대로 늘리기는 쉽지만, 데이터 베이스는 늘리기 어려우므로 하나의 데이터베이스에 많은 요청이 몰리곤 한다. 따라서 최대한 데이터베이스에 접근하는 요청을 줄이면 좋다. 또한 반복적으로 접근하는 데이터는 캐싱을 고려해보자.