본문 바로가기

Python/Python Library

Python 부하테스트기 - Locust

부하테스트를 위해서 많은 리소스들이 있지만, 가장 쉽게 테스트 해 볼 수 있는건, Locust였습니다.

순차적으로 API를 콜 할 수도 있으며, 랜덤하게 작성한 API를 무작위로 콜할수도 있습니다.

랜덤하게 콜하는 부분에 대해서만 테스트를 해보았습니다.

 

AWS EC2에 설치하는 방법은 아래와 같습니다.

sudo yum install -y python3-devel
sudo yum install -y libevent-devel
sudo yum install -y gcc
sudo python3 -m pip install locust

 

보통은 pip install locust만 하여도 되지만, EC2에는 설치되지 않는게 많아서 다 깔아주셔야 합니다. (안그러면 에러남)

 

저는 Spring Boot Pod LifeCycle에 올린 소스를 가지고 테스트 하였고,

 

부하테스트를 수행한 Locust 소스코드 예시는 아래와 같습니다.

 

간단하게 설명드리면,

@task가 수행하게 되는 API Call이며 @task(1) @task(3) 이런식으로 사용할 수 있는데

숫자의 의미는 비중이 3배 높다라는 뜻으로 보시면 됩니다.

따라서 많이 호출해야하는 경우 높은 숫자를 입력하시면 됩니다.

 

wait time의 경우에는 최소 0.5부터 최대 1.5까지 기다렸다가 API를 콜하겠다라는 뜻입니다.

사용자가 API콜을 얼마나 기다렸다가 하게 할 것인지 작성하시면 됩니다.

 

import random
from locust import HttpUser, TaskSet, task, between


class User(HttpUser):
    @task
    def ccbo(self):
        self.client.get("/fo/ccbo/test1/test2")


    @task
    def error(self):
        module = ["fo", "bo"]
        error_code = ["400", "401", "403", "404", "500", "502", "503", "504"]
        self.client.get("/fo/error/" + random.choice(module) + "/" + random.choice(error_code))


    @task
    def find(self):
        ids = ["1", "2", "3"]
        self.client.get("/fo/find/" + random.choice(ids))


    @task
    def findAll(self):
        self.client.get("/fo/findAll")


    def on_start(self):
        print("START LOCUST")


    def on_stop(self):
        print("STOP LOCUST")


    wait_time = between(0.5, 1.5)

 

이렇게 스크립트까지 개발이 끝난 후, 아래 명령어를 통해 locust를 수행하시면 됩니다.

 

locust -f demo.py

 

그 후, localhost:8089로 접속하시면 아래와 같은 페이지를 볼 수 있습니다.

 

첫번째 칸은 몇명의 유저를 테스트 할 것인지,

두번째 칸은 초당 몇명씩 유저를 늘릴 것인지,

마지막은 테스트하고자 하는 도메인을 작성해주시면 됩니다.

 

 

부하테스트를 어느 정도 수행하고 나서의 결과 입니다.

테스트 어플리케이션이라 CPU를 리밋을 0.5코어로 하였더니 200명의 요청에 응답은 하지만,

Response Time이 최대 10초까지 걸리는 것을 확인하였습니다.

 

 

또한 아래 처럼 수행하던 모습을 그래프로 살펴볼 수 있습니다.

 

 

와탭으로 모니터링을 같이하였는데, TPS와 위의 RPS, 평균응답시간이 거의 동일한 것을 확인할 수 있었습니다.

 

굉장히 쉽고 간단하지만 테스트하기에 좋은 부하테스트 오픈소스라고 생각합니다.

 

Locust에 대해 알아봤습니다.