Locust란?
Locust는 Python으로 작성된 오픈소스 부하테스트 도구이다.
Locust를 사용하면 분산 시스템에서 여러 사용자를 시뮬레이션하여 웹 애플리케이션의 성능을 측정할 수 있다.
또한 매우 사용하기 쉽고 확장성이 뛰어나며, 사용자 시나리오를 코드로 작성할 수 있어 유연성이 높고, 대시보드를 통해 실시간으로 테스트 결과를 모니터링할 수 있어 테스트 중에 성능 이슈를 발견하고 조치할 수 있다.
이번 포스팅에서는 docker-compose를 이용해 구성하고, master 1개 worker 3개로 구성한다.
worker는 Locust 테스트를 수행하는 역할을 담당하며, master는 Locust 웹 인터페이스를 제공하고, worker에서 수행한 결과를 수집하여 테스트 결과를 종합하고, 그 결과를 웹 인터페이스를 통해 제공한다.
트래픽 테스트 대상은 AWS EKS 환경에 nginx pod를 배포하여 테스트를 진행한다.
실습
먼저, locust에서 사용할 python 코드를 작성해 보자.
아래 코드는 테스트 대상인 애플리케이션의 루트 경로("/")에 대한 GET 요청을 보내는 코드이다.
## locustfile.py
from locust import HttpUser, task
class HelloWorldUser(HttpUser):
@task
def hello_world(self):
self.client.get("/")
위 locustfile.py을 사용해서 locust 서버를 실행시켜 보자.
docker-compose 파일을 아래와 같이 작성하여 master와, worker를 정의한다.
## docker-compose.yml
version: '3'
services:
master:
image: locustio/locust
ports:
- "8089:8089"
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile.py --master -H http://master:8089
worker:
image: locustio/locust
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile.py --worker --master-host master
worker 3개로 지정하여 docker-compose 파일을 실행시킨다.
$ docker-compose up --scale worker=3
Creating network "locust_default" with the default driver
Pulling master (locustio/locust:)...
latest: Pulling from locustio/locust
3f9582a2cbe7: Pull complete
57d9937f91c0: Pull complete
11379c8c0265: Pull complete
8f27eb088ff1: Pull complete
b57fbbd40f23: Pull complete
169e23e1ecf5: Pull complete
671639836b5c: Pull complete
e1ec59752a93: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:866561ef2f18c4068c96295d374182646b49174d1adf95fb613c50383203d498
Status: Downloaded newer image for locustio/locust:latest
Creating locust_master_1 ... done
Creating locust_worker_1 ... done
Creating locust_worker_2 ... done
Creating locust_worker_3 ... done
Attaching to locust_worker_3, locust_worker_1, locust_worker_2, locust_master_1
master_1 | [2023-04-15 15:11:34,254] 82ddb3cd70a7/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
master_1 | [2023-04-15 15:11:34,264] 82ddb3cd70a7/INFO/locust.main: Starting Locust 2.15.1
master_1 | [2023-04-15 15:11:34,265] 82ddb3cd70a7/INFO/locust.runners: Worker 1085c5fa962f_7d385dabc56146b998f742b7e47efe5a (index 0) reported as ready. 1 workers connected.
worker_3 | [2023-04-15 15:11:34,266] 1085c5fa962f/INFO/locust.main: Starting Locust 2.15.1
master_1 | [2023-04-15 15:11:34,306] 82ddb3cd70a7/INFO/locust.runners: Worker 65fc25794e58_345125932f1745d18331587a6c588be3 (index 1) reported as ready. 2 workers connected.
worker_1 | [2023-04-15 15:11:34,307] 65fc25794e58/INFO/locust.main: Starting Locust 2.15.1
master_1 | [2023-04-15 15:11:34,310] 82ddb3cd70a7/INFO/locust.runners: Worker d295f47ceace_e45e2dc517cb4d919d012f6ec83b78b2 (index 2) reported as ready. 3 workers connected.
worker_2 | [2023-04-15 15:11:34,311] d295f47ceace/INFO/locust.main: Starting Locust 2.15.1
docker-compose 실행 후 컨테이너를 확인하면 다음과 같다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65fc25794e58 locustio/locust "locust -f /mnt/locu…" 15 minutes ago Up 15 minutes 5557/tcp, 8089/tcp locust_worker_1
1085c5fa962f locustio/locust "locust -f /mnt/locu…" 15 minutes ago Up 15 minutes 5557/tcp, 8089/tcp locust_worker_3
82ddb3cd70a7 locustio/locust "locust -f /mnt/locu…" 15 minutes ago Up 15 minutes 5557/tcp, 0.0.0.0:8089->8089/tcp, :::8089->8089/tcp locust_master_1
d295f47ceace locustio/locust "locust -f /mnt/locu…" 15 minutes ago Up 15 minutes 5557/tcp, 8089/tcp locust_worker_2
{ip}:8089로 대시보드에 접근한다.
각 항목의 의미는 아래와 같다.
- Number of users
생성할 가상 사용자의 최대 수 - Spawn rate
초당 생성할 가상 사용자의 수 - Host
요청받을 대상 주소 - Run time
부하 테스트를 진행할 시간
위 설정은 전체 10명의 가상 사용자를 생성하여 테스트할 건데, 초당 2명씩 늘어나고 20초 동안 부하테스트를 진행한다는 의미이다.
AWS EKS에 아래처럼 Nginx Pod를 띄운다.
## nginx pod
apiVersion: v1
kind: Pod
metadata:
labels:
app: nginx
name: nginx
spec:
containers:
- name: nginx
image: nginx:latest
트래픽을 보내기 위해 NodePort로 서비스를 노출한다.
$ kubectl expose pod nginx --port=80 --type=NodePort
테스트 결과를 확인해 보자.
20초 동안 진행 된 테스트 결과에 대한 그래프이다.
사용자가 10명일 때 초당 요청을 처리할 수 있는 RPS는 1370, 50% 이하는 6ms 응답을 95% 이하는 14ms 응답을 받았다는 것을 확인할 수 있다.
마치며
이번 포스팅에서는 Locust를 이용하여 간단하게 성능 테스트를 진행하는 방법과 Web UI 대시보드를 통해 결과를 확인하는 방법을 소개하였다. 이를 통해 애플리케이션의 성능을 개선하고 안정적으로 운영하기 위한 기초를 마련할 수 있다.
댓글