제이미터란?
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://jmeter.apache.org/usermanual/component_reference.html#HTTP_Cookie_Manager