ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 부하테스트 - Locust (설치 및 스크립트 작성)
    파이썬 2022. 5. 15. 22:14

    들어가며

    파이썬으로 작성된 Locust라는 툴을 설치해서 사용하는 방법을 알아보고 웹 애플리케이션에 부하 테스트를 적용해본다.

     

    참고 사항: locust는 영어로 메뚜기라는 뜻인데, 이 툴에서 부하를 주는 것을 swarming(무리 짓기)이라고 표현한다.

     

    왜 Locust?

    우선 다른 부하 테스트 툴도 많지만 왜 이 Locust를 사용하면 어떤 이점이 있냐면,

    Jmeter, nGrinder,SOAP UI 등의 도구는 사용과 스케일링을 하는데 어려움이 있는 반면에, locust는 설치와 사용이 편리하고, 파이썬 스크립트로 작성을 하기 때문에 훨씬 빠르고 간편하게 부하 테스트를 해볼 수 있다.

     

    설치

    설치는 아주 간단하다.

    pip install locust
    
    # poetry를 사용한다면
    poetry add locust
    
    # 설치 확인
    locust -V

     

    스크립트 작성

    간단하게 기본적인 스크립트를 작성해본다.

     

    # locustfile.py
    from locust import HttpUser, task, between, TaskSet
    
    
    class UserBehavior(TaskSet):
        @task
        def get_user_detail(self):
            user_id = 1
            self.client.get(f'/user/{user_id}')
    
        @task
        def home(self):
            self.client.get('/')
    
    
    class LocustUser(HttpUser):
        host = "<https://locust.load-test.com>"
        tasks = [UserBehavior]
        wait_time = between(1, 4)

     

    코드 설명

    HttpUser

    이름 그대로 서버에 부하는 가할 유저를 나타내는 클래스이다. tasks 애트리뷰트에 선언된 작업 또는 @task 데코레이터가 붙여진 작업를

    수행한다.

     

    TaskSet

    유저가 수행할 작업들을 하나의 클래스로 만들어, tasks 애트리뷰트에 선언된 작업들 또는 @task 데코레이터가 붙여진 작업들 중 랜덤으로 수행한다.

    또한, 아래 코드처럼 Nested 구조를 만들 수 있다.

     

    from locust import HttpUser, task, between, TaskSet
    
    class NestedBehavior(TaskSet):
        @task
        def inner_task(self):
            print("inner task")
    
        def on_stop(self):
            self.interrupt()
    
    class MainBehavior(TaskSet):
        tasks = [NestedBehavior]
    
        @task
        def main_task(self):
            print("main task")
    
    class LocustUser(HttpUser):
        host = "127.0.0.1:8000"
        tasks = [MainBehavior]
        wait_time = between(1, 4)

     

    이런식으로 TaskSet안에 또 다른 TaskSet를 넣어 계층적 작업 구조를 만들 수 있는데,

    유의할 점은 NestedBehavior가 한번 실행되면, NestedBehavior의 작업들만 수행된다. 띠라서 MainBehavior의 작업도 수행하게 하려면 on_stop 메서드에 interrupt 메서드를 호출 해주어야 상위 TaskSet도 수행할 수 있다.

     

    task

    HttpUser는 @task 데코레이터가 붙은 메서드를 찾아 수행하게 된다.

    weight 파라미터를 넣어주면 각 테스크마다 가중치를 부여할 수 있다.

    아래 코드를 보면

     

    @task(weight=1)
    def first_task(self):
        pass
    
    @task(weight=2)
    def second_task(self):
        pass

    second_task가 first_task보다 실행될 확률이 2배나 된다.

     

    between

    HttpUser나 TaskSet의 wait_time 애트리 뷰트를 사용할 때 해당 함수를 사용할 수 있다.

    wait_time = between(1, 4) 선언해주면 1초 ~ 4초 사이 간격으로 랜덤하게 작업이 수행된다는 뜻이다.

    당연하게 constant라는 이름의 함수도 제공해서 일정한 간격으로 작업을 수행할 수 있도록 해준다.

    wait_time = constant(5) 는 5초마다 작업을 수행한다.

     

     

    실행하기

     

    스크립트를 작성했다면, shell에 아래의 명령어를 입력한다.

     

    locust -f your/path/locustfile.py
    
    # 현재 위치에 locustfile.py 라는 파일이 존재하면
    locust
    
    # --host 등 커맨드 옵션을 알고 싶다면
    locust --help

     

    정상적으로 스크립트를 작성했다면 아래의 출력과 함께 실행된다.

     

    http://0.0.0.0:8089 로 접속하면 아래와 같이 개발자가 원하는 부하테스트를 할 수 있다.

     

    각 설명

    Number of users는 최대 유저 수

    Spawn rate는 한번에 유저가 생성되는 수

    Host 부하 테스트할 서버 주소

     

    Start swarming을 눌러 시작하면 부하 테스트가 진행되면서

    아주 이쁘게 요청수, 실패 수, 종류별 응답 시간 등을 볼 수 있다

     

     

    그래프 형식으로도 제공한다.

     

     

    마치며

    설치부터 테스트까지 진행해보았다. 직접 해보면 매우 간단하게 부하 테스트를 할 수 있다는 것을 바로 체감할 수 있다! 위에 설명한 기능들 이외에 locust가 다양한 설정 및 기능들을 제공하니 자세한 사항은 공식문서 를 확인하면 된다.

    또, 아무래도 파이썬 스크립트로 작성하니 Django, Fast API, Flask 등 파이썬 웹 프레임워크와 같이 애플리케이션울 불러와 사용할 수도 있을 것 같은데 해당 부분은 나중에 포스팅해보겠다!

     

     

    참고

    https://bcho.tistory.com/1369

    https://github.com/locustio/locust

    '파이썬' 카테고리의 다른 글

    Poetry 의존성 Syntax (~, ^ 에 대해)  (0) 2022.04.20

    댓글