Deploy — 설치·배포·기동
부하 발사 원칙 (절대 — spec §3): 부하는 항상 원격 부하원(master에서
-R workers분산, 또는 단독 부하원)에서만 발사한다. 로컬(맥/Windows)에서 JMeter를 실행해 부하를 발사하는 것을 금지한다. 로컬jmeter바이너리는-g(jtl→HTML 리포트) 후처리 전용으로만 사용한다. 이 스킬이 세팅·기동하는 원격 노드가 곧 부하원이다.
전제: jmeter.json(프로젝트 루트, 스키마는 spec §3). 원격은 Linux(remote_os)만 지원 — 로컬 OS만 분기.
1. Idempotent 설치 (노드마다)
ssh <host> 'jmeter --version >/dev/null 2>&1 && java -version 2>&1 | head -1 || echo NEED_INSTALL'
# NEED_INSTALL 시:
ssh <host> 'cd /tmp && curl -sLO https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz \
&& sudo tar -xzf apache-jmeter-5.6.3.tgz -C /opt/ \
&& sudo ln -sf /opt/apache-jmeter-5.6.3/bin/jmeter /usr/local/bin/jmeter \
&& sudo ln -sf /opt/apache-jmeter-5.6.3/bin/jmeter-server /usr/local/bin/jmeter-server \
&& jmeter --version' # JDK는 OS 패키지 관리자(apt/dnf)로 openjdk-17 설치
# 재실행 시 이미 있으면 no-op — 버전 불일치 시 경고 후 중단(자동 교체 금지)
2. 자산 동기화 (로컬 OS 분기)
원격 부하원은 실행 자산 src/jmeter/만 보관한다 (2026-09-04 변경 — 이전에는 저장소 전체를 exclude 증분 배포). 원격 폴더(~/git/ecoai-gwageo)는 빈 뼈대만 있으면 되고, run 스킬이 results/는 mkdir -p로 자동 생성한다.
# mac/Linux — src/jmeter만 미러 동기화 (상위 폴더 선보장)
ssh <host> 'mkdir -p <remote_path 절대경로>/src/jmeter'
rsync -az --delete ./src/jmeter/ <host>:<remote_path 절대경로>/src/jmeter/
# Windows (PowerShell) — src/jmeter 한정이면 /MIR 안전. SMB 미탑재면 scp -r fallback:
# robocopy .\src\jmeter \\<host-ip>\<share>\<path>\src\jmeter /MIR
3. jmeter-server 기동·검증 (양 노드)
for h in <worker1-host:ip> <worker2-host:ip>; do
host=${h%%:*}; ip=${h##*:}
ssh "$host" "pgrep -f 'ApacheJMeter.jar.*server_port' >/dev/null || (cd <remote_path 절대경로> && nohup jmeter-server -Djava.rmi.server.hostname=$ip > /tmp/jmeter-server.log 2>&1 < /dev/null &)"
done
# 검증 — bracket 패턴(자기 자신 cmdline self-match 방지) + /proc cwd
for host in <hosts>; do
ssh "$host" 'p=$(pgrep -f "[j]ava.*ApacheJMeter" | head -1); echo "'$host': $(readlink /proc/$p/cwd)"'
done
내장 gotcha (위반 시 5-3 업로드 FileNotFoundException 회귀)
- Windows ssh 비대화형 명령은 원격 홈 디렉토리에서 시작 — cd는 항상 절대경로
- zsh 쌍따옴표 안
~/는 로컬로 확장되어 원격 cd 실패 — 절대경로만 - pgrep 패턴은 ssh bash -c 자기 cmdline에 self-match —
[j]avabracket 필수