Jmeter를 사용한 성능 테스트

제이미터란?

Apache에서 제공하는 애플리케이션이자 오픈 소스 Java 기반 성능 테스트 도구입니다.

다른 테스트 도구보다 웹 서버 성능 테스트에 특화되어 있습니다.

테스트 케이스를 스크립팅하는 기능은 없지만 기록 기능을 지원하며 ui 기능을 통해 다양한 부하 테스트를 시도할 수 있습니다.

Jmeter의 장점

  • 복잡하고 세밀한 스트레스 테스트가 가능하며, 서로 다른 프로토콜을 혼용하여 사용할 수 있습니다.
  • 기능적으로 스크립트 기록 가능
  • UI를 통해 테스트 프로그램 작성이 가능하기 때문에 언어 요구 사항은 Grasshopper보다 적습니다(다만 기능 노출이 달라 사용성이 더 어렵습니다).

주위

  • 맥 m1
  • 자바11

설치

1. Java(Java 8 이상이어야 함)를 설치한 후 brew로 jmeter를 설치합니다.

brew install jmeter

2. jmeter 실행

open /opt/homebrew/bin/Jmeter

터미널에서 /usr/local/bin/jmeter를 열었는데 /usr/local/bin/jmeter 파일이 존재하지 않습니다. 오류가 발생했습니다. Intel 칩은 작동하지만 m1은 다른 방법을 사용합니다.

기본 사상

주제 그룹:

스레드 번들의 번들 단위를 나타냅니다. 각 스레드는 사용자 또는 클라이언트 수준 활동을 담당합니다.

샘플러: 스레드가 요청 스레드의 요청 엔터티인 경우 샘플러는 jmeter에서 제공하는 다양한 프로토콜 중 요청을 수행하는 프로토콜을 결정하는 역할을 합니다.

  • FTP 샘플러: 파일 업로드/다운로드 등에 대한 요청을 테스트할 수 있습니다.
  • HTTP Sampler: 일반적인 HTTP 프로토콜 통신에 대한 요청 테스트 가능
  • JDBC Sampler: JDBC(Java Database Connectivity)는 Java 수준의 DB 연결 API를 말하며 API 수준의 요청을 테스트할 수 있습니다.
  • SMTP 샘플러: 이메일 전송 요청을 테스트하는 기능

청취자: 위의 두 가지 요소를 결합한 결과에 대한 정량화된 데이터를 모니터링하거나 표시하는 역할

건설: 기본 설정은 요청 시 조정할 수 있습니다. (http 요청 시 인증을 위한 기본 쿠키 값 설정, 매개 변수가 다른 요청을 위한 csv 파일 설정)

시나리오(로컬 테스트)

user_seq=51 요청이 있는 사용자는 api/v1/user-challenges url을 초당 100개의 스레드로 5번 가져옵니다.

위치 1. 이전에 참여했던 모든 사용자 챌린지를 살펴보십시오.

→Join을 사용하지 않는 경우(N+1 문제 발생)

@Override
    public List<UserChallenge> findAllByUserSeq(
            Long userSeq,
            Integer pageSize,
            Long prevLastUserChallengeSeq
    ){
        return from(qUserChallenge)
                        .innerJoin(qUserChallenge.challenge, qChallenge)
                        .fetchJoin()
                        .orderBy(qUserChallenge.startDate.asc())
                        .where(predicates)
                        .limit(pageSize)
                        .fetch()
                        .stream()
                        .distinct()
                        .collect(Collectors.toList());
	}

위치 2. 참가한 모든 사용자 챌린지 보기

→Join을 사용하는 경우(N+1 문제 해결)

@Override
    public List<UserChallenge> findAllByUserSeq(
            Long userSeq,
            Integer pageSize,
            Long prevLastUserChallengeSeq
    ){
            return from(qUserChallenge)
                            .leftJoin(qUserChallenge.challenge, qChallenge).fetchJoin()
                            .leftJoin(qChallenge.challengeRecord, qChallengeRecord).fetchJoin()
                            .orderBy(qUserChallenge.startDate.asc())
                            .where(predicates)
                            .limit(pageSize)
                            .fetch()
                            .stream()
                            .distinct()
                            .collect(Collectors.toList());
	}

하나. 스레드 그룹 생성

테스트 계획→추가→트레드→스레드 그룹


  • 스레드 수: 테스트할 스레드 수(사용자 수)
  • 램프 업 시간: 모든 스레드가 실행되는 데 걸리는 시간
  • 루프 수: 스레드가 몇 번 실행되는지, 무한은 무한 루프입니다.

스레드 수: 100

시작 단계: 1

루프 수: 5

100명의 사용자가 초당 5회 요청하도록 설정합니다(총 500회 요청).

2. 샘플러 만들기

스레드 그룹→추가→샘플러→HTTP 요청


  • 서버 이름 또는 IP: 도메인 이름 또는 IP를 입력합니다.
  • 포트 번호: 포트 입력
  • HTTP 요청: 호출할 전체 URL에서 IP 또는 도메인 이름과 포트를 제외한 나머지 URL을 입력합니다.
  • 요청과 함께 매개변수 보내기: 호출할 URL에 전달할 매개변수를 설정합니다.

서버 이름 또는 IP: localhost

포트 번호: 8080

HTTP 요청: GET api/v1/user-challenges

삼. 리스너 만들기

주제 그룹→추가→리스너→요약 보고서


4. 로그인한 사용자에 대한 요청으로 쿠키 설정

테스트 계획→추가→구성 항목→HTTP 쿠키 관리자


Swagger에서 로그인하기 위해 사용자로 로그인 API를 프롬프트한 후 쿠키를 확인하십시오(로그인한 사용자만 허용되므로).

Chrome→검사(마우스 왼쪽 클릭)→네트워크→이름→쿠키


초메

5. 작동하려면 상단의 녹색 버튼 ▷을 누르십시오.

6. 요약 보고서로 결과 확인


  • 평균, 최소, 최대(ms)
  • 오류 0%는 HTTP 응답 코드에 의해 결정됩니다. 예외에 해당하는 400번째 또는 500번째에 대한 응답이 없었을 것으로 예상됩니다.
  • 처리량은 초당 트랜잭션(Transaction Per Second)을 나타내는 TPS라고도 합니다.

분석하다

위치 1. 이전에 참여했던 모든 사용자 챌린지를 살펴보십시오.

평균: 8545ms

처리량: 10.3/초

→ 500개의 요청에 대한 평균 응답 시간은 8545ms, 즉 10.3 TPS

위치 2. 참가한 모든 사용자 챌린지 보기

평균: 4788ms

처리량: 17.0/초

→ 500개 요청에 대한 평균 응답 시간은 4788ms로 17.TPS입니다.

평가

SQL 최적화(Join for ChallengeRecord) 후 처리량이 10에서 17로 향상되었음을 확인했습니다.


성능 테스트를 수행할 때 가능하면 원격 서버와 동일한 네트워크에서 테스트하는 것이 좋습니다.
k6:https://k6.io/blog/k6-vs-jmeter/
루프와 스레드의 상관관계(차이점): https://m.blog.naver.com/tommybee/222071838955

참조:

https://www.blazemeter.com/blog/jmeter-cookie-manager

https://cloud-oky.351

https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Cookie_Manager

https://12bme.503

https://12bme.272