INTRO
업무 중에 여러개의 request가 동시에 들어왔을 때 생기는 오류가 있었다.
코드를 수정하고 테스트를 충분히 해보고 싶었는데 스웨거나 포스트맨으로만 테스트하기에는 한계가 있어서
부하 테스트 도구인 LOCUST를 사용해보게 되었다.
(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의 웹 인터페이스가 보인다.
서버 host의 이름을 입력하고 사용자 수, 사용자 증가율을 넣은 후 실행해보면 된다
차트에서 초당 요청 수(RPS), 응답 시간, 실행 중인 사용자 수 등을 확인할 수 있다
오류가 나는 코드를 수정 후
locust에서 내가 체크해보고싶은 동시 접속자 수 이상으로 테스트해봐도 실패가 발생하지 않는 것을 확인할 수 있었다!
'Python' 카테고리의 다른 글
Whisper에 단어별 타임스탬프가 필요할 때 - whisperX or whisper-timestamped (1) | 2023.06.18 |
---|---|
python으로 유튜브 자막 다운로드, 번역해보기 (feat. ChatGPT, Whisper api) (1) | 2023.04.09 |
[Python] 파이썬 classmethod와 staticmethod 차이 (0) | 2023.03.12 |