스위스 치즈 모델, 1부
원문은 Marcin Wichary님이 에 게재했습니다. 이 블로그 구독하기
스위스 치즈 모델이라는 말을 들어본 적 있는가? 복잡한 시스템이 어떻게 실패하는지를 설명할 때 종종 등장하는 개념이다. 시각 자료는 보통 이런 모습이다:

핵심 아이디어는 이렇다. 치즈 조각처럼 여러 겹의 안전 장치가 있더라도 각 조각에는 항상 구멍이 있다는 것이다. 보통은 한 조각의 구멍이 앞뒤 조각의 막힌 부분에 가려진다. (예를 들어 주차 모드로 변속하지 않으면 키를 뽑지 못하게 하거나, 핸드브레이크를 채운 채 출발하면 차가 경고음을 울리는 식이다.) 하지만 가끔 그 구멍들이 우연히 일렬로 정렬되면서 더 큰 재난이 일어난다.
이 모델은 과거 사고를 분석하거나 미래의 사고를 예방하는 데 쓰인다. 지지하는 사람도 있고 비판하는 사람도 있다. 이 모델의 적용 사례를 이야기하기 어려운 이유는, 가장 자주 언급되는 예시들이 끔찍하기 때문이다. 나는 내 책에서 Therac-25에 대해 썼는데, 조사하고 쓰는 내내 정말 괴로운 장이었다. 다른 대표적인 사례들 역시 하나같이 암울하다. 체르노빌, 챌린저, 테네리페 공항 참사, 딥워터 호라이즌 폭발 사고 같은 사건들이다.
하지만 나는 이 모델을 공유하고 싶었다. 내 머릿속에서는 이 모델이 UI 디자인에도 적용되고, 때로는 사소한 디테일들이 어떻게 모여 더 큰 전체를 이루는지 생각하는 데 도움이 되기 때문이다.
이번 1부에서는 좀 더 전통적인 예시로 시작해 보자. 다만 그리 극단적이지 않은 사례다. 금융 서비스 및 트레이딩 회사인 나이트 캐피털 그룹의 이야기다. 사고 개요는 헨리코 돌핑의 정리를 빌려 소개하겠다:
2012년 8월 1일 아침, 나이트 캐피털 그룹은 평범한 거래일을 시작하기 위해 시스템을 가동했다. 그러나 몇 분 지나지 않아 회사는 미국 주식 시장에 의도치 않은 주문을 홍수처럼 쏟아내기 시작했다. 수십 개 종목에 걸쳐 비싸게 사고 싸게 파는, 경제적으로 전혀 말이 되지 않고 일반적인 통제 수단으로는 멈출 수도 없는 패턴이었다. 처음에는 단순히 비정상적인 시장 움직임으로 보였던 현상은 곧 미국 최대 마켓 메이커 중 한 곳 내부의 시스템 전반의 실패로 커졌고, 알고리즘은 트레이더도 엔지니어도 실시간으로 완전히 이해할 수 없는 방식으로 작동했다. […]
문제가 파악되어 시스템이 종료된 것은 약 45분 뒤였다. 그 사이 나이트는 154개 종목에 걸쳐 400만 건이 넘는 체결을 발생시켰고, 약 3억 9천7백만 주에 달하는 물량으로 수십억 달러 규모의 포지션을 쌓았으며, 결국 4억 6천만 달러가 넘는 손실을 입었다 […]. 이번 사건의 규모는 단순히 금전적인 차원에 그치지 않고 구조적인 문제였다. 단 한 번의 배포 실패가 미국 주식 거래의 상당 부분을 담당하던 시스템을 통해 파급된 것이다. […]
사건의 경위는 이러했다.
오래전, 회사는 일부 거래를 자동화하기 위해 파워 페그라는 지극히 평범한 기능을 만들었다. 이 기능은 모든 필수 거래가 완료되면 실행을 멈추게 하는 표준 공유 리미터를 사용했다. 몇 년간 사용된 뒤 이 기능은 2003년에 폐기되었고 더 이상 쓰이지 않게 됐지만, 결정적으로 코드는 실제로 제거되지 않았다.
2003년과 2012년 사이 어느 시점에 리미터 기능이 업그레이드되면서 오래된 코드는 더 이상 호환되지 않게 됐다. 운영 환경의 모든 코드는 새로운 리미터를 쓰도록 다시 작성됐지만, 이미 폐기되어 쓰이지 않던 파워 페그 기능만은 그대로 남겨졌다.
2012년, 회사는 자동 거래를 위한 새로운 프로그램을 개발하기 시작했다. 개발자들은 이전에 파워 페그를 활성화하던 소프트웨어 플래그를 재사용하기로 했다. 당시에도 오래된 코드가 남아 있다는 사실은 알려져 있었고, 새 프로그램이 그 코드를 덮어쓸 것이므로 재사용된 플래그는 새 코드만 실행하게 될 거라는 게 아이디어였다.
2012년 7월, 새 코드가 완성됐고 회사는 파워 페그를 덮어쓰는 방식으로 모든 서버에 설치하기 시작했다. 회사는 8대의 서버 모두에 새 코드를 배포하려 했지만, 실수로 7대에만 배포되는 결과가 빚어졌다.
아무도 그 실수를 알아채지 못했다.
이제 전체 그림을 맞춰볼 수 있을 것이다. 이쯤 되면 많은 분들이 문단을 읽을수록 점점 더 얼굴을 찡그리고 계셨으리라 짐작한다.
8월 1일, 새로운 기능을 위한 플래그가 켜졌다. 7대의 서버에서는 모든 것이 정상이었지만, 여덟 번째 서버에서는 그 플래그가 잠들어 있던 코드를 깨워 즉시 실행시켰다. 오래된 코드는 새로운 리미터와 호환되지 않았기 때문에 전혀 제한되지 않았고, 한 시간도 안 돼 수백만 건의 거래가 연쇄적으로 쏟아졌으며 막대한 부수적 피해가 발생했다. 회사가 4억 달러가 넘는 손실을 입었다는 소식이 전해지자 시장이 반응했고, 회사 자체의 주가도 폭락했다.
아, 아직 말하지 않은 게 있다. 이 실패로 회사는 사실상 망했다. (엄밀히는 합병으로 이어졌지만, 파산 직전까지 갔던 나이트 캐피털 그룹이 체면을 살리기 위한 방편에 가까워 보였다.)
스위스 치즈 모델은 이 사례에 어떻게 적용될까? 다섯 조각 치즈에 난 다섯 개의 구멍으로 볼 수 있다:
- 오래된 코드를 실제로 제거하지 않은 실수
- 같은 플래그를 재사용한 실수
- 8대 서버 모두에 배포하지 않은 실수
- 배포를 누군가 이중으로 확인하는 절차를 두지 않은 실수
- 기존 리미터가 실패했을 때 폭주하는 프로세스를 자동으로 감지하고 (나아가 자동으로 중단시킬) 방법을 마련하지 않은 실수
이 모델에서 이해해야 할 중요한 점은, 이 중 어느 하나만 떼어 놓고 보면 객관적으로 사소한 실수이며 다른 조각들에 의해 걸러졌을 것이라는 사실이다. 사실 이 중 네 가지가 동시에 일어나도 재앙으로 이어지지는 않았을 것이다.
하지만 이번 경우에는 다섯 가지 실수가 완벽하게 일렬로 정렬됐다.
이런 사고에 대한 많은 분석은 연쇄 고리 중 하나의 사건만을 탓한다. 이 사례에서는 흔히 코드를 8대 서버에 제대로 배포하지 않은 시스템 관리자를 지목한다. 하지만 이는 주로 우리가 개인의 행위 이야기에 끌리고, 시스템의 이야기를 이해하는 데 익숙하지 않기 때문이다. (스타트렉조차 보그 퀸을 추가하지 않았는가.)
이 사고는 결국 “나이트메어”라 불리게 됐다. 우리에게 더 가까운 시스템에 대한 더 많은 예시는 다음 편에서 이어가겠다.
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기