Skip to content

EBS I/O 크레딧 소진 의심 — 부하 중 호스트 전체가 30초 창에서 동시 정지 #603

Description

@Khyojae

배경

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)** 안에서 거의 동시에 멈췄다:

  1. systemd 저널(호스트 커널/시스템 로그)
  2. SHOW ENGINE INNODB STATUS 폴러(MySQL 컨테이너 docker exec)
  3. 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 처리량 프로비저닝 상향으로 재현 여부 대조

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

    measure아직 안 잰 것. 고칠 코드가 아니라 측정 과제다

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions