부하테스트

주수호·2021년 4월 16일
7

👊🖥️ 내 서비스는 얼마나 견딜 수 있을까?

  • 부하 테스트는 성능 테스트와 성능 튜닝이 어느 정도 완성되면 해당 소프트웨어 혹은 서비스를 대표할 수 있는 기능을 선정하여 해당 하드웨어 및 네트워크 환경에서 얼마나 많은 사용자가 동시에 사용할 수 있는지 테스트하는 것을 말한다.

  • 서비스가 로직적으로 테스트가 잘 진행되어져도, 실제 상황에 대해서 다량의 인원이 여러 요청을 하는 경우에 대한 부하의 한계를 파악하기가 힘들다.

  • 실제로 그러한 장애 상황이 오는 것을 대비하기 위해서라도 서비스의 부하테스트를 해보는 작업이 필요하다.

  1. 실제 내가 만든 게시글 작성 기능이 최대 몇명의 인원까지 버틸 수 있는지
  1. 현재 디비가 버틸 수 있는 트랜잭션의 양이 어느정도 인지
  1. 현재 프레임워크에서 처리속도를 유지 할 수 있는 요청양은 어디까지인지 등

이러한 부분에 대한 수치화를 통해서 확인을 통해서 내 서비스에 대해 장애상황을 시뮬레이션이 가능하다.




👊🖥️ 스트레스 테스트(StressTest)와 부하테스트(LoadTest)는 다르다.

성능테스트와 부하테스트의 의미를 명확하게 파악하면, 목적성에 맞는 성능테스트 방식을 적절하게 선택할 수 있다.

스트레스 테스트

  • CPU, RAM, DISK의 환경이 갖추어지지 않은 어플리케이션에 비정상적으로 높은 부하를 발생시켜 한계점을 테스트해보는 것을 말한다.

  • 실제로 이러한 부하가 발생시키면 VM서비스의 다운, 데이터의 소실 등의 시스템레벨의 오작동을 유발 시키는 것이 가능하다.

  • 이러한 결점과 결함점을 찾는 것을 목표로 스트레스 테스트가 진행되어진다.

  • 어디까지나 시스템레벨에서의 결함을 예상하는 수준으로 결과물을 파악하는 것이 중요하며, 실접속자가 발생시키는 부하량과는 매우 다른 케이스를 가질 수도 있다는 점을 유의한다.

부하 테스트

  • 적절한 부하를 발생시켜서 통계적으로써 의미있는 수치를 측정한다.

  • 장시간의 서비스 진행여부를 확인하는 신뢰성(reliability)

  • 실체 처리능력을 가늠하는 성능테스트(Performance)

  • "부하"라는 것은 매우 포괄적이므로, 부하테스트에 사용되어지는 부하의 모든 의미를 내포하는 것으로 이해하는 것이 좋다.





👊🖥️ 부하테스트를 위해 만들어진 도구

부하테스트를 할 수 있는 서비스는 굉장히 많다. 그 중에서 사용성이 좋고, 웹서버에 좀 더 익숙한 테스트 (http프로토콜)를 할 수 있는 도구 두가지가 있다.




jmeter

아파치에서 제공하는 어플리케이션으로, java로 이루어진 오픈소스의 성능테스트 도구

다른 테스트 도구들 보다 좀 더 웹서버 성능테스트에 특화 되어져 있다.

테스트케이스를 스크립트화하는 기능이 따로 있진 않지만, 레코딩 기능을 지원해주고, ui기능을 통해 다양한 부하테스트를 시도하는 것이 가능

Jmeter의 장점

  • 복잡하고 디테일한 부하테스트가 가능하고, 다양한 프로토콜을 혼용해서 사용이 가능하다

  • 기능적으로 스크립트 레코딩(script recording)이 가능하다

  • 램프업 패턴(초기 서비스의 사용율이 비주기적으로 등락하는 현상)에 대한 시뮬레이션이 가능하다

  • UI를 통한 테스트 프로그램의 작성이 가능하기 때문에, locust보다 언어의 요구사항이 낮다(하지만 사용성은 다양한 기능을 제공해 주는 만큼 더 어렵다)




locust

"메뚜기떼" 라는 뜻을 가지고 있는 해당 어플리케이션은 python스크립트 코드로 테스트를 할 수 있는 어플리케이션. python pip 패키지 관리자를 통해 정말 간단하게 설치가 가능하며,

"부하 테스트를 스크립트화"가 가능한 것이 가장 큰 메리트.

locust의 장점

  • 수행 스크립트 (부하테스트용)를 빠르게 작성해서 테스트가 가능

  • 버젼관리에 함께 해당 스크립트를 관리하면서, 다른 환경에서의 부하테스트도 편하게 할 수 있다

  • 부수적인 GUI환경이 없어도 되기에, 테스트하기에 최소한의 리소스가 소요된다

  • 로컬환경에서 천명상당의 유저의 테스트를 외적인 자원의 필요없이 가능하다





👊🖥️ 두 도구의 차이점 한번에 보기

