Incident Library
  • 원인
  • 구성 요소
  • 증상
  • 기여 요인
  • 사례

사례2건

2건 중 1~2번째

  1. 증상

    2024년 6월 12일 12:06 US/Pacific 부터 Vertex AI Online Prediction, Dialogflow CX, Agent Assist 에서 여러 리전에 걸쳐 오류율이 올라갔다. 영향을 받은 리전은 us-central1, asia-southeast1, europe-west3, europe-west4, us-east1, us-west1, northamerica-northeast1, us-east4 였다.

    촉발

    6월 8일부터 새로운 형태의 GenerateContent API 요청이 Vertex Serving Prediction API 서버에 간헐적인 세그폴트를 일으켰고, 6월 12일 이런 요청의 비율이 늘었다.

    원인
    구성 요소
    기여 요인
    감지

    6월 10일 07:35 US/Pacific 에 내부 운영 모니터링이 엔지니어들에게 세그폴트 문제를 알렸다. 이때는 고객 영향이 없었다. 6월 12일 12:06 에는 Vertex Prediction 위에 만든 여러 서비스에서 운영 중인 사용자 요청이 영향을 받았다는 보고가 올라왔다.

    조치
    • 6월 12일의 새 장애가 6월 10일에 찾은 세그폴트와 원인이 같다는 것을 확인했다.
    • 이미 진행 중이던 수정본 배포를 앞당겨 15:59 US/Pacific 에 마쳤다.
    후속 조치
    • 서버 바이너리 문제의 초기 신호를 운영 상태 분석에서 잡아내고 제때 조사하게 한다.
    • 기능 변경과 업데이트를 운영에 내보낼 때 릴리스 검증을 거치게 한다.
    교훈

    로드밸런서가 크래시로 내려간 서버를 피해 요청을 보내는 동안에는 고객 영향이 보이지 않는다. 하지만 크래시를 일으키는 요청이 늘면 동시에 빠지는 서버가 늘어 서빙 용량이 부하를 감당하지 못하게 된다. 이번에는 6월 10일에 원인과 수정본이 이미 있었지만 단계적 배포가 끝나기 전에 고객 영향이 시작됐다. 서버 바이너리의 초기 이상 신호는 고객 영향이 없을 때도 운영 상태 분석에서 잡고 제때 조사해야 한다.

  2. 증상

    2024-04-22 CET 8:45 부터 Hugging Face Hub 가 불안정해졌고, 9:30 에는 응답하지 않았다. 대부분의 사용자에게 Hub 웹사이트가 느려지거나 아예 열리지 않았다.

    촉발

    *_info_cache 컬렉션을 쓰는 무거운 API 요청이 갑자기 늘었다. 첫 장애 직전에는 https://huggingface.co/api/datasets/lighteval/mmlu/revision/main 호출이 크게 늘었고, 4월 23일 밤에는 https://huggingface.co/api/models/sentence-transformers/all-mpnet-base-v2/revision/main 요청이 늘었다.

    원인
    구성 요소
    기여 요인
    감지

    장애는 4월 22일 8:45 부터 Hub 가 불안정해지다가 9:30 에 응답하지 않으면서 드러났다. MongoDB Atlas 지표에서 읽기 전용 노드 두 대가 계속 재시작하는 것이 보였다. 24일 10:03 에는 팀이 수상한 지표를 보고 Hub 가 다시 멈추기 전에 rate limit 을 걸었다. 근본 원인은 URL 별 요청 수 그래프를 새로 만든 뒤에 찾았다.

    조치
    • Java/* user-agent 를 단 요청을 모두 막는 방화벽 규칙을 넣었다.
    • Hub 의 quicksearch 기능을 껐다.
    • MongoDB Atlas 클러스터를 손으로 tier 2 에서 tier 3 으로 올렸다.
    • AWS WAF 로 유지보수 모드를 켜 503 페이지를 띄우고 들어오는 트래픽을 막았다.
    • Hub 파드를 모두 0 으로 줄였다가 다시 올렸다.
    • 아주 엄격한 rate limit 을 걸었다.
    • 요청에 타임아웃을 넣고, 오래 걸리거나 응답 본문이 큰 데이터베이스 쿼리를 다시 짰다.
    후속 조치
    • 요청마다 평소 완료 시간에 맞춘 타임아웃을 넣었다.
    • 장애 중 오래 걸리거나 응답 본문이 큰 요청을 찾아 최적화하고, 잘못 설계된 데이터베이스 쿼리를 다시 짰다.
    • 쓰지 않는 오래된 인덱스를 지워 데이터베이스를 정리했다.
    • 장애 중 새 대시보드와 모니터링 지표를 만들었다.
    • *_info_cache 를 Redis 로 옮긴다.
    • 클라이언트가 요청을 취소하면 데이터베이스 요청도 취소할 수 있게 한다.
    교훈

    Hub 팀은 모든 차트를 봐도 답이 없을 때 URL 별 요청 수라는 새 그래프를 만들어서야 원인을 찾았다. 클라이언트가 떠난 뒤에도 서버가 데이터베이스 요청을 계속 돌리면, 서비스가 느려졌을 때 사용자가 누르는 새로고침이 부하를 몇 배로 키운다. 무거운 요청 몇 가지가 데이터베이스 전체를 흔들 수 있으므로 요청별 타임아웃과 취소가 필요하다. 팀은 이번 일로 어떤 지표를 더 가까이 봐야 장애를 미리 막을 수 있는지 알게 됐다. 원인을 찾는 데 2-3일이 걸렸고, 관계없는 장애가 동시에 겹쳐 복구가 더 힘들었다.

내 클러스터에도 있는지 확인하기

이 2건에서 가장 많이 나오는 구성 요소: 클라우드 로드 밸런서, 클러스터 오토스케일러. kubegap 은 Claude Code 나 Codex 에서 쿠버네티스 클러스터를 읽기만 하며 이런 틈을 점검합니다. 점검 항목의 근거는 이 라이브러리와 같은 공개 보고서입니다.

원인별1