IL-0012 Omio · 2020-02-17 (게시일)kubernetesgcp
Omio 는 상태 저장 워크로드와 상태 비저장 워크로드를 모두 GKE 에서 돌린다. 가장 흔한 머신 타입은 16코어다. CPU request 는 cpu.share 로 구현돼 스케줄링과 CPU 비례 배분에 쓰인다. CPU limit 은 CFS 쿼터의 두 값인 cfs_period_us 와 cfs_quota_us 로 구현한다. 둘은 설정 모양이 비슷하지만 구현은 전혀 다르고, limit 쪽은 문서도 부족해 오해하기 쉽다.
CFS 쿼터는 CPU 성능이 아니라 시간 주기를 기준으로 한다. cfs_period_us 는 늘 100000us, 곧 100ms 다. limit 2코어는 200ms 쿼터가 되고, 병렬 스레드가 많으면 주기 초반에 쿼터를 다 써서 남은 시간 동안 멈춘다. 게다가 커널 스케줄러의 버그가 불필요한 스로틀링을 일으켰다. 그 결과 여러 애플리케이션이 예상보다 최대 50% 더 스로틀링됐고, 프로브 실패와 연결 끊김과 타임아웃으로 번졌다.
팀은 버그를 고친 최신 커널이 모든 클러스터에 깔릴 때까지 CPU limit 을 껐다. 그러자 서비스의 HTTP 5xx 오류율이 곧바로 크게 줄었다. limit 을 끄면 컨테이너 하나가 머신의 CPU 를 모두 차지할 위험이 있다. Omio 는 주요 언어 스택마다 적절한 기본값을 담은 베이스 Dockerfile 을 자동으로 쓰고 있어서 이 위험이 문제가 되지 않았다.
Omio 는 6개월 동안 원인을 알 수 없는 멈춤을 겪었다. 애플리케이션이 멈추거나 헬스 체크에 응답하지 않았고, 네트워크 연결이 끊겼다.
여러 애플리케이션의 스로틀링 비율이 높았다. limit 을 정할 때 예상한 것보다 최대 50% 더 스로틀링됐다. 이 현상은 readiness 프로브 실패, 컨테이너 멈춤, 네트워크 연결 끊김, 서비스 호출 사이의 타임아웃으로 번졌고, 결국 응답 지연과 오류율 상승으로 이어졌다.
메모리 limit 문제는 파드의 마지막 재시작 상태가 OOMKilled 인지만 보면 알 수 있다. CPU 스로틀링은 쿠버네티스가 사용량 지표만 내보내고 cgroup 지표는 내보내지 않아 알아채기 어려웠다. 스로틀링은 파드 안에서 cat /sys/fs/cgroup/cpu/cpu.stat 을 실행해 확인했다. nr_periods 는 전체 스케줄 주기 수, nr_throttled 는 그중 스로틀링된 주기 수, throttled_time 은 스로틀링된 총 시간을 나노초로 보여 준다.
원인 소프트웨어 결함
팀은 6개월 동안 애플리케이션이 멈추거나 헬스 체크에 응답하지 않는 현상을 겪었지만, 쿠버네티스가 cgroup 지표를 내보내지 않아 스로틀링을 바로 알아채지 못했다. 파드 안에서 /sys/fs/cgroup/cpu/cpu.stat 의 nr_throttled 와 throttled_time 을 읽어 스로틀링 비율을 확인했다.
CFS 쿼터 버그가 고쳐지지 않은 커널을 쓴다면 쿠버네티스에서 CPU limit 을 없애거나 kubelet 에서 CFS 쿼터를 끄는 편이 낫다. CPU request 와 limit 은 설정이 비슷해 보여도 구현이 전혀 다르다. CPU 스로틀링은 쿠버네티스 기본 지표에 드러나지 않으므로 cpu.stat 을 직접 확인해야 한다. limit 을 끄면 최적화되지 않은 애플리케이션이 노드의 CPU 를 독차지할 수 있으니, JVM, Go, Node 런타임을 미리 튜닝해 둬야 한다.
IL-0112 나중에 회수된 EKS 노드 AMI 로 노드를 교체한 뒤 노드가 PLEG is not healthy 를 보고하며 NotReady 를 오갔고 파드 네트워크 타임아웃이 났다DFDS · 2022같은 원인 · 공통 kubelet, 리눅스 커널
같은 원인 · 공통 컨테이너 CPU 한도, 리눅스 커널
IL-0138 nvidia-dkms-390 드라이버 빌드 실패로 망가진 커널 헤더가 몇 주 동안 방치됐다가, 정전 뒤 재부팅하자 하나뿐인 마스터 노드가 커널 패닉에 빠져 홈랩 쿠버네티스 클러스터가 6일 동안 멈췄다.Barush Mendez · 2025같은 원인 · 공통 리눅스 커널
IL-0139 Calico 네트워크 정책을 쓰는 GKE 클러스터를 1.22 이상으로 업그레이드하자 경쟁 조건 때문에 CNI 정리가 Unauthorized 로 실패해 파드가 Terminating 이나 Pending 에 멈췄다.Google Cloud · 2022같은 원인 · 공통 kubelet
IL-0175 JVM 파드의 CPU requests 를 1코어로 줄이자 JVM 이 노드의 CPU 36개를 인식해 Reactor Netty 스레드가 늘고 메모리 사용량이 경보 기준을 넘었다Hyperconnect · 2022같은 원인 · 공통 컨테이너 CPU 한도
https://incidentlib-mcp.benchlet.com/mcpAPI 는 키가 필요 없습니다. MCP 서버는 search_incidents, get_incident, list_incidents, get_topic, vocab 도구를 내놓습니다. 사용법은 API 와 MCP.
같은 원인 · 공통 리눅스 커널
IL-0074 워커 노드가 잇달아 Not Ready 에 빠지고 네트워크와 DNS 실패로 사이드카가 죽으면서, AirMap 플랫폼의 모든 서비스가 다섯 시간 동안 응답하지 않았다.AirMap · 2018같은 원인 · 공통 kubelet