Python

[Locust] 부하테스트 툴 사용 방법

비아 VIA 2023. 3. 26. 22:56

INTRO

업무 중에 여러개의 request가 동시에 들어왔을 때 생기는 오류가 있었다.

코드를 수정하고 테스트를 충분히 해보고 싶었는데 스웨거나 포스트맨으로만 테스트하기에는 한계가 있어서

부하 테스트 도구인 LOCUST를 사용해보게 되었다.

https://locust.io/

(google에 locust로 검색하면 온갖 메뚜기 이미지가 나와서 징그러울 수 있으니 주의!)

Locust는 파이썬으로 작성된 오픈 소스 부하 테스트 도구이다. 웹 사이트 성능 테스트에 유용하고 사용자 동시 접속수를 증가시키는 시뮬레이션을 할 수 있어서 시스템이 얼마나 많은 부하를 견딜 수 있는지 체크할 수 있다.

설치 방법

파이썬 3.7 이상이 설치되어 있어야 한다

pip3 install locust

잘 설치되었는지 확인!

locust -V

 

간단한 튜토리얼

간단하게 시작해보자.

locustfile.py 라는 파일명으로 아래와 같은 코드를 작성한다

import time
from locust import HttpUser, task, between

class CouponUser(HttpUser):
    wait_time = between(1, 5)

    @task
    def get_coupons(self):
        self.client.get("/coupons")

    @task(3)
    def get_single_coupon(self):
        for coupon_id in range(10):
            self.client.get(f"/coupon?id={coupon_id}", name="single_coupon")
            time.sleep(1)

쿠폰 목록 가져오기, 개별 쿠폰 정보 조회하기를 테스트하기 위한 코드를 작성했다 

class CouponUser(HttpUser):
    wait_time = between(1, 5)

CouponUser 클래스는 HttpUser를 상속하여 사용자를 정의한다. 여기서 HttpUser는 사용자 정의 클래스를 만들기 위한 기본 클래스이다. 테스트가 시작되면 시뮬레이션하는 모든 사용자에 대해 이 클래스의 인스턴스를 생성하게 된다.

between은 사용자 요청 간 대기 시간을 설정하는 함수이다. between(1, 5)로 설정하면 각 요청 사이에 1초에서 5초 사이의 무작위 대기 시간을 적용한다.

    @task
    def get_coupons(self):
        self.client.get("/coupons")
        
    @task(3)
    def get_single_coupon(self):
        for coupon_id in range(10):
            self.client.get(f"/coupon?id={coupon_id}", name="single_coupon")
            time.sleep(1)

@task 데코레이터로 작업을 선언한다.

로커스트는 실행 중인 모든 사용자에 대해 해당 메서드를 호출하는 마이크로 스레드를 생성한다.

@task(3)처럼 가중치를 부여할 수도 있다. CouponUser가 실행되면 선언된 작업 중 하나(이 get_coupons 또는 get_single_coupon)를 선택해 실행한다. 작업은 무작위로 선택되지만 가중치를 다르게 지정할 수 있다.

위의 코드처럼 가중치를 부여하면 Locust가 get_coupons보다 get_single_coupon을 선택할 확률이 3배 더 높아지게 된다. 작업 실행이 완료되면 사용자는 대기 시간(이 경우 1초에서 5초 사이) 동안 쉬었다가 대기 시간이 지나면 새 작업을 선택하고 이를 계속 반복한다.

get_single_coupon에서는 10개의 서로 다른 url을 로드한다. locust의 통계에는 url이 달라서 개별 통계로 표시될 수 있기 때문에 name을 통해 묶어서 그룹화할 수 있다.

 

$ locust
[2021-07-24 09:58:46,215] .../INFO/locust.main: Starting web interface at http://*:8089
[2021-07-24 09:58:46,285] .../INFO/locust.main: Starting Locust 2.15.1

이제 locustfile.py가 있는 디렉토리에서 locust를 실행해보자.

http://localhost:8089

위의 url에 들어가면 locust의 웹 인터페이스가 보인다.

출처: locust 공식문서

서버 host의 이름을 입력하고 사용자 수, 사용자 증가율을 넣은 후 실행해보면 된다

출처: locust 공식문서

차트에서 초당 요청 수(RPS), 응답 시간, 실행 중인 사용자 수 등을 확인할 수 있다

출처: locust 공식문서
출처: locust 공식문서

오류가 나는 코드를 수정 후

locust에서 내가 체크해보고싶은 동시 접속자 수 이상으로 테스트해봐도 실패가 발생하지 않는 것을 확인할 수 있었다!