IL-0253 Mozilla · 2022-01-13gcpnetworking
Firefox 가 네트워크 스레드의 무한 루프에 빠져 전 세계에서 2시간 가까이 웹 페이지를 열지 못했다
Firefox 의 업데이트, 텔레메트리, 인증서 관리, 크래시 보고 같은 내부 서비스는 여러 클라우드 제공자에 올라가 있고 로드 밸런서가 부하를 나눈다. GCP 로드 밸런서의 HTTP/3 지원 설정은 "Enabled", "Disabled", "Automatic (default)" 셋 가운데 하나를 고르게 되어 있고, Mozilla 는 "Automatic (default)" 로 두었다. 2022년 1월 13일 07:28 UTC 에 GCP 가 예고 없이 HTTP/3 를 기본으로 바꿨고, Firefox 는 서버가 지원하면 HTTP/3 를 쓰므로 내부 서비스로 가는 연결 일부가 HTTP/2 대신 HTTP/3 를 쓰게 됐다. 업데이트처럼 아주 중요한 서비스는 beConservative 플래그를 써서 HTTP/3 같은 실험적인 기술을 연결에 쓰지 않는다.
Firefox 의 HTTP/3 연결은 모두 네트워크 스택 Necko 를 거친다. 네트워크에 직접 접근해야 하는 Rust 구성 요소는 viaduct 라는 중간 라이브러리를 통해 Necko 를 부른다. Necko 의 상위 API 는 업로드 요청에 Content-Length 헤더가 있는지 대소문자를 가리지 않고 확인하고 없으면 넣는다. 하위 HTTP/3 코드는 이 헤더로 요청 크기를 정하는데 대소문자를 가려서 찾는다. viaduct 는 헤더를 모두 소문자로 바꿔 넘기므로, viaduct 를 거친 요청은 상위 확인은 통과하지만 HTTP/3 코드는 헤더를 찾지 못한다. Firefox Desktop 에서 네트워크 스택을 쓰면서 Content-Length 헤더를 넣는 Rust 구성 요소는 지금 Telemetry 하나뿐이다.
헤더를 찾지 못한 HTTP/3 코드는 요청이 끝났다고 보고 실제 본문을 보내지 않았다. 그런데 이 코드는 보낼 내용이 남지 않아야 끝나기 때문에 오류를 내지 않고 끝없이 돌았다. 모든 네트워크 요청이 소켓 스레드 하나를 거치므로 이 루프가 다른 통신을 모두 막아 Firefox 가 응답하지 않았다. Mozilla 는 09:12 UTC 에 GCP 에서 HTTP/3 를 명시적으로 껐고 사용자들이 다시 브라우저를 쓸 수 있게 됐다.
- 심각도
- –
- 영향 범위
- Firefox could not load web content; the browser hung on its single network socket thread
- 영향 사용자
- Firefox users worldwide
- 지역
- worldwide
- 감지까지
- –
- 복구까지
- 1h 44m
증상
2022년 1월 13일 07:28 UTC 직후 크래시 리포터로 들어오는 크래시가 갑자기 늘었고, Mozilla 안팎에서 브라우저가 멈춘다는 신고가 여럿 들어왔다. 전 세계 사용자의 Firefox 가 2시간 가까이 웹 콘텐츠를 불러오지 못하고 쓸 수 없는 상태가 됐다.
처리되지 않은 크래시 보고가 쌓여 30만 건 가까이 됐다.
조사해 보니 Firefox 는 내부 서비스 하나로 가는 네트워크 요청 안에서 멈춰 있었다. 모든 네트워크 요청이 소켓 스레드 하나를 거치기 때문에 이 스레드가 막히자 다른 네트워크 통신도 모두 막혔다.
팀은 문제를 일으킨 변경을 찾아보았지만 Mozilla 쪽에서는 원인이 될 만한 업데이트나 설정 변경을 내보낸 적이 없었다. HTTP/3 는 Firefox 88 부터 켜져 있었고 인기 있는 웹사이트 몇 곳도 이미 쓰고 있었다. 팀은 클라우드 제공자 쪽에서 로드 밸런서 동작을 바꾸는 변경이 눈에 띄지 않게 나갔다고 의심했다. 자세히 살펴보니 Mozilla 의 설정은 하나도 바뀌지 않았다. 그러다 로그에서 Telemetry 서비스의 로드 밸런서가 전에 없던 HTTP/3 연결을 받고 있는 것을 찾았다.
Telemetry 를 끈 사용자는 증상이 사라졌다. 여러 도구와 원격 서비스로 시험해도 재현되지 않았고, 원래 설정 그대로 둔 Telemetry 스테이징 서버에 평범하게 연결해도 재현되지 않았다. Firefox 자체로 스테이징 서버에 연결했을 때만 재현됐다.
증상 서비스 중단
원인
원인 소프트웨어 결함
- 촉발
- 2022년 1월 13일 07:28 UTC 에 GCP 가 예고 없이 로드 밸런서의 HTTP/3 를 기본으로 켰다. Mozilla 의 로드 밸런서는 "Automatic (default)" 설정이어서 Firefox 가 Telemetry 서비스로 여는 연결 일부가 HTTP/2 대신 HTTP/3 를 쓰게 됐다.
감지
크래시 리포터로 들어오는 크래시가 갑자기 늘었고, Mozilla 안팎에서 브라우저가 멈춘다는 신고가 여럿 들어왔다.
조치
- 09:12 UTC 에 GCP 에서 HTTP/3 를 명시적으로 껐다.
후속 조치
- GCP 와 함께 예고 없는 기본값 변경 문제를 개선한다.
- 비슷한 실수를 막으려고 모든 서비스의 설정을 다시 검토한다.
- HTTP 버전을 바꿔 가며 시스템 테스트를 더 돌린다.
- 이런 문제에 브라우저가 더 잘 견디고 사고 대응이 더 빨라지도록 할 조치를 찾는다.
교훈
문제는 처음 보기보다 훨씬 복잡했고 여러 요인이 함께 작용했다. GCP 가 HTTP/3 기본값 변경을 예고했다면 사고를 완전히 막지는 못했어도 스테이징 환경 같은 곳에서 더 통제된 실험과 배포를 할 수 있었을 것이다. 로드 밸런서를 명시적인 값 대신 "Automatic (default)" 로 둔 탓에 변경이 저절로 적용됐다. Firefox Desktop 에서 HTTP/3 와 viaduct 를 함께 쓰는 조합은 CI 가 시험하지 않았다. 모든 조합을 시험할 수는 없어도 HTTP 버전 선택이나 viaduct 같은 추가 네트워크 계층은 시험했어야 했다. HTTP 버전을 바꿔 가며 시스템 테스트를 더 돌렸다면 이 문제를 찾았을 것이다.
출처
관련 사례
IL-0150DynamoDB DNS 자동화의 경쟁 조건이 us-east-1 리전 엔드포인트의 DNS 레코드를 비워 DynamoDB 와 EC2 인스턴스 시작이 실패했고, 그 여파로 EKS, ECS, Fargate 의 컨테이너 시작과 클러스터 스케일링이 14시간 넘게 막혔다Amazon Web Services · 2025같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
IL-0131새로운 형태의 GenerateContent 요청이 Vertex AI 예측 API 서버에 세그폴트를 일으켰고, 동시에 재시작하는 서버가 늘자 서빙 용량이 모자라 여러 리전에서 오류가 치솟았다.Google Cloud · 2024같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
IL-0243Google External Proxy Load Balancing 뒤의 HTTP/S 엔드포인트가 전 세계에서 Google 404 오류를 냈다Google Cloud · 2021같은 원인 · 공통 클라우드 로드 밸런서
IL-0106잘못된 IngressRoute 매니페스트가 Traefik v2 버그를 건드려 Traefik 파드가 모두 재시작된 뒤 Kubernetes 의 모든 서비스가 404 를 냈다DFDS · 2021같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
같은 원인 · 공통 클라우드 로드 밸런서
IL-0338Google Cloud 의 HTTP(S) 로드 밸런서와 TCP/SSL Proxy 로드 밸런서가 32분 동안 요청의 33~87% 에 502 나 연결 재설정을 냈다Google Cloud · 2018같은 원인 · 공통 클라우드 로드 밸런서
IL-0395Google Cloud HTTP(S) Load Balancer 가 한참 오래된 구성으로 되돌아가 요청의 25%가 22분 동안 502 오류로 실패했다Google Cloud · 2017같은 원인 · 공통 클라우드 로드 밸런서
IL-0396새로 만들거나 라이브 마이그레이션한 GCE 인스턴스, Cloud VPN 터널, 네트워크 로드 밸런서가 2시간 8분 동안 공인 IP 주소로 연결되지 않았다Google Cloud · 2017같은 원인 · 공통 클라우드 로드 밸런서
내 클러스터에도 있는지 확인하기
AI 도구와 스크립트용
- 이 사례의 JSON: https://incidentlib-api.benchlet.com/cases/IL-0253
- 가장 비슷한 사례들: https://incidentlib-api.benchlet.com/cases/IL-0253/similar
- MCP 서버(Streamable HTTP, 키 없음):
https://incidentlib-mcp.benchlet.com/mcp
API 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.