JmeterLocust
테스트 작성 속도느리다빠르다
지원 프로토콜HTTP, IMAP, FTP등 서비스에 필요한 다양한 프로토콜로 테스트가 가능HTTP를 기본적으로 지원하지만 외부 플러그인을 통해 다른 프로토콜 테스트도 충분히 가능하다
코드를 통한 테스트 작성작성이 가능하지만, 매우 복잡하고 참고 문서가 없다파이썬기반으로 스크립트 작성이 용이하고, 형상관리하기에도 편리하다
부하테스트 모니터링모니터링 지원모니터링 지원
최대 쓰레드 수몇천개 (하지만 리소스 제약이 매우 심함)몇천개 (코드레벨에서 쓰레드 생성)




기본 사용 방법 익히기

jmeter

설치 : jdk 1.3이상의 버젼이 필요하며, 공식사이트에서 설치가 가능하다.
http://jmeter.apache.org/download_jmeter.cgi

기본 개념 설명

Thread Group : 쓰레드 다발의 묶음 단위를 나타냄. 각각의 쓰레드는 하나의 유저 혹은 클라이언트레벨의 활동을 담당하는 역할

Samplers : 쓰레드가 request하는 쓰레드의 요청 단위 였다면, sampler는 jmeter에서 제공하는 다양한 프로토콜 중 어떤 프로토콜을 통하여 request를 할지 결정하는 역할

  • FTP sampler : 파일 업로드 / 다운로드 등에 대한 요청 테스트 가능
  • HTTP sampler : 일반적인 http프로토콜 통신에 대한 요청 테스트 가능
  • JDBC sampler : JDBC(Java Database Connectivity) 자바레벨의 디비커넥션 API를 뜻하며 해당 API레벨의 요청 테스트 가능
  • SMTP sampler : 이메일 송신에 대한 요청 테스트 가능

Listeners : 위 두가지 요소를 조합하여 실행한 결과물에 대해서 모니터링 혹은 수치화되어진 데이터를 보여주는 역할

Configuration : 요청시에 기본 세팅 환경을 맞춰 놓을 수 있다. (http 요청시 기본 인증 쿠키 값 세팅, 다양한 파라미터들로 요청을 하기 위한 csv파일 세팅)





locust

설치 : pip를 통해서 간단하게 설치가 가능하다.

pip install locust

locust에서 제공하는 상속 함수 알아보기
제공하는 함수에 대해서 친절히 정리해주신 사이트
http://engineersinkorea.com/2020/01/19/writing-a-locustfile/

적용 프로세스 설명

  1. locust 클래스를 import하여, 제공하는 클래스와 함수들을 활용하여 테스트 스크립트를 작성한다. (해당 스크립트에서, 하나의 유저가 요청하는 작업, 유저의 시간에 따른 증감수 등에 대해서 다양한 커스텀이 가능하다)

  2. 스크립트가 준비가 되어졌다면, 실제 부하스크립트를 실행 및 모니터링 할 수 있는 웹콘솔로 접속한다.

  3. 몇명의 유저로 테스트 할 것 인지(Number of total Users to Simulate), 초단위로 클라이언트를 늘려나가는 비율(Hatch rate), 그리고 요청할 대상 서버(Host)에 값을 입력하면 테스트 준비가 끝난다





👊🖥️ 스펙업의 두가지 방식 :: ScaleOut, ScaleUp

SaleOut

  • 하나의 장비에서 처리하던 일을 여러 장비에 나눠서 처리하는 것

  • 큰 스펙의 서버를 사용하는 것이 아닌 유사한 스펙의 같은 처리를 하는 서버를 여러대 생성하는 것이기에 비용이 상대적으로 낮음

  • 여러대의 서버가 늘어날 수록 관리편의성이 떨어짐(해당 이슈를 보완하기 위해서 Kubernetes의 스케일링이 존재하게 됨)

  • 여러대의 서버에 분산적으로 처리가 되어지기 때문에 장애의 확률이 단일서버보다 낮음

ScaleUp

  • 하드웨어적인 물리적 장비 스펙을 올리는 것

  • 스펙이 높아지면 높아질수록 비용이 상당하게 증가하게 되고, 물리적인 스펙의 한계 때문에 스펙향상의 한계가 있다

  • 하나의 서버만을 관리하면 되기 때문에 관리가 용이

  • 내부적인 로드 혹은 장애현상에 대해서 근본적인 해결을 못 할 확률이 크다





유저의 유입량 제어 솔루션 :: 넷퍼넬(NetFUNNEL)

NetFUNNEL은 실시간으로 서비스 상황에 맞게 User Transaction을 제어하여, 가용한 IT 자원으로, 최적의 서비스(성능)을 보장하는 성능제어 솔루션이다.


실제 넷퍼넬 적용 케이스






reference.

[jmeter vs locust]
https://azevedorafaela.com/2020/05/23/load-tests-locust-vs-jmeter/

[jmeter tutorial]
https://www.edureka.co/blog/jmeter-tutorial/

[우아한 형제들 :: 부하테스트 후기]
https://woowabros.github.io/experience/2018/05/08/billing-performance_test_experience.html

[jmeter를 다루는 상세한 방법]
https://12bme.tistory.com/503

profile
항상 준비하는 엔지니어

0개의 댓글