ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시스템 성능 테스트 하기! ( feat. Locust )
    Devops 2021. 8. 5. 16:49
    반응형

    https://locust.io/

     

    Locust - A modern load testing framework

    Example code A fundamental feature of Locust is that you describe all your test in Python code. No need for clunky UIs or bloated XML, just plain code. Select example Simple With HTML parsing Nested TaskSets

    locust.io

     

    오늘은 성능 테스트 툴에 대해서 정리 하려고 한다. 

    일단 성능에 대해서 전문가라고 할수 없고 부족한게 많기 때문에 그렇구나하고 참고하는 수준으로 정리 할 예정이다. 

    기존에 사용해본 툴은 처음에는 jmeter 그리고 ngrinder 두가지를 많이 사용해본것 같다. 아무래도 회사들이 두가지를 많이 사용 하고 있고 다니던 회사들도 저 두가지 툴에 대해서 전혀 거부감없는 회사들만 다녔다. 

    이번에 서비스를 하나 새로 만들면서 일정의 압박으로 테스트가 충분히 되지 않은 불안한 상태에서 오픈을 해야하는 상황이 처했고 개인적으로는 트래픽 테스트를 해야 그나마 오픈시 트래픽을 그래도 어느정도 버틸지 예상을 하고 미리 어느정도 대비를 할거라 생각하고 있었지만 .... 현실이 ㅠㅠ 

    아무튼 ! 그래서 동일하게 jmeter 와 ngrinder  를 설치 하려고 ! 하다가! 생각해보니 경험상 두녀석의 단점이 지금 급박한 나에게 과연 맞나 ? 라는 생각이 들었다. 물론 두녀석을 세팅하는게 얼마나 걸리냐고 하는 사람들도 있지만, 내경험상 둘다 설치하고 설정하고 하는것들이 공부(?) 를 해야 하는 부분들과 버전이 달라지면서 UI 가 바뀌면 또 힘들어지는 부분들이 있어서 그렇다면 대안을 찾자 !!! 

    그것이 가장위에 링크 해놓은 locust 이다. 일명 메뚜기 ! 라고 하며 심지어 테스트 버튼에는 센스있게 Swarm 이라고... 합치면 메뚜기떼 ? 서버에 메뚜기를 떼로 풀어놓겠다는 아주 참신한 의지(?) 로 보인다. 

    먼저 해야할것은 locust 를 설치 해야한다. 설치는 정말 아주 쉽다. 아래 명령어 한줄만 쳐주면 된다. 환경변수로 잡혀 있는거 에 따라 pip 를 사용해도 되고 pip3 를 별도로 사용중이라면 3을 붙여 줘야 한다. 

    pip install locust
    pip3 install locust

    파이썬과 pip 설치를 먼저하고 위에 명령어를 사용해야한다. 각자의 환경에 맞게 검색하면 아주 많이 나오기 때문에 여기선 생략한다. 

    그다음 해야하는건 코딩! 다른 테스트 툴과 다르게 위에 명령어를 보면 눈치 챌수 있지만 파이썬 기반의 테스트 툴이다. 그렇기 때문에 테스를 위하여 코딩을 해줘야 한다. 

    import json
    from locust import HttpUser,  task , between
    class sample(HttpUser):
    	wait_time = between(5, 15)
    	access_token = ""
    	def on_start(self):		
    		print("start test")		
    
    	def on_stop(self):		
    		print("end test")		
    
    	@task
    	def login(self):
    		data = {
    			"id" : "sample"
    			,"password" : "ssss"
    		}
    		self.client.post("/api/auth/sign-in", json.dumps(data), headers={"Content-Type" : "application/json"})
    
    	@task
    	def logout(self):
    		self.client.post("/api/auth/sign-out",
    						headers={"Content-Type" : "application/json"}
    		)

    이러면 단순하게 api 호출을 사용이 가능하다.  하나하나 설명하면 먼저 on_start , on_stop 은 최초 시작할때와 종료 될때 호출이 된다. 그렇게 때문에 뭔가 선처리 와 종료시 처리를 할경우 해당 부분에 로직을 추가하면 된다. 

    그리고 시작/종료와는 별개로 @task 로 선언된 녀석들은 실제 테스트 타겟이 되며 태스크 단위로 실행이 된다. task(1) 이런식으로 표현할경우 가중치를 줄수 있고 태스크별로 가중치 숫자에 따라 좀더 어떤걸 더 많이 실행 시킬지 정하는게 가능하고 

    seq_task 를 이용하면 순서대로 시나리오에 따라 실행이 가능 하다고 한다. 아주 깔끔하게 필요한 기능이고 더 다른기능들이 있는거 같지만 아직 확인하지 못해서 ... ^^ 

    이런 작성이 됬다면 ! 해당 파이썬 파일을 실행하면되는데 이때 명령어는 일반적인 python 실행 명령어가 아니라 아래와 같이 명령어를 사용해야한다. 

    locust -f ./main.py

    이렇게 할경우 디폴트로 port 는 8089 로 잡히며 실행 커맨드에서 -port 설정으로 다른포트로 사용도 가능하다 .

    http://localhost:8089 로 접속할 경우 웹브라우저를 기본 제공해주고 있으며 위와같은 화면을 확인할수 있다. 처음 1000 은 최종 트래픽을 유발할 유저수이다. 여기선 1000명으로 설정 하였다. 그다음 5 는 유저가 투입되는 시간이다. 지금은 5초마다 투입되게 되있다. 

    마지막 host 는 코드를 보면 api 에 대한 host 정보가 없는 uri 형태이다. 여기서 그 값을 받아서 사용 하는거 같다. 그렇기 때문에 당연히 필수 ! 그리고 다 작성했다면 가래!!!! 메뚜기떼 

    실행하면 이런 통계 페이지를 확인 할수 있다. 결과 통계를 아주 깔금하게 정리해놓았다. 간단하게 설명하면 총 진행한 요청수를 각 API 별로 보여주고  평균 수행시간, 실패건수 , RPS , 최소 , 최대 등을 다 보여준다. 필요한것만 딱! 놨다고 볼수 있다 .

    그리고 이런 성능툴에 빠질수없는 시각화 데이터인데 역시나 그냥 제공해준다

    첫번째, 총 요청에 대한 RPS 과 실패율에 대한 것들 위주 

    두번째, 응답시간과 95% percentile 

    세번째 , 투입된 유저수 

    저 세가지이외에 다른것들이 필요한다면 ... 음... 진지하게 다른것을 쓰는게 낫지 않을까 싶다. 개인적으로 이정도 통계여도 충분하다고 생각이 드는데 이건.. 아무래도 케바케 이다보니 고민포인트가 될수 있을거 같다 . 

    개인적으로 가장 좋았던 건 통계를 다운 받을수 있다는것이다. 

    Download Report 를 받으면 모든 데이터를 다 받을수 있다. 이때 Html 형식으로 제공 된다. CSV 데이터는 시각화된 데이터를 뺀 나머지를 각각 받을수 있다. 

    이번에 Locust 를 사용해보면서 느낀건 정말 .. 순식간에 간단하게 API 들을 등록해서 바로 사용하는데 까지 정말 얼마 안걸렸단것이고 투자한것에 비해 아주 많은 것들을 자동으로 제공해 준다는것이다. 

    그리고 아주 맘에 들었던것은 jmeter 에 비해 리소스 소모가 적다는것이다. 밴치마크를 한 블로그들이 있는데 메모리만 봤을때 약 1/3 수준으로 사용하는것 으로 보였다. 

    일반적인 성능 테스트 툴이 쓰레드를 생성해서 사용하는것에 비해 locust 는 이벤트 드리븐 방식으로 사용하기때문에 적은 리소스로도 많은 트래픽을 생상 할수 있고 , 가장 좋은건 분산하여 테스트가 가능하다는것이다. 

    ngrinder 기준으로 봤을때 서버를 좋은것으로 하나 만들어서 거기다 올리고 혼자 트래픽을 올린다. locust 는 일단 적당한 리소스의 인스턴스 혹은 장비를 다수 확보하여 별다른 설정없이 파이썬만 설치하여 사용이 가능 하기 때문에 여러 곳에서 트래픽을 발생시키기 아주 좋은 툴이 아닌가 싶다.  

     별다른 니즈가 없고 특별히 커스텀 해야하는것이 아니면!! 앞으로도 locust 를 잘 이용할 예정이다. 개발자다보니 복잡한 UI 를 공부해서 쓰는거보단! 코드레벨로 관리하는게 익숙할수 밖에 없는것 같다! 

    좋은 툴을 찾은거 같아 아주 만족 스럽다!

    반응형

    'Devops' 카테고리의 다른 글

    Git 문제 해결 - (1)  (0) 2022.09.05
    이메일 서버 만들기 ( feat. Aws SES )  (0) 2021.07.26
Designed by Tistory.