1.  Locust란?

 

" Python 스크립트 언어로 구현하는 서버 부하테스트 툴 "

 

즉, 내가 만든 서버에 수백, 수천의 동시사용자가 들어왔을 때 어떤 일이 벌어지는지를 테스트할 수 있는 툴이다.

파이썬 언어로 테스트 시나리오를 간편하게 작성할 수 있고, 결과를 Locust 웹으로 확인할 수 있다.

 

 

 

이 튜토리얼은 '서버 테스트'이기 때문에 서버가 이미 만들어져 있고 정상적으로 동작한다는 것을 가정합니다.

 

url로 접속할 것이기 때문에 서버 언어는 python이 아니어도 관계 없다.

필자의 서버는 localhost로 실행하였다

 

 


 

2.  설치

 

우선 파이썬 프로젝트를 하나 준비하자.

서버가 fastapi처럼 python3 언어를 사용한다면 서버 안에 설치해도 관계없다.

 

해당 파이썬 프로젝트 루트 폴더에서 다음 명령을 입력한다.

 

pip install locust

 

잘 설치가 되었는지 확인하자.

 

locust -V

locust 2.8.6

 

locust 버전 확인을 했을 때 위와 같이 잘 뜨면 설치가 완료된 것이다.

 

 

 

 


 

3.  locustfile.py 작성하기

 

 

locustfile.py는 locust를 실행했을 때 별다른 옵션을 주지 않으면 자동으로 실행시켜주는 파일이다.

우선, 다음과 같이 작성해보자

 

from locust import HttpUser, task

class ServerTest(HttpUser):
	@task
    def api_test(self):
    	self.client.get("/hello")
        self.client.get("/world")

 

이제 코드를 한 줄씩 살펴보자.

 

locust에서 알아야 할 가장 중요한 개념은 2개가 있다.

User class Task다.

 

 

class ServerTest(HttpUser):

 

User class는 한 명의 유저를 나타낸다.

Locust는 각각의 유저를 생성하기 위해 해당 클래스의 인스턴스를 생성한다.

즉, 유저가 만약 3명이라면 작성된 User class의 인스턴스를 3개 생성하게 되는 것이다.

이 클래스 안에는  request를 보내고, response를 받아 print를 하는 등의 테스트 스크립트가 작성된다.

 

HttpUser는  Http 프로토콜을 사용하는 User class로 가장 보편적으로 사용되는 클래스이다.

HttpUser를 내가 만든 클래스에서 상속받으면 클래스가 완성된다.

 

 

@task
def api_test(self):

 

Task는 유저가 실행하는 함수이다.

User class는 green thread(실제 스레드를 모방한 가짜 스레드)를 통해 실행된다.

task가 여러개 있을 때, 유저는 무작위로 task를 선택하여 실행하고 다음 task를 다시 선택해 실행하는 방식으로 테스트가 진행된다.

 

@task 는 task를 추가하는 가장 간단한 방법이다. 함수 위에 선언해주면 된다.

 

 

self.client.get("/hello")
self.client.get("/world")

 

client는 파이썬 라이브러리인 requests.Sessions의 서브클래스인 HttpSession의 인스턴스이다.

 HttpSession이기 때문에 Http의 모든 메서드를 사용할 수 있다.(get, post, delete...)

requests.Session과 동일하게 활용하면 된다.

url은 호스트 부분을 제외한 나머지 부분을 적어주면 된다. (http://localhost:8000/hello 라고 했을 때 /hello 만 작성한다.)

 

 


 

4.  실행하기

 

실행은 터미널에 locust라고만 작성해주면 된다.

(서버는 이미 실행중이어야 한다)

 

locust

 

locust를 실행하면 링크가 하나 뜨게된다.

"http://localhost:8089"로 접속하면 locust에서 제공하는 테스트 웹 인터페이스에 접속할 수 있다.

(localhost는 0.0.0.0과 같은 의미이다)

 

 

접속해보면 위와 같은 화면이 뜬다. 하나씩 살펴보자

 

Number of users는 총 동시사용자 수를 의미한다.

즉, 만약 내가 1000이라고 작성하면 테스트에는 총 1000명의 동시사용자가 서버에 접속하게 된다.

 

Spawn rate는 1초 당 추가로 접속할 사용자의 수이다.

만약 총 동시사용자가 1000명이고 초당 100명으로 설정했다면 1초에 100명, 2초에 200명... 이렇게 총 동시사용자수에 도달하기까지 10초가 걸릴 것이다.

 

Host는 내 서버의 host url이다. http://localhost:8000 과 같이 작성해주면 된다.

호스트를 잘못 작성하면 에러가 뜨니 제대로 작성했는지 확인하자.

 

 

 

접속한 후 화면을 살펴보자

 

 

아까 get으로  task에 작성한 url이 뜨는 것을 볼 수 있다.

Median, Average, Min 등은 각 요청에 대한 응답 중간값, 평균, 최솟값 등을 의미한다.

 

위에 툴바에 edit 버튼을 누르면 실행 중간에라도 총 동시사용자 수나 초당 사용자 수를 변경할 수 있다.

 

 

차트에서는 이렇게 테스트 현황을 실시간으로 확인할 수 있다.

이때, 사용자는 아까 설정한 초당 추가사용자수만큼 증가하고 있는 것이다. 

 

첫번째 차트는 RPS(current Requests Per Seconds)와 초당 Failures를 보여준다. 

두번째 차트는 Median Response Time과 95% percentile를 보여준다.

캡쳐하지는 않았지만 스크롤 아래에 세번째 차트도 있는데, 증가하는 유저수 추이를 보여준다.

 

탭에는 발생한 이슈를 보여주는 Failures, 가중치를 둔 task들간의 current rate 등도 있다.

 

 


 

 

본 포스트는 제가 공부하는 과정에서 작성하였습니다. 정정사항 댓글은 언제나 환영합니다!

반응형

+ Recent posts