[Locust] 웹 성능 테스트를 해보자
1. 웹 페이지 성능 테스트란?
프로젝트로 웹 페이지를 만들었어도 그 웹페이지에 동시에 수천, 수만명이 접속하는 일은 거의 없습니다. 따라서 나는 수천, 수만명이 들어와도 끄떡없게 백엔드를 잘 구축해놨다고 생각을 하는데 들어오지를 않으니 내가 만든 웹 페이지가 정말 성능이 뛰어난 페이지인지 확인하기가 일반적으로는 쉽지 않습니다.
다행히도 이러한 성능 테스트를 할 수 있는 다양한 방법이 있고 오늘은 그 중 Locust라는 것을 이용한 성능 테스트를 해볼 예정입니다.
일반적으로 게임서버의 경우 서버당 최대 가용 접속자 200,000, 서버당 예상 동시 접속자 10,000을 요구하고
커뮤니티(인스타, 페북 등)은 최대 가용 접속자 20,000, 예상 동시 접속자 1,000
그 외 일반적인 웹사이트는 최대 가용 접속자 4,000, 예상 동시 접속자 200 정도의 성능을 요구합니다
제가 만든 프로젝트는 과연 얼마나 버틸 수 있을지 궁금하네요 여러분들도 만들어 둔 웹사이트가 있다면 저와 같이 이번 기회에 성능 테스트를 해보시죠
2. Locust 설치하기
(https://docs.locust.io/en/stable/installation.html)
오늘 사용할 Locust(https://locust.io/)라는 도구는 파이썬 라이브러리입니다.
따라서 보통 pip3를 이용해 설치를 하는데요
저는 자바 밖에 몰라서 설치부터 애를 먹었습니다
일단 cmd창을 관리자 권한으로 켜봅시다
만약 파이썬이 안깔려있다면 일단 파이썬을 까시고 파이썬이 깔려있다면
cmd 창에 pip3를 입력합니다
파이썬 버전이 2.xx버전인 경우 pip3대신 pip를 입력해보세요
이렇게 바로 나오면 다음 단계로 가면 되는데 아닐 확률이 높습니다
'pip3'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.
이 문구를 만나셨다면
'pip'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.해결 : 네이버 블로그 (naver.com)
위 링크에서 해결법을 잘 설명해줍니다 위에서 해결하고 다시 pip3를 써봅니다
그래도 안된다면
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
를 써보시고 "curl https 접속시, "해당 함수에서 인증서에 대한 파기 여부를 검사하지 못했습니다."라는 에러가 뜬다면
curl -k https://bootstrap.pypa.io/get-pip.py -o get-pip.py
를 써보시면 됩니다.
이제 진짜로 locust를 설치해 봅시다
cmd 창에 아래 명령어를 입력합니다
pip3 install locust
설치가 잘 되었는지 확인 하기 위해 아래 명령어를 입력합니다
locust -V
또는
python -m locust -V
이렇게 뜨면 성공입니다
(-v 소문자가아니라 -V 대문자입니다 저는 바보같이 이걸로 20분을 잡아먹었습니다)
Locust 설치는 끝났고 이제 성능 테스트를 해봅시다
3. 성능 테스트 전 체크사항
자 이제 성능 테스트를 할 건데요 그 전에 몇가지 과정을 거쳐야 합니다
어떤 성능 테스트를 하실껀가요?
1. 테스트 목적을 정해야 합니다.
맨 위에서 웹사이트별로 서버당 최대 가용 접속자 몇명, 서버당 예상 동시 접속자 몇명씩을 성능으로 요구한다 이런 말을 했었는데요 이렇게 이 성능 테스트가 최대 몇명을 가용할 수 있는지 테스트 하는 경우가 있을 수 있고 예상 동시 접속자를 몇명까지 무리없이 돌릴 수 있는지를 테스트 할 수도 있습니다.
어떤 페이지를 테스트 할까요?
2. 테스트 대상을 정해야 합니다
내 웹사이트에서 어떤 페이지를 테스트 할 건지를 정해야 합니다. 홈페이지가 될 수도 있고 아니면 선착순 이벤트를 할 때 응모하는 페이지가 될 수도 있겠네요
선착순 이벤트 같은 테스트 시나리오도 정하면 좋습니다.
어떤 환경에서 테스트 할까요?
3. 테스트 환경을 구축해야 합니다.
테스트를 할 수 있는 서버를 준비해야겠죠 실제 사용하는 서버와 비슷한 서버면 당연히 좋습니다
테스트는 수행했는데 근데 이제 뭐함?
4. 테스트를 수행하고 결과를 정리하고 분석합시다
성능 테스트를 하고 성능이 잘 나온다 그래프 이쁘네 하고 끝날 거라면 성능 테스트를 하는 이유가 없습니다. 테스트를 수행한 결과를 정리하고 분석함으로써 서비스를 개선을 하거나 다음 프로젝트에서 더 좋은 성능을 내기 위해서 어떻게 해야할지 고민을 해봐야 이 성능 테스트가 유의미 할 것 입니다.
사실 오늘 실습은 한 번 locust로 테스트를 돌려보는게 끝이라 위에 과정이 크게 중요하지는 않지만 앞으로 성능 테스트 하실때는 중요한 부분 입니다.
4. 성능 테스트 실습
자 이제 진짜로 실습을 해봅시다
먼저 우리는 locustfile.py 가 필요합니다
공식문서에서 locustfile.py에 들어갈 코드를 제공하고 있습니다.
Getting started — Locust 2.14.0 documentation
from locust import HttpUser, task
class HelloWorldUser(HttpUser):
@task
def hello_world(self):
self.client.get("/hello")
self.client.get("/world")
지금은 이것만 있으면 됩니다
일단 메모장이나 vscode를 이용하여 locustfile.py 라는 빈 파일을 만들고(파일 이름 꼭 locustfile.py로 해야됩니다) 저 코드를 붙여 넣습니다
그리고 이 파일은 아무데나 놓아도 되고요 cmd에서 이 파일이 있는 디렉토리로 cd 해줍니다
locustfile.py가 있는 디렉토리에서 locust를 입력합니다
저는 바탕화면의 소스코드라는 폴더를 만들어 그 폴더에 locustfile.py를 넣었습니다
다음과 같이 나오면 성공이고 기본적으로 localhost:8089로 locust 대시보드를 띄워줍니다
크롬을 켜고 localhost:8089로 들어가봅시다
이런 화면이 나올텐데요
Number of users는 최대 몇 명까지 들어오게 할 것인가
Spawn rate는 유저들이 들어오는 속도입니다
Spawn rate가 1이면 1초에 1명씩 추가로 들어온다는 것입니다
Host는 테스트할 페이지입니다
만약 프로젝트 서버를 지금 돌리고 있다면 그 url을 넣으시고
없다면 지금은 구글이나 네이버 주소를 넣어봅시다
현재 설정
Number of users : 30
Spawn rate : 1
Host : http://www.google.com
위 설정으로 돌린 화면입니다
뭔가 숫자가 막 올라가고 있습니다 각각 어떤 것을 의미하는지는 저도 공부가 필요합니다
Charts 탭을 누르면 차트도 나옵니다
그런데 위에 빨간 그래프는 Failures/s인데 뭔가 계속 실패를 하고 있네요?
눈치 채신 분도 있겠지만 그래프 사진을 보시면 Type에 GET , Name에 /hello 이런식으로 api 요청을 보내고 있는 것을 알 수 있습니다.
구글 홈페이지에는 GET으로 /hello 요청과 /world 요청을 보내도 답이 있을리가 없으니 failures가 뜨는 것 입니다
위에서 작성한 locustfile.py을 수정하여 어떤 요청을 보낼지를 설정 할 수 있습니다.
저는 제가 만든 프로젝트를 간단히 테스트 해보기 위해 홈페이지에 GET으로 / <- 요청을 보내는 locustfile.py를 만들겠습니다.
from locust import HttpUser, task
class HelloWorldUser(HttpUser):
@task
def hello_world(self):
self.client.get("/")
더 간단하죠?
더 자세한 locustfile 작성법은 아래 링크에서 알려줍니다
Writing a locustfile — Locust 2.14.0 documentation
잠깐 살펴보니 로그인하여 테스트 하는 방법도 있고 다양한 테스트가 가능합니다 이거는 직접 찾아보세요!
locustfile.py를 수정하고 다시 locust를 돌려본 결과입니다
이번에 저는 구글 대신 제 프로젝트를 localhost:8080에 올리고 그 서버를 테스트 해봤습니다
Fails가 0이네요 그래프도 살펴볼까요?
제 홈페이지는 다행히 30명까지는 어찌어찌 Fail이 안뜨고 잘 버티나 보네요
그래프를 분석하는 법도 공부하시면 도움이 될 겁니다
심심해서 failure가 뜰때까지 피크이용자를 늘리고 초당 들어오는 사람도 늘려봤는데요
피크 이용자를 20000명까지 늘리고 초당 500명씩 들어오게 하자 드디어 fail이 떴습니다
중간 중간 그래프가 튀는 것도 있고 뭔가 저런 급격한 변화도 어떻게 해석이 되겠죠?
저는 첫 페이지가 로그인 페이지라 서버에 별 부담이 안가서 20000명이 되어야 fail이 뜬 것 같습니다
사실 저도 어떻게 해석이 되는지는 잘몰라서 더 공부해봐야 합니다 이미 서버가 터진것일 수도 있어요
5. 마치며
locust를 설치해서 간단한 실습까지 하고 그래프까지 구경해봤습니다. locustfile.py 설정을 이리저리 바꿔서 여러 테스트도 해보시고 결과 분석도 공부해보시면 앞으로 성능 테스트 하실 때 큰 도움이 되겠네요