본문 바로가기
Performance Test/Locust

Locust 란? 개념부터 실습까지

by wlsdn3004 2023. 4. 16.
728x90
반응형

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 대시보드를 통해 결과를 확인하는 방법을 소개하였다. 이를 통해 애플리케이션의 성능을 개선하고 안정적으로 운영하기 위한 기초를 마련할 수 있다.

반응형

댓글