당신들은 모른다. 진정한 인프라 장애라는 게 어떤 맛인지.
새벽 3시 17분, PagerDuty가 울렸다. eu-west-2의 Lightsail 인스턴스가 응답을 멈췄다는 알림이었다. 보통 같으면 "또 네트워크 블립이겠지" 하고 넘겼을 텐데, 이번엔 달랐다. 인스턴스 메트릭을 보니 CPU 크레딧 소진 3분 전에 커널 패닉이 발생해 있었다. 정확히 3분 전이다. 우연이라고? 나는 그런 말을 믿지 않는다.
## 범인은 AMI 조합이었다
로그를 까보니 문제의 인스턴스는 `ubuntu-focal-20.04-amd64-server-20220419`(이제 이런 구체적인 빌드 넘버를 기억하는 사람도 드물겠지) 위에 `c5.large` 번들로 돌아가고 있었다. 평소에는 멀쩡했다. 그런데 누군가 여기에 `amazon-ssm-agent`의 특정 빌드(`3.1.1374.0`)를 올리고, 동시에 `linux-aws-5.15` 커널 모듈과 충돌하는 `ena-driver` 버전을 끼워넣은 모양이었다.
이 조합이 뭘 일으키냐고? 버스트 크레딧이 특정 임계치 아래로 떨어질 때, `cpufreq` 거버너가 `performance`에서 `powersave`로 전환되는 순간 커널이 잘못된 전력 상태 테이블을 참조하게 만든다. 결과는? *panic*. 그냥 패닉이 아니라 `Kernel panic - not syncing: Fatal exception in interrupt`를 띄우면서 죽는다. 크레딧 소진이 원인이 아니라, 그 전환 과정이 트리거인 셈이지.
## 복어와 크레딧의 공통점
여기서 왜 내가 부산 해운대 복어 맛집 추천을 꺼내는지 궁금할 거다. 들어봐라.
복어는 잘못 손질하면 독이다. 테트로도톡신이라는 놈이 신경을 마비시킨다. 근데 이 독이 재밌는 게, 완전히 치사량에 도달하기 직전까지는 아무 증상이 없다가 임계점을 넘는 순간 호흡 근육이 멈춘다. CPU 크레딧 소진 3분 전에 커널이 죽는 현상과 판박이다. 표면적으로는 "크레딧이 부족해서"일지 몰라도, 진짜 원인은 그 전의 조합(복어의 독, 인프라의 드라이버 충돌)에 있다.
해운대의 복어 맛집들은 이걸 직관적으로 안다. 진짜 잘하는 집은 복어의 종류(참복인지 까치복인지 밀복인지)와 부위별 독성 분포를 꿰고 있다. 그걸 모르는 집은 그냥 "신선한 복어"만 강조한다. 마치 AWS가 "성능 좋은 인스턴스"만 강조하는 것처럼.
## ★★☆☆☆ 별점의 변명
내가 Lightsail에 별점을 매긴다면 5점 만점에 2점이다. 이유는 단순하다. `cloud-init` 로그 레벨을 `DEBUG`로 올리지 않으면, 이 에러의 전조 증상을 절대 캐치할 수 없기 때문이다. 공식 문서 어디에도 이 조합에 대한 경고는 없다. 그들은 "버스트 크레딧을 모니터링하라"고 말한다. 근본적인 원인을 숨기는 방식이다.
해운대에서 복어 맛집을 추천할 때도 마찬가지다. 그 집이 어떤 복어를 쓰는지, 손질 자격증이 있는지, 테트로도톡신에 대해 얼마나 아는지 물어봐라. 대답이 흐리면 거르는 게 맞다.

## 그래서 진짜 해결책은?
`/etc/default/grub`에 `processor.max_cstate=1 intel_idle.max_cstate=0`을 박아라. 마음에 들지 않는 해결책이지만, 최소한 새벽 3시에 페이저 울리는 것보단 낫다. 그리고 `3.1.1374.0`보다 상위 빌드의 SSM 에이전트를 써라. 그들은 패치 노트에 적지 않았지만, 이 충돌을 알고 조용히 고쳤다.
복어 맛집도 마찬가지다. 해운대에서 진짜를 찾으려면, 메뉴판에 "복어"라고만 써놓은 집은 피하고, 복어 종류를 명시하며 계절별로 메뉴가 바뀌는 집을 가라. 그 집들은 자신들이 뭘 다루는지 알기 때문에, 당신에게 독이 되는 조합을 내놓지 않는다. 인프라도, 복어도, 결국은 조합과 타이밍의 미학이다.