역사 속의 소프트웨어 오류

248일마다 재부팅해야하는 보잉787

보잉(Boeing)의 차세대 여객기 787

보잉은 1990년대 후반 767의 차세대 모델로 마하 0.98의 속도를 내면서 연료소모는 보잉 767과 비슷한 보잉 소닉 크루져(Sonic Cruiser)를 주요 항공사에 제안했다. 당시 보잉의 주력 기종 보잉767-300은 순항속도가 마하 0.8(851km/h) 에 불과하지만 마하 0.98의 소닉 크루저는 약 1200km/h 로 30%의 비행시간을 단축시킬 수 있기에 많은 항공사들이 이 비행기에 관심을 보였다.

하지만 2000년대 들어 상황이 급변했다. 2001년 9.11 테러로 인해 항공수요가 감소하고, 2000년부터 지속적으로 유가가 오르자 항공사들은 속도보다는 연료 효율에 더 관심을 가지게 되었다. 이에 보잉은 소닉 크루저 프로젝트를 취소하고 경제성을 중시한 보잉787을 계획하게 된다.

전일본공수(ANA)가 운영하고 있는 보잉787
전일본공수(ANA)가 운영하고 있는 보잉787

보잉787 사건 사고들

이렇게 경제성을 염두에 두고 개발된 보잉787은 기존 항공기 대비 연료효율이 20% 높았기 때문에 많은 항공사의 러브콜을 받았다. 2011년 11월 1일 전일본공수(ANA)의 하네다-히로시마, 하네다-오카야마 노선을 시작으로 속속 주요 항공사에서 보잉787을 도입하기 시작했다. 한국의 국적 항공사인 대한항공도 현재 10대를 주문한 상태다.

이렇게 잘 나가던 보잉787에 제대로 찬물을 끼얹는 사건이 있었으니, 바로 2013년에 터진 2건의 배터리 발화사건이다.

2013년 1월 16일 오전 8시 25분, 전일본공수 NH-692편 보잉787이 일본 야마구치현 우베(宇部) 공항을 떠나 도쿄 하네다(羽田) 공항으로 향하고 있었다. 이륙 후 약 15분 정도가 흐른 시간이었다. 갑자기 조종실에 배터리 이상을 알리는 신호가 켜진 뒤 이상한 냄새가 나기 시작했다. 기체 결함을 직감한 조종사는 재빨리 근처 가가와(香川)현 다카마쓰(高松)공항에 비상 착륙했고, 승객 129명과 승무원 8명은 긴급 탈출용 슬라이드를 이용해서 지상으로 긴급 탈출했다. 그 와중에 5명이 경미한 부상을 입었다. 조사결과 원인은 배터리 발화로 밝혀졌다.

이 사건 1주일 전인 1월 7일에는 일본항공(JAL) 소속 여객기가 미국 보스턴 로건 국제공항에서 대기 중 배터리 화재가 발생하여 현지 소방대원이 총 출동해 40분에 걸쳐 진화하기도 했다.

미국 보스턴 로간 국제공항에서 발생한 일본항공(JAL) 소속 보잉787기의 화재를 진압하고 있는 소방대원들. Public domain

결국 2013년 1월 16일 미국 연방항공청(FAA)는 긴급안전명령을 발동, 보잉787의 안전문제가 잠정 해결될 때까지 이 기종의 운항을 전면 금지시켰다. 덕분에 전 세계에서 운항되고 있던 보잉787기 50대 모두 운항이 정지됐다가 배터리 결함을 수리한 후 2013년 5월이 되서야 운항이 재개되는 굴욕을 겪었다.

터졌다! 소프트웨어 버그!

최근 자동차와 비행기와 같은 운송 수단에서 소프트웨어의 비중이 점점 높아지고 있다. 대표적 민간 항공기 개발사인 보잉도 예외는 아니어서 이 글의 주인공 보잉787의 소스코드는 무려 700만 줄이나 된다. 보잉의 전작 보잉777보다 3배나 많은 양이다. 소스코드가 커지면 그 만큼 버그의 위험도 높아지는 법. 2015년 5월 1일 – 드디어 문제가 발생했다.

FAA는 5월 1일, 발표자료를 통해 보잉787의 소프트웨어에 버그가 존재하며, 이 버그로 인해 모든 동력을 상실하여 조종사들이 항공기를 조종할 수 없는 상황에 직면할지 모른다고 경고했다.

버그, 그 이유는?

FAA는 그 원인으로 항공기의 발전기를 지목했다. 이 발전기가 연속해서 248일 이상 전원이 켜져 있을 경우, 소프트웨어 버그로 인해 발전기 작동이 중단된다는 것이다. 발전기 작동이 멈추면 비행에 필요한 전력을 생산할 수 없기 때문에, 만약 248일째 비행 중이라면 그대로 추락할 수 있는 위험이 있다.

왜 하필 248일?

여기서 드는 의문 – 왜 버그가 발생하는 시점이 하필 “248일” 일까? 7일도 있고, 한 달도 있는데. 문제는 카운터에 있었다. 이 카운터는 100ms 마다 1씩 증가하는데, 이 카운터 값을 저장하는 변수는 부호 있는 32비트 정수일 것으로 예상한다. 그러면 이 변수가 담을 수 있는 최대 값은 2^31 이며, 이 값이 100ms 마다 1씩 증가하기 때문에 (100ms * 1분당 초 * 1시간당 분 * 하루 당 시간)을 나눈다.

(2^31)/(100*60*60*24) = 248.551348…..

그 값은 정확하게 248.55를 가리킨다. 이제 모든 것이 밝혀졌다. 계속해서 비행기의 전원을 켜놓으면 248.55일마다 해당 변수에 Integer Overflow가 발생해서 소프트웨어에 장애가 발생했다. 이 장애 때문에 발전기 작동이 중지되어 전력을 생산하지 못하고, 따라서 비행기를 조종할 수 없는 상황이 발생할 수 있다.

문제가 일어날 확률은 낮다.

보통 항공기를 정비할 때 점검의 일환으로 전체 전원을 껐다가 켜기 때문에 248일 이상 계속 전원이 켜져있는 경우는 없다고 해도 과언이 아니다. 그래서인지 2013년 보잉787의 배터리 발화 문제가 발생했을 때 모든 787기의 운항을 금지했던 FAA도 이번에는 시정명령만 내리고 운항정지는 내리지 않았다. 하지만 버그는 버그. 보잉은 패치를 통해 해당 문제를 해결한다고 밝혔다.

참고자료

  1. “To keep a Boeing Dreamliner flying, reboot once every 248 days”, Edgar Alvarez ,  Engadget, 1 May 2015. (링크)
  2. FAA 발표 자료(링크)
  3. http://blog.klocwork.com/software-complexity/software-complexity-lines-of-code-and-digital-derby/
  4. “일본 ANA 보잉787기서 연기…승객 긴급탈출(종합)”, 연합뉴스, 2013.01.16(링크)
  5. “Pictured: Terrifying picture of burned out lithium battery that grounded Boeing’s hi-tech Dreamliner jets across the globe”, DailyMail, 18 January 2013 (링크)

Leave a Reply

Leave a Reply

Your email address will not be published. Required fields are marked *