Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- hive
- Django
- 오블완
- Hadoop
- JWT
- NoSQL
- slack
- Airflow
- 로그 백업
- docker
- hard delete
- soft delete
- AWS
- nginx
- DAG
- 티스토리챌린지
- 물리삭제
- logstash
- prometheus
- grafana
- aws ec2
- elasticsearch
- node exporter
- unique constraint
- Next.js
- redis
- Locust
- 계정 관리
- ci/cd
- 논리삭제
Archives
- Today
- Total
먹수의 개발일지
[Locust] Django와 Locust로 API 부하 테스트 본문
Intro
서비스를 운영할 때 부하테스트를 통해 성능 이슈를 대비하는 것이 중요하다. 간단한 부하테스트 예제를 살펴보자!
Locust란?
Locust는 Python 기반의 부하 테스트 도구로, 여러 사용자의 API 요청을 시뮬레이션해 서버의 성능을 측정할 수 있다. 특히 Locust는 코드로 테스트 시나리오를 작성할 수 있어 재사용성이 높고 유연한 구성이 가능하다.
Locust 설치
먼저 Locust를 설치한다.
pip install locust
locust.py 파일을 작성한다.
- HttpUser: Locust에서 사용자 행동을 정의하는 기본 클래스로, HttpUser 클래스를 상속받아 Django API 서버에 HTTP 요청을 보낼 수 있다.
- wait_time: 각 사용자의 요청 간격을 설정하는 속성이다. 여기서는 between(1, 3)으로 설정해, 각 요청 사이의 대기 시간을 1초에서 3초 사이로 랜덤하게 정했다.
- api_endpoints: 테스트할 엔드포인트들의 목록을 배열 형태로 정의했다.
- @task 데코레이터: Locust에서 개별 작업(테스트 시나리오)을 정의할 때 사용한다. get_endpoint 메서드는 정의된 엔드포인트들 중 하나를 랜덤하게 선택해 요청을 보낸다.
- request_timeout : 현재 코드에서는 사용하지 않았지만, wait_time과 같이 API 요청 후 응답 최대 대기 시간을 옵션으로 지정할 수 있다. 지정하지 않을 경우 default는 60초다.
from locust import HttpUser, task, between
import random
class DjangoApiUser(HttpUser):
wait_time = between(1, 3) # 사용자 간 요청 시간 간격 설정
# 테스트할 API 엔드포인트 목록
api_endpoints = [
"/api/example1",
"/api/example2",
"/api/example3",
]
@task
def get_endpoint(self):
# 엔드포인트 목록에서 하나를 랜덤으로 선택하여 요청 전송
endpoint = random.choice(self.api_endpoints)
self.client.get(endpoint)
Locust 테스트 실행
작성한 코드를 이용해 Locust를 실행한다.
locust -f <파일이름>.py
브라우저에서 http://localhost:8089로 접속하면 Locust 웹 인터페이스가 열린다. 이 인터페이스를 통해 동시 사용자 수와 테스트 속도를 조절하면서 부하 테스트를 수행할 수 있다.
'back-end > Django' 카테고리의 다른 글
[Django] Redis 캐싱으로 성능 최적화 (0) | 2024.11.20 |
---|---|
Django Signals (0) | 2024.11.10 |
[DRF] Responsed Unauthorized 401 in AllowAny permission (1) | 2023.02.21 |
Comments