locust
사용하기 편하고, 스크립트로 작성이 가능하고, 확장 가능한 성능 테스트 툴
- 테스트 시나리오를 파이션 스크립트로 작성가능
- 분산 환경에서 확장 가능
- 부하 테스트란 요청을 만들어서 계속해서 보내면서 부하를 줘보는 것!
- 단일 서버에서 요청을 만들어서 보내는 건 어느 정도 한계가 있다(결국 요청을 보내는 것도 리소스가 드는 작업이므로 굉장히 많은 양의 부하를 만들 수는 없음).
- 따라서, 부하를 발생시키는 서버를 여러 대로 늘린 다음에 각 서버에서 부하를 발생시켜 테스트를 진행할 수 있다.
- 즉, 더 많은 부하에 대해 테스트를 진행할 수 있다.
- web-based UI
- 테스트 결과와 진행 상황을 차트나 표와 같은 보기 편한 형태로 볼 수 있다,.
사용예제
https://docs.locust.io/en/stable/quickstart.html
docker-compose.yml
version: '3.7'
services:
master:
image: locustio/locust
ports:
- "8089:8089"
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile-hello.py --master -H http://host.docker.internal:8080
worker:
image: locustio/locust
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile-hello.py --worker --master-host master
docker compose up -d --scale worker=3
- worker의 CPU 사용량이 100%가 넘는다는 것은 부하를 잘 만들지 못하고 있는 상황을 의미한다.
- 이 경우 측정되는 RPS를 신뢰할 수 없다.
- worker를 여러 대 늘려서, 유저 수를 분산해 부하를 발생시킨다면 이 부분을 어느 정도 해소할 수 있다.
locustfile-hello.py
from locust import task, FastHttpUser
class HelloWorld(FastHttpUser):
connection_timeout = 10.0
network_timeout = 10.0
@task
def hello(self):
self.client.get("/hello")
HelloController
package me.progfrog.couponapi.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() throws InterruptedException {
Thread.sleep(500);
return "hello!!";
}
}
- 요청이 들어왔을 때, 0.5초를 쉰 다음에 보냄
- 응답에 대한 최솟값은 500ms
- RPS = 초당 처리할 수 있는 수 * N(서버에서 동시에 처리할 수 있는 수)
- 초당 2건 정도 처리
- 톰캣에서 스레드풀로 처리를 하는데, max 스레드 수는 기본적으로 200
- 따라서, RPS가 400 정도 나올 것이라고 예상할 수 있음!
* RPS(Requests Per Second)
- 초당 처리할 수 있는 요청의 수
- 서버가 얼마나 많은 요청을 동시에 처리할 수 있는지 평가하는 데 사용
- 웹 애플리케이션의 성능을 직접적으로 나타내는 지표
실제로 동작시켜보면....
- 1000명의 유저가 동시에 요청함
- 처음에 100명이 요청하고, 초당 100명씩 늘어 최대 1000명이됨
RPS가 400이 나오는 것을 확인할 수 있다.
application.yml
server:
tomcat:
threads:
max: 400
위와 같이 스레드 수를 400으로 조정한 뒤 실행해 보면 다음과 같이 RPS가 800이 나오는 것을 확인할 수 있다.
주의사항
그렇다면, 톰캣의 스레드 수를 늘려주기만 한다면 처리량이 증가하는 것 아닌가?
그렇지는 않다. 기본 200개가 제대로 잘 사용되고 있는지부터 확인이 필요하다. 모니터링을 통해 조정이 필요한 부분!
또한, 서버에서 처리할 수 있는 처리량이 초당 400이라고 한다면 그 이상으로 요청이 계속 들어왔을 때 응답이 지연될 수 있다. 즉, 서버가 처리할 수 있는 처리량 이상을 받았을 때 응답 속도는 계속해서 느려지게 되고 결국에는 서버가 터져 실패를 응답하게 된다.
이렇게 부하 테스트를 해봤을 때...
다음과 같이 유저수는 점차 늘고, RPS는 400대로 거의 비슷하지만 응답 속도가 점차 느려지는 것을 확인할 수 있다!
(좋지 않은 시그널이다.)
반응형