IL-0294 CircleCI · 2021-05-21databasegcpaws
CircleCI 의 VM 정리 대기열에서 컨슈머가 사라져 Docker 와 machine 작업이 12시간 가까이 늦어지거나 막혔다
CircleCI 는 2021-05-20 정기 유지보수로 RabbitMQ 를 3.8.9 에서 3.8.16 으로 올렸다. 팀은 변경 기록에서 호환되지 않는 변경을 확인했다. 변경 기록에는 메시지를 받고 ack 하지 않는 컨슈머에 기본 15분 ack 타임아웃을 거는 변경이 CircleCI 가 쓰지 않는 quorum queue 에만 해당한다고 적혀 있었다. 실제로 이 변경은 모든 큐 종류에 적용됐다. 일부 메시지가 ack 타임아웃에 걸리면서 그 컨슈머의 RabbitMQ 채널이 닫혔다. 특정 리전의 VM 을 비동기로 정리하는 대기열의 컨슈머는 이렇게 시간이 지나며 줄어 결국 0 이 됐다. 그래서 VM 이 지워지지 않았다. 이 원인은 5월 24일에야 밝혀졌다.
5월 21일 02:31 에 VM destroyer 대기열에 컨슈머가 없다는 알림을 받고 파드를 재시작해 정상으로 돌렸다. 그러나 03:10 에 다시 컨슈머가 빠지기 시작한 것은 알아채지 못했다. 10:11 의 대기열 적체 알림은 한 번만 울리고 온콜을 호출하지 않았다. 13:00 에 작업 시작 지연 호출이 왔고, 시스템은 GCP CPU 쿼터에 걸려 VM 을 띄우지 못했다. 13:23 에 장애를 선언하고 13:26 에 Google Cloud 에 쿼터 증설 티켓을 열었다. 크립토마이닝 남용을 원인으로 보고 마이닝 작업을 지웠지만 효과가 없었고, 자동 재시도가 쿼터를 바닥낸 주된 원인으로 드러났다. 14:13 에 Linux machine 작업이 작업 대기열에 들어오지 못하게 막았고, Docker executor 와 VM 서비스가 묶여 있어 Docker 작업도 느려졌다. 14:37 에 GCP 가 쿼터를 늘렸지만 시스템은 스스로 회복하지 못했다. 엔지니어는 오래된 VM 을 손으로 지우기 시작했다. 16:25 에 VM 을 지우는 대기열에 컨슈머가 없음을 확인해 VM 서비스 배포를 리셋했고, 17:22 에 일부 워크플로를 취소해 자원을 비웠다.
대기열이 빠지던 18:05 무렵 RDS 데이터베이스의 Burst Balance 가 바닥나 IO 가 크게 줄고 연결이 타임아웃됐다. 재부팅은 효과가 없었고, 18:20 에 RDS 인스턴스를 키우며 VM 프로비저닝 서비스를 줄여 연결이 몰리지 않게 했다. GP2 크레딧이 다시 바닥나자 remote-docker 작업을 막았다. 18:50 에 다시 GCP API 쿼터에 걸렸고, 19:00 에 프로비저닝 서비스를 줄였지만 burst balance 는 계속 빠르게 줄었다. 19:15 에 데이터베이스를 한 번 더 키워 19:45 에 안정됐지만 VM 프로비저닝 시간이 다시 늘었다. 시스템은 VM 을 만들고 쿼터 때문에 지우지 못하는 순환에 빠졌다. 21:00 에 엔지니어는 VM 을 만들고 지우는 파드를 모두 줄였다. 21:57 에 remote-docker 작업을 프로비저닝 대기열에 넣지 않는 새 분배 백엔드를 배포했고, 22:21 에 프로비저닝 시스템을 줄여 대기열이 빠질 여유를 만들었다. 22:36 부터 두 시간 동안 구성 요소를 하나씩 다시 올렸고, 00:39 에 모두 돌아오며 완화용 코드 변경을 되돌렸다. 장애는 5월 22일 01:18 에 해결됐다. 대응에는 EMEA 와 NA 의 인력이 참여했고 APAC 인력까지 부를 뻔했다. 이후 RabbitMQ 쪽은 이 타임아웃이 모든 큐 종류에 적용된다고 확인했고, 다음 릴리스에서 타임아웃을 늘리고 설정 문서를 보강하겠다고 답했다.
- 심각도
- –
- 영향 범위
- Docker, Machine executor (Windows, Mac, Arm, GPU) and remote Docker jobs delayed or blocked; macOS jobs slow
- 영향 사용자
- CircleCI customers running these job types
- 지역
- –
- 감지까지
- –
- 복구까지
- 11h 48m
증상
2021-05-21 13:00 UTC 에 CircleCI 엔지니어가 작업 시작이 지나치게 늦어진다는 첫 호출을 받았다. Docker, Machine executor, remote Docker 작업이 늦어지거나 막혔고, 시스템이 GCP 의 CPU 쿼터에 걸려 VM 을 띄우지 못하고 있었다.
상태 페이지는 Machine executor 와 Remote Docker 작업이 queued 나 permanent not run 상태로 남거나 canceled 된다고 알렸다. macOS 작업은 느려질 수 있었다. 영향은 주로 Linux executor 에 있었고, Windows executor 는 간헐적으로 문제를 겪을 수 있었다. 일부 작업은 취소돼 사용자가 손으로 다시 돌려야 했고, 상태 페이지는 queued 에 멈춘 작업을 취소하고 다시 돌리라고 안내했다.
앞선 신호가 있었다. 02:31 에 VM destroyer 서비스 대기열 하나에 컨슈머가 없다는 알림이 와서 VM 서비스 Kubernetes 파드를 재시작했고 모두 정상으로 돌아왔다. 03:10 에 VM destroyer 서비스가 다시 대기열에서 컨슈머를 잃기 시작했지만 아무도 알아채지 못했다. 10:11 에 VM 을 지우는 대기열이 쌓인다는 알림이 울렸다. 그러나 이 알림은 임계값에 닿을 때 한 번만 알리고 대기열이 계속 늘어도 다시 알리지 않게 잘못 설정돼 있었고, 온콜도 호출하지 않았다.
엔지니어는 처음에 크립토마이닝 관련 플랫폼 남용이 늘어난 것을 원인으로 보고 마이닝 작업을 지우는 데 힘을 쏟았다. 고객 영향은 눈에 띄게 줄지 않았고 GCP 쿼터에 계속 걸리며 복구가 막혔다. 더 조사해 보니 자동 재시도가 GCP 쿼터를 바닥낸 주된 원인이었다.
대기열이 빠지기 시작한 뒤에는 RDS 데이터베이스가 버티지 못했다. 18:05 에 할당된 Burst Balance 를 모두 써서 IO 가 크게 줄었고 데이터베이스 연결이 타임아웃되며 끊겼다. 데이터베이스를 키운 뒤에도 GP2 크레딧이 바닥났다. 18:50 에는 다시 GCP API 쿼터에 걸렸고, 19:00 에 프로비저닝 서비스를 줄인 뒤에도 데이터베이스는 15분 만에 burst balance 의 약 30% 를 썼다.
결국 시스템은 VM 을 만들고 GCP 쿼터 때문에 지우지 못하는 순환에 빠졌고, 19:45 에 데이터베이스가 안정된 뒤에도 VM 프로비저닝 시간이 다시 늘었다.
원인
- 촉발
- 2021-05-20 08:37 UTC 에 RabbitMQ 를 3.8.9 에서 3.8.16 으로 올렸다. 3.8.15 에서 들어온 변경으로, 메시지를 받고 ack 하지 않는 컨슈머에 기본 15분 ack 타임아웃이 걸렸다. 변경 기록에는 quorum queue 에만 해당한다고 적혀 있었지만 실제로는 모든 큐 종류에 적용됐다.
감지
02:31 UTC 에 VM destroyer 서비스 대기열 하나에 컨슈머가 없다는 알림이 왔고, 파드를 재시작해 정상으로 돌렸다. 그 뒤 03:10 에 다시 컨슈머가 빠지기 시작한 것은 알아채지 못했다. 10:11 에 VM 을 지우는 대기열이 쌓인다는 알림이 울렸다. 이 알림은 임계값에 닿을 때 한 번만 알리게 잘못 설정돼 있었고 온콜을 호출하지 않았다. 엔지니어들은 13:00 에 작업 시작 지연 호출을 받고서야 본격적으로 조사를 시작했다.
조치
- 14:13 에 Linux machine 작업이 작업 대기열에 아예 들어오지 못하게 손으로 막았다.
- 13:26 에 Google Cloud 에 쿼터 증설 티켓을 열었고 14:37 에 GCP 가 쿼터를 늘렸다. 시스템은 그 뒤에도 스스로 회복하지 못했다.
- 오래된 VM 을 손으로 지우는 계획을 세우고 지우기 시작했다.
- 17:22 에 자원을 비우고 멈춘 플랫폼을 다시 움직이려고 일부 워크플로를 취소했다.
- 16:25 에 VM 을 지우는 대기열에 컨슈머가 없음을 확인하고 대기열과의 연결을 되살리려고 VM 서비스 배포를 리셋했다. 대기열이 빠지기 시작했다.
- Burst Balance 가 바닥난 RDS 데이터베이스를 재부팅해도 효과가 없자 18:20 에 인스턴스를 키워 메모리와 CPU, burst balance 를 늘렸다. 데이터베이스가 돌아오는 동안 VM 프로비저닝 서비스를 줄여 연결이 몰리지 않게 했고, 19:15 에 한 번 더 키웠다.
- VM 프로비저닝 서비스를 줄이고, vm-create 대기열을 키우던 remote-docker 작업이 실행되지 않게 막아 부하를 덜었다.
- 21:00 에 새 VM 을 만들고 오래된 VM 을 지우는 파드를 모두 줄여 VM 을 만들고 지우지 못하는 순환을 끊었다.
- 21:57 에 remote-docker 작업을 프로비저닝 대기열에 넣지 않는 새 분배 백엔드를 배포했고, 22:21 에 프로비저닝 시스템을 줄여 대기열이 빠질 여유를 만들었다.
- 22:36 부터 두 시간 동안 프로비저닝과 분배 시스템의 구성 요소를 하나씩 안정성을 확인하며 다시 올렸고, 00:39 에 모두 돌아오자 완화용 코드 변경을 되돌렸다.
후속 조치
- VM 프로비저닝이 부하 변화에 더 잘 버티고 thundering herd 에서 회복하도록 고친다.
- VM 프로비저닝을 분리해 그 실패가 Docker 작업에 영향을 주지 않게 한다.
- RabbitMQ 와 운영 대기열들의 관측성을 점검하고 보강한다.
- 요청을 묶어 보내 GCP API 요청 한도에 걸리지 않게 한다.
- 오래 이어지는 장애에 맞게 장애 대응 방식을 보강한다.
교훈
–
출처
- https://status.circleci.com/incidents/qxkj1832wf9l · official-status · 보관본
관련 사례
IL-0572Merpay 회계 이벤트 처리 시스템에서 Cloud Pub/Sub 메시지 1000만 건이 밀려 새 회계 데이터가 하루 넘게 Cloud Spanner에 들어가지 못했다Mercari · 2026같은 원인 · 공통 데이터베이스, 메시지 브로커
같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0316밀린 배포가 한꺼번에 몰린 Control Plane 에서 새 버전 PgBouncer 가 CPU 와 메모리를 비정상적으로 많이 써 데이터베이스 연결이 타임아웃됐다Railway · 2025같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0444Aurora MySQL 에서 ALTER TABLE 을 실행할 때마다 그 테이블을 reader 로 읽던 커넥션이 끊겨 애플리케이션 오류가 쏟아졌다Repro · 2024같은 원인 · 공통 데이터베이스
IL-0117인그레스 업그레이드가 네트워크 컨트롤 플레인 회귀를 일으켜 데이터 플레인이 잠깐 끊겼고, 한꺼번에 재시작한 서비스들이 백엔드 저장소에 과부하를 일으켜 OpenAI API 오류가 늘었다OpenAI · 2024같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
IL-0308RevenueCat 이 Aurora PostgreSQL 10 에서 14 새 클러스터로 넘어간 직후 쿼리가 극도로 느려져 대시보드와 SDK 엔드포인트가 세 시간 넘게 실패했다RevenueCat · 2022같은 원인 · 공통 데이터베이스
같은 원인 · 공통 데이터베이스
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0294
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0294/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.