본문 바로가기
AWS

[AWS] Locust를 이용한 ec2 부하테스트

by 당코 2023. 12. 8.

현재 사용 중인 ec2의 cpu 사용률, credit balacne 사용량 등을 기준으로 적절한 타입을 추천해 주는 사이드 프로젝트를 진행하고 있다.

ec2의 cpu 사용률과 credit balance에 대한 데이터를 쌓기 위해 locust로 부하테스트를 진행하였다.

 

ec2 인스턴스 생성

ec2 인스턴스는 t타입, m타입, c타입에 대해 테스트하기 위해 각각 1개씩 생성하였다.

  • t3.small
  • m5.large
  • c5.large

 

인스턴스에 연결

ec2에 직접 접근하기 위해 SSH 접속 방식을 사용하였다.

  • 프라이빗 키가 있는 파일의 위치로 이동한다.
  • 필요한 경우 chmod 400 [프라이빗 키] 명령어를 통해 프라이빗 키를 공개적으로 볼 수 없게 한다.
  • ssh 명령어를 통해 ec2 인스턴스에 연결한다

 

Docker 컨테이너 실행

1. sudo 명령어를 통해 도커를 ec2에 설치한다.

sudo yum install docker -y

2. 시스템에서 Docker 서비스를 시작한다.

sudo systemctl start docker

3. Docker 컨테이너를 백그라운드에서 실행하고 8080 포트와 연결한다.

sudo docker run --name cozserver -d -p 8080:8080 sebcontents/cozserver:1.0

 

 

Locust 부하 스크립트

from locust import HttpUser, task, LoadTestShape
from datetime import datetime
import time

class MyUser(HttpUser):
    @task
    def my_task(self):
        self.client.get("/")
        time.sleep(1)

class MyCustomShape(LoadTestShape):
    spike_duration = 60 * 5  # 5분마다 스파이크
    idle_duration = 60 * 5  # 5분마다 정상
    total_duration = 60 * 10  # 총 운용 시간

    spike_users = 600  # 스파이크 시 유저의 수
    idle_users = 10  # 정상일 시 유저의 수

    spawn_rate = 100  # 1초당 늘어나는 유저의 수

    # 아무 시간을 기준으로 시간 계산
    start_time_str = "2023-12-05 20:00:00"
    start_time = datetime.strptime(start_time_str, "%Y-%m-%d %H:%M:%S").timestamp()

    def tick(self):
        run_time = time.time() - self.start_time
        cycle_time = run_time % self.total_duration
        if cycle_time < self.spike_duration:
            # Return a spike
            return (self.spike_users, self.spawn_rate)
        else:
            # Return idle time
            return (self.idle_users, self.spawn_rate)

10분 단위로 5분 동안은 사용자를 늘려 부하를 많이 주고, 나머지 5분은 부하를 줄이는 방식으로 테스트하였다.

사용자의 수는 최소 10명, 최대 600명으로 설정하였고 사용자의 수가 바뀔 때는 1초당 100명의 사용자가 늘어나게 하였다.

@Task에서 get요청을 보낸 뒤에 time.sleep(1)을 설정한 것을 볼 수 있다. sleep 함수를 설정하지 않으면 get 요청을 매우 빠르게 호출하게 되어 CPU 사용률이 항상 높게 유지가 되고 유의미한 결과를 볼 수 없어지기 때문에 추가해 주었다.

 

백그라운드에서 부하테스트 실행

부하테스트를 계속 실행하기 위해선는 백그라운드에서 실행시켜야 한다.

nohup locust -f burst30.py --host=http://localhost:8080 --headless > my_output.txt 

nohup 명령어를 통해 백그라운드에서 프로세스가 실행될 수 있게 하였다.

테스트할 대상 호스트의 URL을 8080 포트로 지정하고, --headless 옵션을 통해 GUI 없이 실행하도록 설정했다.

표준 출력은 my_output.txt에 저장하여 로그를 확인할 수 있다.

tail -f my_output.txt

tail -f 명령어를 통해 표준 출력을 실시간으로 볼 수 있다.

 

 

사용자가 10명일 때는 req/s가 10으로 상당히 낮은 것을 볼 수 있다.

하지만 사용자가 증가하여 600명이 되면 req/s가 440 이상으로 유지되어 부하를 주게 된다.

 

인스턴스 모니터링

t타입은 credit balance를 시간마다 자동으로 생성하고, 특정 사용률 이상이 되면 credit balance를 소모한다.

t3.small의 최대 credit balance는 288이지만, credit balance를 모두 사용하여 0에 수렴하게 부하를 주었다.

 

최종적으로 CloudWatch에서 3가지 인스턴스의 CPU 사용량을 비교해 보았다.

 

'AWS' 카테고리의 다른 글

[AWS] Elastic Beanstalk 상태 unknown 오류 해결방법  (10) 2023.05.18