Apache JMeter 치트시트
Apache JMeter 치트시트
설치
| 플랫폼 | 명령어 |
|---|---|
| Ubuntu/Debian | sudo apt update && sudo apt install jmeter |
| Ubuntu (Snap) | sudo snap install jmeter |
| macOS (Homebrew) | brew install jmeter |
| Windows (Chocolatey) | choco install jmeter |
| Binary (Linux/macOS) | wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz && tar -xzf apache-jmeter-5.6.3.tgz |
| Docker | docker pull justb4/jmeter:latest |
| Prerequisites | Java JDK 8+ required: java -version |
# Add JMeter to PATH (Linux/macOS)
export JMETER_HOME=/opt/apache-jmeter-5.6.3
export PATH=$PATH:$JMETER_HOME/bin
# Verify installation
jmeter --version
# Increase heap size (add to ~/.bashrc or jmeter startup script)
export JVM_ARGS="-Xms1g -Xmx4g"
기본 명령어
| 명령어 | 설명 |
|---|---|
jmeter | JMeter GUI 실행 |
jmeter -t test-plan.jmx | GUI에서 특정 테스트 플랜 열기 |
jmeter -n -t test.jmx -l results.jtl | GUI 모드가 아닌 모드에서 테스트 실행 및 결과 확인 |
jmeter -n -t test.jmx -l results.jtl -e -o report/ | 테스트 실행 및 HTML 대시보드 생성 |
jmeter --version or jmeter -v | JMeter 버전 표시 |
jmeter --help or jmeter -h | 도움말 및 사용 가능한 옵션 표시 |
jmeter -? | 사용 가능한 모든 속성 나열하기 |
jmeter -n -t test.jmx -j jmeter.log | 사용자 지정 로그 파일로 테스트 실행 |
jmeter -g results.jtl -o dashboard/ | 기존 결과에서 HTML 보고서 생성 |
jmeter -p custom.properties | 사용자 지정 속성 파일로 실행 |
jmeter -Xmx4g | 힙 크기를 늘려서 (4GB) 실행 |
jmeter-server | 분산 테스트를 위해 서버 모드로 JMeter 시작 |
jmeter -n -t test.jmx -l results.csv | 테스트 실행 및 결과를 CSV로 저장 |
jmeter -n -t test.jmx -l results.xml | 테스트 실행 및 결과를 XML로 저장 |
jmeter -Jusers=100 | 런타임에서 속성 값 재정의 |
고급 사용법
| 명령어 | 설명 |
|---|---|
jmeter -n -t test.jmx -r | 모든 원격 서버에서 테스트 실행 |
jmeter -n -t test.jmx -R server1:1099,server2:1099 | 특정 원격 서버에서 테스트 실행 |
jmeter -n -t test.jmx -Gusers=100 -Grampup=60 | 원격 서버의 글로벌 속성 설정 |
jmeter -n -t test.jmx -r -X | 분산 테스트를 실행하고 원격 서버에서 종료 |
jmeter -n -t test.jmx -q env.properties -q users.properties | 여러 속성 파일 사용하기 |
jmeter -H proxy.example.com -P 8080 | HTTP 프록시로 실행 |
jmeter -H proxy.com -P 8080 -u username -a password | 인증된 프록시로 실행 |
jmeter -Lorg.apache.jmeter=DEBUG | 로그 레벨을 DEBUG로 설정 |
jmeter -Lorg.apache.jmeter.protocol.http=DEBUG | 특정 패키지의 로그 레벨 설정 |
jmeter-server -Djava.rmi.server.hostname=192.168.1.100 | 특정 호스트 이름으로 서버 시작하기 |
jmeter-server -Dserver_port=1099 | 사용자 지정 포트에서 서버 시작 |
jmeter -n -t test.jmx -Jsummariser.interval=30 | 요약 간격을 30초로 설정 |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.output_format=xml | XML 출력 형식 강제 |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.response_data=true | 결과에 응답 데이터 포함 |
jmeter -XX:+UseG1GC -n -t test.jmx | G1 가비지 컬렉터로 실행 |
jmeter -Dcom.sun.management.jmxremote -n -t test.jmx | JMX 모니터링 활성화 |
jmeter -Dhttp.keepAlive=false -n -t test.jmx | HTTP keep-alive 비활성화 |
jmeter -g results.jtl -o dashboard/ -f | 기존 대시보드 강제 덮어쓰기 |
| `jmeter -N “localhost | *.internal.com”` |
PluginsManagerCMD.sh install jpgc-casutg,jpgc-synthesis | CLI를 통해 JMeter 플러그인 설치 |
구성
JMeter 속성 파일 (jmeter.properties)
# Thread and ramp-up settings
jmeter.threads=100
jmeter.rampup=60
# Remote server configuration
remote_hosts=server1:1099,server2:1099,server3:1099
# Result file configuration
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.response_data=false
jmeter.save.saveservice.samplerData=false
jmeter.save.saveservice.requestHeaders=false
jmeter.save.saveservice.url=true
jmeter.save.saveservice.responseHeaders=false
# HTTP settings
httpclient.reset_state_on_thread_group_iteration=true
http.keepAlive=true
http.connection.timeout=30000
http.socket.timeout=120000
# Summariser interval (seconds)
summariser.interval=30
# Log level
log_level.jmeter=INFO
log_level.jmeter.engine=DEBUG
사용자 속성 파일 (user.properties)
# Custom variables
baseurl=https://example.com
users=100
rampup=60
duration=300
# Environment-specific settings
env=production
api_key=your_api_key_here
시스템 속성
# Set system properties via command line
jmeter -Dhttp.proxyHost=proxy.example.com \
-Dhttp.proxyPort=8080 \
-Dhttps.proxyHost=proxy.example.com \
-Dhttps.proxyPort=8080 \
-n -t test.jmx
JVM 구성 (jmeter스크립트)
# Edit JMETER_HOME/bin/jmeter or set environment variable
export HEAP="-Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m"
export GC_ALGO="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20"
export JVM_ARGS="$HEAP $GC_ALGO"
분산 테스트 구성
# In jmeter.properties on controller machine
remote_hosts=192.168.1.101:1099,192.168.1.102:1099,192.168.1.103:1099
# Server RMI configuration
server.rmi.ssl.disable=true
server.rmi.localport=4000
server_port=1099
# On remote server machines
java.rmi.server.hostname=192.168.1.101
일반적인 사용 사례
사용 사례 1: HTML 보고서가 있는 기본 부하 테스트
# Run load test with 100 users, 60s ramp-up, generate HTML report
jmeter -n -t load-test.jmx \
-Jusers=100 \
-Jrampup=60 \
-Jduration=300 \
-l results/results.jtl \
-e -o results/dashboard/ \
-j results/jmeter.log
# View the report
open results/dashboard/index.html # macOS
xdg-open results/dashboard/index.html # Linux
사용 사례 2: 여러 서버에 걸친 분산 부하 테스트
# Step 1: Start JMeter servers on remote machines
# On server1 (192.168.1.101):
jmeter-server -Djava.rmi.server.hostname=192.168.1.101
# On server2 (192.168.1.102):
jmeter-server -Djava.rmi.server.hostname=192.168.1.102
# Step 2: Run distributed test from controller
jmeter -n -t distributed-test.jmx \
-R 192.168.1.101:1099,192.168.1.102:1099 \
-Gusers=500 \
-Grampup=120 \
-l distributed-results.jtl \
-e -o distributed-report/
# Step 3: Shutdown remote servers
jmeter -n -t distributed-test.jmx -R 192.168.1.101:1099,192.168.1.102:1099 -X
사용 사례 3: 여러 환경에서의 API 성능 테스트
# Create environment-specific property files
# dev.properties:
echo "baseurl=https://dev-api.example.com" > dev.properties
echo "api_key=dev_key_123" >> dev.properties
# prod.properties:
echo "baseurl=https://api.example.com" > prod.properties
echo "api_key=prod_key_456" >> prod.properties
# Run test against dev environment
jmeter -n -t api-test.jmx \
-q dev.properties \
-Jusers=50 \
-l dev-results.jtl \
-e -o dev-report/
# Run test against production environment
jmeter -n -t api-test.jmx \
-q prod.properties \
-Jusers=200 \
-l prod-results.jtl \
-e -o prod-report/
사용 사례 4: CI/CD 통합 (Jenkins/GitLab)
#!/bin/bash
# performance-test.sh - CI/CD pipeline script
# Set variables
TEST_PLAN="test-plans/load-test.jmx"
RESULTS_DIR="results/$(date +%Y%m%d_%H%M%S)"
USERS=${USERS:-100}
DURATION=${DURATION:-300}
# Create results directory
mkdir -p $RESULTS_DIR
# Run JMeter test
jmeter -n -t $TEST_PLAN \
-Jusers=$USERS \
-Jduration=$DURATION \
-l $RESULTS_DIR/results.jtl \
-e -o $RESULTS_DIR/dashboard/ \
-j $RESULTS_DIR/jmeter.log
# Check for errors (exit code)
if [ $? -eq 0 ]; then
echo "Test completed successfully"
# Archive results
tar -czf $RESULTS_DIR.tar.gz $RESULTS_DIR
# Optional: Upload to artifact storage
# aws s3 cp $RESULTS_DIR.tar.gz s3://bucket/results/
else
echo "Test failed with errors"
exit 1
fi
사용 사례 5: 데이터베이스 성능 테스트
# Test database performance with parameterized queries
jmeter -n -t database-test.jmx \
-Jdb.host=db.example.com \
-Jdb.port=5432 \
-Jdb.name=testdb \
-Jdb.user=testuser \
-Jdb.password=testpass \
-Jthreads=50 \
-Jrampup=30 \
-l db-results.jtl \
-e -o db-report/
# Generate report from existing results
jmeter -g db-results.jtl -o db-report-regenerated/
모범 사례
-
실제 테스트에는 항상 비 GUI 모드 사용: GUI 모드는 상당한 리소스를 소비하고 테스트 정확성에 영향을 미칩니다. 모든 성능 테스트에
jmeter -n를 사용하세요. -
충분한 힙 메모리 할당: JVM 힙 크기를 사용 가능한 RAM의 최소 25%로 설정하세요. 대규모 테스트의 경우:
export JVM_ARGS="-Xms2g -Xmx4g -XX:+UseG1GC" -
결과 파일에 CSV 형식 사용: CSV 형식이 XML보다 더 효율적입니다. 오버헤드를 줄이기 위해 불필요한 데이터 수집을 비활성화하세요:
jmeter.save.saveservice.response_data=false -
적절한 램프업 기간 구현: 모든 스레드를 동시에 시작하지 마세요. 현실적인 부하 패턴을 시뮬레이션하기 위해 점진적 램프업(일반적으로 테스트 지속 시간의 10-20%)을 사용하세요.
-
고부하를 위한 분산 테스트 활용: 단일 머신의 한계로 결과가 왜곡될 수 있습니다. 500-1000 스레드를 초과하는 테스트에는 여러 JMeter 서버를 사용하세요.
-
테스트 데이터 매개변수화: 하드코딩된 값 대신 CSV Data Set Config 또는 변수를 사용하세요. 이를 통해 쉬운 테스트 구성 및 환경 전환이 가능합니다.
-
테스트 중 시스템 리소스 모니터링: JMeter 머신과 대상 시스템 모두에서 CPU, 메모리, 네트워크, 디스크 I/O를 추적하세요. JMeter의 높은 리소스 사용량은 테스트 실행의 병목 현상을 나타냅니다.
-
테스트 계획 버전 관리: Git에
.jmx파일 및 속성 파일 저장. 의미 있는 커밋 메시지를 사용하고 재현성을 위해 릴리스에 태그를 지정하세요. -
적절한 상관관계 및 어설션 구현: 동적 값(토큰, 세션 ID) 추출 및 응답 검증. 속도만 측정하지 말고 정확성을 확인하세요.
-
테스트 실행 간 정리: 결과 디렉토리와 로그 지우기. 일관된 테스트 조건 보장을 위해 필요한 경우 애플리케이션 상태 초기화.
문제 해결
| 문제 | 솔루션 |
|---|---|
| OutOfMemoryError during test | Increase heap size: export JVM_ARGS="-Xms2g -Xmx4g" or reduce threads/disable response data saving |
| Connection refused on remote servers | Check firewall rules for ports 1099 and 4000. Verify java.rmi.server.hostname is set correctly on server |
| Test results show 100% errors | Verify target URL is accessible, check proxy settings, review jmeter.log for detailed error messages |
| GUI freezes during large tests | Never run large tests in GUI mode. Use non-GUI: jmeter -n -t test.jmx -l results.jtl |
| Inconsistent results between runs | 적절한 램프업 보장, 실행 간 캐시/쿠키 지우기, 네트워크 안정성 확인, 대상 시스템 부하 점검 |
| Cannot generate HTML report | Verify results file format is compatible (CSV/JTL), ensure output directory is empty or use -f flag to force overwrite |
| Remote servers not starting | Check Java version compatibility (JDK 8+), verify RMI registry port is available, review jmeter-server.log |
| SSL/TLS certificate errors | Add certificate to Java keystore or disable validation: jmeter -Jhttps.default.protocol=TLSv1.2 |
| Slow test execution | 비GUI 모드에서 리스너 비활성화, 어설션 복잡성 감소, 정규 표현식 최적화, 효율적인 추출기 사용 |
| ”Non HTTP response code: java.net.SocketException” | 타임아웃 값 증가, 연결 풀 설정 확인, 대상 시스템 용량 검증, 스레드 수 감소 |
| Distributed test results incomplete | 모든 서버가 동일한 테스트 계획 버전을 가지고 있는지 확인하고, 네트워크 연결성을 확인하며, 서버 간 클록 동기화를 검증하세요 |
| High CPU on JMeter machine | 스레드 수 줄이기, 불필요한 프로세서/리스너 비활성화, 더 간단한 샘플러 사용, 분산 테스트 고려 |
| Cannot install plugins | Download Plugins Manager JAR manually to lib/ext/, ensure internet connectivity, check proxy settings |
| Results file corrupted or empty | 충분한 디스크 공간 확보, 파일 권한 확인, JMeter 프로세스 성공적으로 완료 여부 확인 |
| ”Address already in use” error | Change server port: jmeter-server -Dserver_port=1100, kill existing JMeter processes, wait for port release |
빠른 참조: 명령줄 옵션
| 옵션 | 설명 | 예시 |
|---|---|---|
-n | 비-GUI 모드 | jmeter -n -t test.jmx |
-t | 테스트 계획 파일 | jmeter -t mytest.jmx |
-l | 결과 로그 파일 | jmeter -n -t test.jmx -l results.jtl |
-j | JMeter 로그 파일 | jmeter -n -t test.jmx -j jmeter.log |
-r | 모든 원격 서버에서 실행 | jmeter -n -t test.jmx -r |
-R | 특정 서버에서 실행 | jmeter -n -t test.jmx -R server1,server2 |
-g | 파일에서 보고서 생성 | jmeter -g results.jtl -o report/ |
-e | 테스트 후 보고서 생성 | jmeter -n -t test.jmx -l results.jtl -e -o report/ |
-o | 보고서 출력 폴더 | jmeter -g results.jtl -o dashboard/ |
-H | 프록시 호스트 | jmeter -H proxy.com -P 8080 |
-P | 프록시 포트 | jmeter -H proxy.com -P 8080 |
-u | 프록시 사용자 이름 | jmeter -H proxy.com -P 8080 -u user |
-a | 프록시 비밀번호 | jmeter -H proxy.com -P 8080 -a pass |
-J | JMeter 속성 정의하기 | jmeter -Jusers=100 -Jrampup=60 |
-G | 전역 속성 정의 | jmeter -Gusers=100 (for remote servers) |
-D | 시스템 속성 정의 | jmeter -Dhttp.proxyHost=proxy.com |
-L | 로그 레벨 설정 | jmeter -Lorg.apache.jmeter=DEBUG |
-p | 속성 파일 | jmeter -p custom.properties |
-q | 추가 속성 파일 | jmeter -q env.properties |
-X | 원격 서버 종료 | jmeter -n -t test.jmx -r -X |