무엇
measure_ai_worker_load_soak.sh 는 준비 단계에서 로그인 1회로 받은 accessToken 을 워커가 전체 실행 시간 내내 재사용한다. 재발급 경로가 없다.
- 토큰 획득:
loadtest/measure_ai_worker_load_soak.sh:42 → tokens.txt 에 적재(:33)
- 워커가 그 파일을 그대로 읽어 씀:
:105, :107 — 루프 안에서 다시 로그인하지 않는다
- access token TTL:
backend/src/main/resources/application.yml:338 — JWT_EXPIRATION_TIME:1800 (30분)
- 단위 확인:
JwtUtil.java:77 now.plusSeconds(expireTime) — 초가 맞다
왜 문제인가
설계 기본값이 DURATION_SEC=10800(3시간)이다. 즉 부하 시작 30분 뒤 203개 워커의 토큰이 전부 동시에 만료된다.
만료 후 워커 루프의 동작(:80~85):
resp=$(curl ... POST /exercises/sessions ...) # 401
sid=$(... grep -oE '"sessionId":[0-9]+' ...) # 빈 값
if [ -z "$sid" ]; then failed++; START_FAIL; sleep 5; continue; fi
→ 남은 2.5시간 동안 5초마다 401 을 받는 루프가 되고, 동접은 목표 203이 아니라 사실상 0이 된다. 그 상태로 판정 채널(RestartCount·OOMKilled)은 얌전히 "장애 0회"를 찍는다. 부하가 없어서 안 죽은 것을 "이 강도에서 안전하다"로 읽게 된다.
왜 지금까지 안 드러났나
2026-08-28 라운드 두 번이 각각 90초·10분 만에 박스 정지로 끝나서, 이 rig 이 30분을 넘겨 돌아본 적이 한 번도 없다. (결과)
재현
DURATION_SEC 을 1800 이상으로 두고 돌린 뒤 workers/w*.log 에서 30분 지점 이후 START_FAIL 이 연속으로 찍히는지 본다. 30분 미만 판에서는 재현되지 않는다.
🔴 미검증
- 실제로 401 을 받아본 적이 없다. 코드 경로로만 확인했다 — rig 이 응답 코드를 안 찍고
sessionId 유무만 보기 때문에, 만료 시 어떤 상태코드·본문이 오는지는 이 이슈가 확인하지 않았다. START_FAIL resp= 에 본문이 남으므로 실측 시 거기서 확인 가능
- 만료 시각이 203개 계정에 정확히 동시에 오는지는 준비 단계가
PREP_SLEEP=2.5 로 약 8분에 걸쳐 로그인하므로 그만큼 번진다 — "동시"가 아니라 "8분에 걸쳐 순차 만료"가 맞다
고칠 방향 (미결정)
두 갈래이고 무대 조건이 달라져서 결정이 필요하다:
- rig 에 재발급/재로그인 — 401 이면 재로그인 후 재시도. 부하 모양이 실제 클라이언트에 가까워지지만 rig 변경이다
- 라운드 한정으로
JWT_EXPIRATION_TIME 상향 — 손잡이가 이미 있어 코드 변경 0. 대신 측정 조건에 "토큰 수명을 바꿨다"가 붙는다
관련: loadtest/aws/ROUND-2026-09-08-ebs-causality.md — 이 라운드의 Q2 본판(3시간)이 정확히 이 결함에 걸린다
무엇
measure_ai_worker_load_soak.sh는 준비 단계에서 로그인 1회로 받은 accessToken 을 워커가 전체 실행 시간 내내 재사용한다. 재발급 경로가 없다.loadtest/measure_ai_worker_load_soak.sh:42→tokens.txt에 적재(:33):105,:107— 루프 안에서 다시 로그인하지 않는다backend/src/main/resources/application.yml:338—JWT_EXPIRATION_TIME:1800(30분)JwtUtil.java:77now.plusSeconds(expireTime)— 초가 맞다왜 문제인가
설계 기본값이
DURATION_SEC=10800(3시간)이다. 즉 부하 시작 30분 뒤 203개 워커의 토큰이 전부 동시에 만료된다.만료 후 워커 루프의 동작(
:80~85):→ 남은 2.5시간 동안 5초마다 401 을 받는 루프가 되고, 동접은 목표 203이 아니라 사실상 0이 된다. 그 상태로 판정 채널(
RestartCount·OOMKilled)은 얌전히 "장애 0회"를 찍는다. 부하가 없어서 안 죽은 것을 "이 강도에서 안전하다"로 읽게 된다.왜 지금까지 안 드러났나
2026-08-28 라운드 두 번이 각각 90초·10분 만에 박스 정지로 끝나서, 이 rig 이 30분을 넘겨 돌아본 적이 한 번도 없다. (결과)
재현
DURATION_SEC을 1800 이상으로 두고 돌린 뒤workers/w*.log에서 30분 지점 이후START_FAIL이 연속으로 찍히는지 본다. 30분 미만 판에서는 재현되지 않는다.🔴 미검증
sessionId유무만 보기 때문에, 만료 시 어떤 상태코드·본문이 오는지는 이 이슈가 확인하지 않았다.START_FAIL resp=에 본문이 남으므로 실측 시 거기서 확인 가능PREP_SLEEP=2.5로 약 8분에 걸쳐 로그인하므로 그만큼 번진다 — "동시"가 아니라 "8분에 걸쳐 순차 만료"가 맞다고칠 방향 (미결정)
두 갈래이고 무대 조건이 달라져서 결정이 필요하다:
JWT_EXPIRATION_TIME상향 — 손잡이가 이미 있어 코드 변경 0. 대신 측정 조건에 "토큰 수명을 바꿨다"가 붙는다관련:
loadtest/aws/ROUND-2026-09-08-ebs-causality.md— 이 라운드의 Q2 본판(3시간)이 정확히 이 결함에 걸린다