배경
R9(관측 스택 동거 비용, 팔 D) 재검증 라운드(#686 수정 후, 2026-09-07) 도중 발견. coresidency 본판이 세션 수(레벨) 30개를 넘는 트라이얼마다 계정 준비 단계에서 login 429로 실패한다 — 항상 비슷한 인덱스(예: 계정 60) 근방에서 죽는다.
현상 (근거, file:line)
backend/src/main/resources/application.yml:250-252 — 인증 경로(signup/login 등) 레이트리미터가 window-seconds: 60, ip-per-window: 60(IP 하나가 60초당 60회), account-failures-per-window: 3로 설정돼 있다. 값의 근거는 같은 파일 주석의 유도식(DAU=1,000 가정) — "가정+유도"지 실측이 아니라고 스스로 적혀 있다.
loadtest/results/coresidency-2026-08-15/load_ai.py:72-90 (setup_account) — 계정 하나당 /member/signup, /member/login 2콜을 무조건 보낸다(이미 있는 계정이어도 signup을 다시 시도하고 무시). prefix="cores"가 라운드 전체에서 고정이라 매 트라이얼마다 계정 0..N-1을 이 방식으로 다시 두드린다.
loadtest/results/coresidency-2026-08-15/load_ai.py:212-218 — 계정 준비 루프가 **순차(for i in range(a.sessions))**이고, 실패하면 재시도 없이 sys.exit(1)로 그 트라이얼 전체가 죽는다.
- 계산:
ip-per-window=60회 ÷ 계정당 2콜 = 약 30개 계정이면 60초 윈도 하나를 다 쓴다. 레벨 세트(20 40 60 80 90 100 120 160)의 30 이상인 모든 레벨(6/8)이 이 한도에 구조적으로 걸린다 — 실측 로그에서도 매번 계정 인덱스 55~65 부근에서 죽었다(루프 처리 속도에 따라 정확한 인덱스는 흔들린다).
- 백엔드 로그 확인:
cores60@shadowfit.local 자체는 로그에 한 번도 안 잡히고(docker logs shadowfit-backend | grep cores60 → 0건), 대신 IP 레이트리미터 문구(요청이 너무 많습니다)가 여러 건 잡힌다 — **계정별 한도(3회 실패)가 아니라 IP 전역 한도(60회/60초)**에 걸린 것으로 확인.
영향
미검증
- 고치는 방향 미결정: (a) 이 라운드 한정으로
AUTO_RATE_LIMIT_ENABLED=false(env var로 이미 존재)를 켜서 우회, (b) load_ai.py가 계정을 라운드 시작 시 한 번만 준비하고 트라이얼마다 재사용(현재는 매번 signup+login을 다시 함 — 애초에 불필요한 재요청일 수 있음), (c) ip-per-window를 부하테스트 프로파일에서만 완화. 셋 다 미결정.
- 다른 rig(P4/P5/R276 등)도 계정을 빠르게 여러 개 만드는 패턴이면 같은 한도에 걸릴 수 있는지는 확인 안 했다.
배경
R9(관측 스택 동거 비용, 팔 D) 재검증 라운드(#686 수정 후, 2026-09-07) 도중 발견.
coresidency본판이 세션 수(레벨) 30개를 넘는 트라이얼마다 계정 준비 단계에서login 429로 실패한다 — 항상 비슷한 인덱스(예: 계정 60) 근방에서 죽는다.현상 (근거, file:line)
backend/src/main/resources/application.yml:250-252— 인증 경로(signup/login 등) 레이트리미터가window-seconds: 60,ip-per-window: 60(IP 하나가 60초당 60회),account-failures-per-window: 3로 설정돼 있다. 값의 근거는 같은 파일 주석의 유도식(DAU=1,000 가정) — "가정+유도"지 실측이 아니라고 스스로 적혀 있다.loadtest/results/coresidency-2026-08-15/load_ai.py:72-90(setup_account) — 계정 하나당/member/signup,/member/login2콜을 무조건 보낸다(이미 있는 계정이어도 signup을 다시 시도하고 무시).prefix="cores"가 라운드 전체에서 고정이라 매 트라이얼마다 계정 0..N-1을 이 방식으로 다시 두드린다.loadtest/results/coresidency-2026-08-15/load_ai.py:212-218— 계정 준비 루프가 **순차(for i in range(a.sessions))**이고, 실패하면 재시도 없이sys.exit(1)로 그 트라이얼 전체가 죽는다.ip-per-window=60회 ÷ 계정당 2콜 = 약 30개 계정이면 60초 윈도 하나를 다 쓴다. 레벨 세트(20 40 60 80 90 100 120 160)의 30 이상인 모든 레벨(6/8)이 이 한도에 구조적으로 걸린다 — 실측 로그에서도 매번 계정 인덱스 55~65 부근에서 죽었다(루프 처리 속도에 따라 정확한 인덱스는 흔들린다).cores60@shadowfit.local자체는 로그에 한 번도 안 잡히고(docker logs shadowfit-backend | grep cores60→ 0건), 대신 IP 레이트리미터 문구(요청이 너무 많습니다)가 여러 건 잡힌다 — **계정별 한도(3회 실패)가 아니라 IP 전역 한도(60회/60초)**에 걸린 것으로 확인.영향
setup_fail로 죽는다 — 레벨 그리드의 절반 이상(오늘 그리드 기준 6/8 레벨 × 4팔 × 3반복)이 사실상 무효 데이터가 될 수 있다.미검증
AUTO_RATE_LIMIT_ENABLED=false(env var로 이미 존재)를 켜서 우회, (b)load_ai.py가 계정을 라운드 시작 시 한 번만 준비하고 트라이얼마다 재사용(현재는 매번 signup+login을 다시 함 — 애초에 불필요한 재요청일 수 있음), (c)ip-per-window를 부하테스트 프로파일에서만 완화. 셋 다 미결정.