Locust 부하테스트

프로필

2025년 01월 20일

103 0

멍청하게도 AWS -> OCI 이주의 장점이 비용만이 아닌 성능에서도 큰 향상이 이루어진다고 얘길해놓고 정작 테스트는 진행해보지 않았었는데, 면접이 끝나고 난 후에야 그 생각이 나서 Locust를 이용해 부하테스트를 진행해봤다.

Locust란?

Python 기반 오픈 소스 부하테스트 툴로, 파이썬 코드로 스크립트를 작성하기에 사용이 아주 편리하다.

사용 방법은 아주 간단한데 나 같은 경우는 poetry를 사용하기에

poetry add locust

로 locust를 설치한 후, 적당한 경로에 locustfile.py를 작성하면 된다.

내가 테스트에 사용한 스크립트는 다음과 같다.

from locust import HttpUser, task, between, TaskSet
import random


class UserBehavior(TaskSet):
    def on_start(self):
        self.min_post_id = 56
        self.max_post_id = 59

        self.categories = ["기술", "일상", "리뷰"]

    @task(5)
    def home(self):
        self.client.get('/')

    @task(3)
    def get_post_detail(self):
        post_id = random.randint(self.min_post_id, self.max_post_id)
        self.client.get(f'/post/{post_id}')

    @task(2)
    def view_category(self):
        category = random.choice(self.categories)
        self.client.get(f'/?category={category}')

    @task(2)
    def search_posts(self):
        search_terms = ["파이썬", "테스트", "개발"]
        term = random.choice(search_terms)
        self.client.get(f'/?search={term}')

    @task(1)
    def view_about(self):
        self.client.get('/about')


class LocustUser(HttpUser):
    host = "https://locust.load-test.com"
    tasks = [UserBehavior]
    wait_time = between(3, 7)

    def on_start(self):
        pass

그리고 다음과 같은 설정 창에서 순서대로 목표 동시 접속자 수, 초당 생성할 새로운 사용자 수, 호스트를 설정해주면 되는데, 처음엔 최대 동접자를 100명, 초당 생성되는 사용자를 10명으로 15분 정도 테스트를 진행해봤다.

평균 응답시간 : 메인 페이지: 81ms, 게시글 상세: 62-72ms, 전체 평균: 77ms
에러율 : 0% (완벽한 안정성)
처리량 : 초당 14.01 요청 처리, 총 12,935 요청 성공적 처리
중간값(Median) : 대부분 64ms로 매우 양호

으로 상당히 나쁘지 않은 성능이 나왔다.

그 다음으로는 피크 부하를 테스트하기 위해서 동접자를 500명, 초당 생성되는 사용자를 50명으로 테스트를 진행했는데, 다음과 같은 결과가 나왔다.

전반적인 성능:
총 요청: 24,238건
평균 응답시간: 4.6초 (4,589ms), 99퍼센타일에서 응답시간이 급격히 증가 (18초), 최대 응답시간이 59초로 매우 높음
RPS(초당 요청): 47.85
실패율: 1.04% (252건), 모든 실패가 ReadTimeout 에러

10분 정도 만에 Timeout를 내뿜으면서 터지기 시작했고, 터지기 전에도 4.6초라는 기가막힌 response를 보여줬다.
그래서 캐싱 솔루션을 도입하거나, 정적파일을 파일로 내리거나, 쿼리 최적화를 해야할 거 같다는 생각이 들었는데, 곰곰히 생각해보니 개인 기술블로그, 그것도 주니어의 블로그에 동접자가 500명이나 모일 일이 있을까? 라는 생각이 들어, 지금은 더 급한 부분들을 처리하고 나중에 차차 개선하기로 했다.

근데 정말 아쉬운 점은 AWS의 T2.Micro에서의 성능 테스트 결과가 없기 때문에 객관적인 비교가 불가능하다는 점인데, 단순 스펙상으로 놓고 보면 현재 사용중인 A1.Flex와 6~8배 정도의 성능차이가 있기 때문에, 아마 동접자가 20~30명 정도만 되어도 response가 1초가 넘지 않았을까 싶다.

#Locust #부하테스트 #OCI #AWS

댓글 개

댓글을 작성하려면 로그인이 필요합니다