배경
AI 워커 부하-중 장애 라운드 §6(MySQL 캡 재현 시도, 2026-08-28)에서 새로 열린 후보다.
1차 라운드는 MySQL InnoDB 내부 락 정체를 의심했다(로그가 "장기 세마포어 대기" 헤더에서 끊김). MySQL에 mem_limit=3072m을 걸고 재현을 시도했는데 — 사고가 다시 났고, 이번엔 사고 30~40초 전 SHOW ENGINE INNODB STATUS 직접 증거를 확보했다. 그 증거는 MySQL이 사고 직전 완전히 idle·healthy했다는 것을 보여줘서, 1차의 락 정체 가설을 반박한다.
관찰
부하 시작 후 10분 시점, 서로 다른 독립 채널 3개가 **같은 30초 창(09:38:2909:38:45 UTC)** 안에서 거의 동시에 멈췄다:
- systemd 저널(호스트 커널/시스템 로그)
SHOW ENGINE INNODB STATUS 폴러(MySQL 컨테이너 docker exec)
- Prometheus의 node-exporter 스크레이핑(컨테이너 간 HTTP)
그런데 메모리는 끝까지 평평했다 — node_memory_MemAvailable_bytes 13.4GB(전체 15GB 중)로 잠식 흔적 없음, shadowfit-ai 컨테이너 메모리도 604MB로 평평(cAdvisor 관측). 점진적 자원 고갈의 흔적이 없이 거의 순간적으로 멎었다.
가설
EBS(gp3) I/O 크레딧/처리량 한도 소진. 메모리는 안 튀었는데 디스크에 물린 모든 것(저널 쓰기·MySQL 쿼리·HTTP 응답·도커 로그 쓰기)이 동시에 멎는 건 디스크 I/O 자체가 막히는 그림과 맞는다. gp3 볼륨 기본값은 3,000 IOPS·125MB/s인데, 계정 193203개의 동시 가입·로그인·온보딩(각 23 보호 경로) + MySQL 커밋 + 도커 로그 쓰기가 겹치면 순간적으로 그 한도에 닿을 수 있다.
미검증
- EBS 지표(
VolumeQueueLength·VolumeThroughputPercentage·VolumeConsumedReadWriteOps 등, CloudWatch)를 이 라운드는 안 걷었다 — 직접 확인 안 됨
- 재부팅 셧다운 도중(09:44:10)
shadowfit-ai의 uvicorn이 OOM kill됐는데(anon-rss 4.5GB), 이게 이 사고의 원인인지 결과(시스템이 이미 얼어붙은 뒤 셧다운 절차 자체가 메모리를 눌러서)인지 이 라운드로는 못 갈랐다
- 이번 라운드는 obs 프로파일(Grafana 등) 추가와 MySQL 캡 적용이 같이 겹쳐서, 완전히 깨끗한 단일변수 대조는 아니다
다음에 필요한 것 (착수 여부·우선순위는 미결정)
- EBS CloudWatch 지표를 걷으면서 같은 강도로 재현 시도
- io2 볼륨 또는 gp3 처리량 프로비저닝 상향으로 재현 여부 대조
배경
AI 워커 부하-중 장애 라운드 §6(MySQL 캡 재현 시도, 2026-08-28)에서 새로 열린 후보다.
1차 라운드는 MySQL InnoDB 내부 락 정체를 의심했다(로그가 "장기 세마포어 대기" 헤더에서 끊김). MySQL에
mem_limit=3072m을 걸고 재현을 시도했는데 — 사고가 다시 났고, 이번엔 사고 30~40초 전SHOW ENGINE INNODB STATUS직접 증거를 확보했다. 그 증거는 MySQL이 사고 직전 완전히 idle·healthy했다는 것을 보여줘서, 1차의 락 정체 가설을 반박한다.관찰
부하 시작 후
10분 시점, 서로 다른 독립 채널 3개가 **같은 30초 창(09:38:2909:38:45 UTC)** 안에서 거의 동시에 멈췄다:SHOW ENGINE INNODB STATUS폴러(MySQL 컨테이너docker exec)그런데 메모리는 끝까지 평평했다 —
node_memory_MemAvailable_bytes13.4GB(전체 15GB 중)로 잠식 흔적 없음,shadowfit-ai컨테이너 메모리도 604MB로 평평(cAdvisor 관측). 점진적 자원 고갈의 흔적이 없이 거의 순간적으로 멎었다.가설
EBS(gp3) I/O 크레딧/처리량 한도 소진. 메모리는 안 튀었는데 디스크에 물린 모든 것(저널 쓰기·MySQL 쿼리·HTTP 응답·도커 로그 쓰기)이 동시에 멎는 건 디스크 I/O 자체가 막히는 그림과 맞는다. gp3 볼륨 기본값은 3,000 IOPS·125MB/s인데, 계정 193
203개의 동시 가입·로그인·온보딩(각 23 보호 경로) + MySQL 커밋 + 도커 로그 쓰기가 겹치면 순간적으로 그 한도에 닿을 수 있다.미검증
VolumeQueueLength·VolumeThroughputPercentage·VolumeConsumedReadWriteOps등, CloudWatch)를 이 라운드는 안 걷었다 — 직접 확인 안 됨shadowfit-ai의 uvicorn이 OOM kill됐는데(anon-rss 4.5GB), 이게 이 사고의 원인인지 결과(시스템이 이미 얼어붙은 뒤 셧다운 절차 자체가 메모리를 눌러서)인지 이 라운드로는 못 갈랐다다음에 필요한 것 (착수 여부·우선순위는 미결정)