본문으로 건너뛰기

Python, Locust를 이용한 부하 테스트

· 약 6분

본 포스트에서는 Python 기반의 오픈소스 분산 부하 테스트 도구인 Locust의 사용법을 소개합니다.

Locust는 LoadRunner나 JMeter와 같은 기존의 성능 테스트 도구에 비해 단일 서버에서 더 높은 부하를 생성할 수 있으며, 순수 Python 코드로 테스트 스크립트를 작성할 수 있다는 점에서 개발자 친화적이고 간편한 도구입니다.

Locust 설치​

Python 3.6+ 버전 필요.

pip install locust

최신 버전(Pre-release)을 설치하고 싶다면:

pip install -U --pre locust

설치 확인:

locust -V

locust 2.32.5 from /usr/local/lib/python3.9/site-packages/locust (Python 3.9.12)

# 사용법 확인
locust --help

Locust 기본 사용법​

Mock API 생성​

테스트를 위해 간단한 Mock API를 만들어보겠습니다. 파일명은 api.py입니다.

1. Flask 설치

pip install flask

2. Mock API Script 작성

api.py
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/hello', methods=['GET'])
def hello():
return jsonify({"message": "Hello"})

@app.route('/world', methods=['GET'])
def world():
return jsonify({"message": "World"})

if __name__ == '__main__':
app.run()

3. Mock API 실행:

python api.py

정상적으로 실행되면 아래와 같은 output을 확인할 수 있습니다.

➜  python api.py
* Serving Flask app 'api'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit

http://127.0.0.1:5000/hello 접속 시,{"message":"Hello"} 확인가능.

이렇게 간단한 Mock API생성이 완료되었습니다.

Locust 스크립트 작성​

다음과 같은 테스트 스크립트를 작성하고 파일명을 locustfile.py로 저장합니다.

locustfile.py
from locust import HttpUser, task

class TestUser(HttpUser):
# wait_time = between(0.3, 1) # 요청 간 대기 시간: 0.3~1초 사이

@task
def hello(self):
self.client.get("/hello") # "/hello" URL에 GET 요청

@task(3)
def world(self):
self.client.get("/world") # "/world" URL에 GET 요청 (1:3 비율로 실행)

스크립트 설명

  • HttpUser: TestUser는 HttpUser 클래스를 상속. 이 클래스는 HTTP 기반의 부하 테스트를 할 때 사용됨.
  • wait_time: 사용자 간 대기 시간을 설정하며, between(0.3, 1)은 0.3초~1초의 랜덤 시간을 의미.
  • @task: 테스트 작업을 정의하며, 숫자는 작업이 실행되는 상대적 비율을 나타냄.
  • self.client.get(): 지정된 URL에 GET request.

Locust 실행​

스크립트를 작성한 디렉토리에서 locust 명령어를 실행합니다.

스크립트 파일명이 locustfile.py가 아닐떄, -f 파라미터를 사용하여 파일명을 지정해야 함. 예: locust -f testScript.py

output
➜  locust
[2025-01-09 15:37:57,214] geuni/INFO/locust.main: Starting Locust 2.32.5
[2025-01-09 15:37:57,215] geuni/INFO/locust.main: Starting web interface at http://localhost:8089 (accepting connections from all network interfaces)

이 단계에서 http://localhost:8089 접속후 필요한 정보를 입력하고 START 버튼을 클릭하면 부하테스트가 시작됩니다.

  • Number of users: 동시에 접속할 사용자 수를 설정.
  • Ramp up: 초당 생성할 사용자 수를 설정.
  • Host: 테스트할 대상 서버의 URL을 입력.

locust-run

CLI 모드로 Locust 실행​

CLI 모드에서는 명령어를 통해 테스트를 실행할 수 있습니다. --headless 옵션을 사용하여 대화형 입력 없이 실행 가능합니다.

locust -f locustfile.py --headless --host http://localhost:5000 -u 1000 -r 100 --run-time 20m
  • -f — 테스트 스크립트 파일 경로(파일명이 locustfile.py이고 현재 디렉토리에 있을때 생략 가능)
  • -headless — 명령 모드 사용
  • -u — 사용자 수
  • -r — 초당 증가 속도
  • --run-time — 테스트 지속 시간(-t 파라미터로 대체 가능)

locust_cli_result

테스트 종료 또는 Ctrl-C 중단 후, 위와 같은 테스트 결과를 얻을 수 있습니다.

분산 모드로 Locust 실행​

대규모 부하를 생성하려면 분산 모드를 사용할 수 있습니다.

먼저 --master 옵션으로 마스터 노드를 실행한 후, --worker 옵션으로 여러 worker 노드를 실행합니다.

master 노드 구동:

locust -f my_locustfile.py --master

worker 노드 구동:

locust -f - --worker --master-host <your master> --processes 4
  • -f - : Locust에게 로컬 파일 시스템이 아닌 마스터에서 locustfile을 가져오도록 함. (Locust 2.23.0부터 지원)
  • --master-host : master 노드의 IP를 지정.
  • --processes : Windows 운영체제에서는 지원이 안됨.

공식 문서: http://docs.locust.io/en/stable/