Skip to content

부하 rig의 액세스 토큰이 30분에 만료된다 — 3시간 soak가 30분 뒤 조용히 무부하가 된다 #689

Description

@Khyojae

무엇

measure_ai_worker_load_soak.sh준비 단계에서 로그인 1회로 받은 accessToken 을 워커가 전체 실행 시간 내내 재사용한다. 재발급 경로가 없다.

  • 토큰 획득: loadtest/measure_ai_worker_load_soak.sh:42tokens.txt 에 적재(:33)
  • 워커가 그 파일을 그대로 읽어 씀: :105, :107 — 루프 안에서 다시 로그인하지 않는다
  • access token TTL: backend/src/main/resources/application.yml:338JWT_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분에 걸쳐 순차 만료"가 맞다

고칠 방향 (미결정)

두 갈래이고 무대 조건이 달라져서 결정이 필요하다:

  1. rig 에 재발급/재로그인 — 401 이면 재로그인 후 재시도. 부하 모양이 실제 클라이언트에 가까워지지만 rig 변경이다
  2. 라운드 한정으로 JWT_EXPIRATION_TIME 상향 — 손잡이가 이미 있어 코드 변경 0. 대신 측정 조건에 "토큰 수명을 바꿨다"가 붙는다

관련: loadtest/aws/ROUND-2026-09-08-ebs-causality.md — 이 라운드의 Q2 본판(3시간)이 정확히 이 결함에 걸린다

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions