동시성 테스트 및 부하테스트 with JMeter

Jongmyung Choi·2023년 10월 16일
0
post-thumbnail
post-custom-banner

개요

동시성 문제 또는 성능 문제를 테스트 하기 위해서 JMeter로 부하테스트를 진행하였다.

다양한 테스트 도구가 있지만 동시접속자에 대한 테스트를 하기 적합하여 JMeter를 선택했다.

100명의 사용자가 동시에 송금 버튼을 누르는 상황을 테스트 해보고 싶었는데
JMeter는 스크립트를 사용하여 이러한 환경을 구축하고 그 결과를 간편하게 볼 수 있는 기능을 제공한다.


목표

  1. 성능테스트가 무엇인지 학습하고
  2. JMeter를 사용하여 성능테스트를 진행하는 방법을 알아보자.
  3. 나온 결과를 바탕으로 병목 지점을 파악하거나 문제를 파악하자.

성능테스트

성능테스트란?

성능 테스트(Performance Testing)는 소프트웨어, 애플리케이션 또는 시스템이 특정 부하 조건 하에서 얼마나 효과적으로 작동하는지 평가하는 테스트 과정이다.

성능 테스트를 통해서 응답시간, 처리량, 병목지점 등을 파악할 수 있고 이를 통해서 얻은 정보로 문제를 확인하고 이를 개선하거나 보완할 수 있다.

종류

  • load test: 시스템이 예상되는 최대 작업량을 처리할 수 있는지 평가한다.
  • stress test: 시스템의 한계와 붕괴점을 찾기 위해 과도한 부하를 가하는 테스트
  • capacity test: 시스템의 최대 용량, 즉 동시 사용자 수나 트랜잭션 수를 결정하는 테스트
  • soak test: 시스템이 다른 애플리케이션의 부하가 있는 환경에서 어떻게 수행되는지를 평가한다.
  • spike test: 시스템이 사용자 요청에 얼마나 빠르게 응답할 수 있는지 평가하는 테스트입니다.

여기서 나는 추가로 동시성 문제 파악을 위한 동시성 테스트의 목적으로도 진행하였다.

부하테스트란?

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

부하테스트는 성능테스트의 일부로 시스템의 처리량과 최대 성능 한계를 결정하는 데 초점을 맞춘다고 생각하면 된다.

성능테스트 진행

설치

// brew 로 jmeter 설치
$ brew search jmeter

// jmeter 실행.
$ open /opt/homebrew/bin/Jmeter

실행

1. Thread Group 생성


🧭 Test Plan → Add → Threads (Users) → Thread Group

  • Number of Thread(유저수) : 100명
  • Ramp-up period(스레드당 생성시간) : 0.1초
  • Loop Count(반복 횟수) : 1번

먼저 Thread Group을 생성해주어야 하는데 나는 다음과 같이 설정하였다.
이렇게 하면 100명의 유저가 0.1초안에 요청을 보낸다는 것이다.
나는 동시접속자 100명에 대한 성능을 측정하고 싶었기 때문에 이렇게 설정하였다.

2. Http Request 생성


🧭 Thread Group → Add → Config Element → HTTP Request Defaults

Protocol : http 또는 https 입력
Server Name or IP : Host 또는 IP 입력
Port Number : Port 번호 입력
Http Method : 요청 메소드
Path : Path 입력
Parameter , Body : Parmeter, Body 값 입력

다음 항목들을 입력하여 Http Request를 생성한다.

3. Http Header 생성


🧭 Http Request → Add → Config → Config Element → Http Header Manager

JWT 토큰을 위해 헤더를 설정해주었다.
POST 요청의 경우 content-type : application/json 헤더를 추가해주어야 한다.

4. Listner 생성


🧭 Thread Group → Add → Listener → View Result Tree

결과를 확인할 수 있는 Listener를 생성한다.
나는 Summary Report와 View Result를 추가해주었다.

5. 실행


상단에 화살표를 클릭하여 실행할 수 있다.

6. 결과 확인

Sampler Result에는 성공/실패 여부와 응답시간, Size, Response code 등을 볼 수 있다.

Summary Report 구성

  • Label : HTTP Request Sampler에서 설정한 Name
  • #Samples : 호출 건수
  • Average/Min/Max/Std.Dev. : 응답시간 통계 (1/1000초 단위로 표시됨)
  • Error% : 오류율
  • Throughput : 단위 시간당 처리량(TPS)

동시성 문제


이렇게 100번의 동시요청 테스트를 진행해봤는데 DB에는 다음과 같이 저장되어 있었다.
전부다 성공적으로 처리되었지만 2 에서 1로 100번의 1원 송금이 정상적으로 이루어지지 않은걸 볼 수 있다.

동시성 문제에 대한 해결이 필요할 것으로 보인다.

profile
총명한 개발자
post-custom-banner

0개의 댓글