웹 사이트 또는 API 서버를 개발 중이라면, 이 사이트가 얼마나 많은 트래픽을 동시에 처리할 수 있는지 확인해보는 것이 좋습니다. 그래야 어느 정도의 트래픽을 감당할 수 있는지 예상을 할 수 있고, 그에 맞는 서버 스펙을 선정할 수 있기 때문입니다.
오늘은 wrk라는 툴로 부하 테스트하는 방법에 대해 살펴보겠습니다. wrk는 단일 멀티코어 CPU에서 실행할 때 상당한 부하를 생성할 수 있는 최신 HTTP 벤치마킹 도구입니다[1].
먼저 wrk를 리눅스 서버에 설치하도록 하겠습니다. 다음 명령을 순차적으로 실행하세요.
get 요청을 받을 수 있는 엔드포인트에 부하테스트를 해보겠습니다. 현재 여러분이 이용하고 계시는 asksim.co.kr에 해보겠습니다. 다음과 같은 명령을 실행하시면 됩니다.
wrk https://asksim.co.kr
이 엔드포인트는 초당 974개의 요청을 처리할 수 있음을 확인할 수 있습니다. 10초간 2개의 쓰레드, 10개의 connection을 연 상태로 테스트를 한 결과입니다.
테스트 시간과 사용할 쓰레드 개수와 열어둘 connection의 개수를 지정하고 싶다면, 다음과 같이 옵션을 추가해서 명령을 날리면 됩니다. 이번에는 로그인 엔드포인트에 부하테스트를 하겠습니다.
10 쓰레드, 100 connection, 30초
wrk -t10 -c100 -d30s https://asksim.co.kr/auth/login
wrk에서 사용할 수 있는 전체 옵션들은 다음과 같습니다[1].
-c, --connections: total number of HTTP connections to keep open with
each thread handling N = connections/threads
-d, --duration: 테스트 기간, e.g. 2s, 2m, 2h
-t, --threads: 사용할 쓰레드 총 개수
-s, --script: LuaJIT 스크립트 사용할 시 파일 경로 앞에 붙여줌
-H, --header: 요청에 붙일 HTTP 헤더, e.g. "User-Agent: wrk"
--latency: 상세한 latency 통계 출력
--timeout: record a timeout if a response is not received within
this amount of time.
이쯤이면 wrk로 post 요청을 받는 엔드포인트에 어떻게 부하테스트를 할 수 있을지 궁금하실 것입니다. lua라는 파일 확장자를 가진 파일(LuaJIT 스크립트)을 하나 작성해줘야 합니다.
post.lua라는 스크립트를 하나 만들고(파일명은 post가 아닌 다른 거라도 상관없습니다), 그 안에 다음과 같은 내용을 작성합니다. 여러분의 상황에 맞는 내용을 담으시면 됩니다.
wrk.method = "POST"
wrk.headers["content-type"] = "application/json"
wrk.body = '{"key1": "value1", "key2": "value2"}'
그 다음에 다음과 같은 명령을 수행하면 POST 요청으로 부하 테스트를 할 수 있습니다.
wrk -t10 -c100 -d30s http://localhost:8001/test -s post.lua