Locust

가장 간단하고 빠르게, Python기반으로 부하 테스트를 진행하고 싶다면, 어떤 오픈소스 툴이 가장 좋을까? Locust는 확실히 강력한 후보 중 하나일 것이다. Apache Jmeter, SoapUI도 있지만 설치까지의 과정은 상당히 까다롭고 귀찮으며, Selenium은 아주 큰 부하를 주기엔 적합하지 않다. 따라서 Locust는 쉽고 빠르게 테스트하기에 완벽하다.

Locust 설치 및 실행해보기

설치는 pip으로하면 되고, 매우 간단하다.

pip install locust

그 이후 Python으로 실행할 locust file을 작성하고 다음과 같이 Terminal에서 구동한다.

locust -f file.py

Locust file은 다음과 같이 작성해주면 된다.

from locust import HttpUser, between, task


class WebsiteUser(HttpUser):
    wait_time = between(5, 15)
    def on_start(self):
        response = self.client.post('/api/v1/security/login', json={})
    @task(2)
    def ds(self):
        self.client.get("/api/v1/dashboard/0/charts")
    @task
    def ds2(self):
        self.client.get("/api/v1/chart/1/data/")
    @task
    def ds3(self):
        self.client.get("/api/v1/chart/2/data/")

위 코드는 간단하게 Superset에 Dashboard내 차트들을 불러오고 (ds), 차트 1과 2의 정보를 받아 올 수 있는 task (ds2, ds3)들이다. Locust가 구동되면 이러한 Task decorator가 붙은 애들을 알아내서 가상의 유저들은 task를 구동하게 된다. 이때, task옆의 붙은 숫자는 비율로, default가 1인 다른 task에 비해 그 숫자만큼 더 자주 구동을 시켜준다. on_starton_stop 함수는 task를 시작하기전과 task를 stop했을때 구동해준다. 이외에 TaskSet, HTTP Request 또한 가능하나 나는 사용하지 않았다.

Locust UI

Locust file을 구동한 뒤 localhost의 8089 포트로 들어가게 되면 다음과 같은 UI를 확인할 수 있다. 다음과 같은 UI에서 유저 수, 유저가 생성되는 Spawn Rate, 그리고 호출을 할 host 주소를 치고 Start Swarming을 하게 되면 시작이 된다.
다음과 같이 hello와 world라는 두개의 task가 돌아가는것을 알 수 있다. 우리의 케이스에선, /api/v1/security/login, /api/v1/dashboard/0/charts, /api/v1/chart/1/data/, /api/v1/chart/2/data/가 뜰것이다. 이후 사진에서와 같이 전체적인 현황을 알 수 있다. Charts에 들어가면 Total Request Per Second, Response Time (in milliseconds), Number of Users등의 차트를 확인할 수 있고, Failures와 Exceptions에서는 발생한 실패와 Exception(있다면)을 확인할 수 있다. 마지막으로 Download에서는 HTML파일 형태로 전체적인 통계 테이블/차트를 다운 받을 수 있다.

나의 Locust 사용

나의 경우에는 Locust를 이용해 Superset에 부하테스트를 주기 위해 사용하였다. 100명 가상 유저를 생성하였을때 task들의 aggregated p95가 약 3700ms 였던것을 Superset 설정들을 변경하여 약 1500ms가 되게 하는 것을 확인하였다. Locust 덕분에 쉽게 가상 유저를 생성하고 실험해볼 수 있었다. 그러나 API특성상 캐싱 된 데이터만 가져올 수 있어서, 캐싱 되지 않았던 데이터에 대한 실험은 Selenium을 통해서 해야 됐다. 추후에 Superset 최적화 실험들에 관하여 모두 정리하여 올려보도록 하겠다.

Reference

https://medium.com/@jspark141515/locust%EB%A1%9C-%EC%84%9C%EB%B2%84-%EC%84%B1%EB%8A%A5-%ED%85%8C%EC%8A%A4%ED%8A%B8%ED%95%98%EA%B8%B0-7490d882015
https://kim-dragon.tistory.com/133
http://docs.locust.io/en/stable