Offcanvas

How To / 개발자 / 애플리케이션 / 오픈소스 / 자기계발

'앱 메모리 누수를 차단하라' 페이스북 SW 엔지니어 2인의 이야기

2015.08.26 Joab Jackson  |  IDG News Service

끝없는 디버깅에 지쳤는가? 여기 프로그래머들을 위해 잠시 숨을 돌리며 읽어볼 하나의 블로그 포스트를 소개해본다. 페이스북에 근무하는 두 소프트웨어 엔지니어가 함께 작성한 것으로, 그들이 어떻게 iOS용 페이스북 앱에 숨어있던 메모리 에러를 잡아냈는지에 관한 이야기와 그 과정에서 얻은 교훈들을 소개하고 있다.

메모리 에러라는 이름만 듣고 이 글을 읽을지 고민하는 개발자들도 많을 것이다. 그 디버깅 과정의 어려움을 잘 알기 때문이다. 일반 사용자들을 위해 설명하자면, 페이스북, 혹은 여타 앱을 구동하다 갑자기 멈춰버리거나 화면이 꺼지는 등의 문제가 메모리 에러로 인한 것이다.

 

페이스북 엔지니어링 블로그에 올린 새 포스트에서 알리 안사리와 그렉 트루샤는 “우선 초기에 문제를 확실히 책정하고, 여기에 알맞은 툴과 마이그레이션, 그리고 최신 iOS 테크놀로지들을 적용해 앱의 신뢰도를 개선하는 것이 가능했다”라고 설명했다.

간단히 말해, 구동 중인 프로그램이 사라지는 것은 OS가 그것을 차단했기 때문이고, 그 원인은 대부분 해당 앱이 본래 할당된 메모리 공간을 초과해 작업을 진행하기 때문이다. OS는 모든 구동 프로그램들에 일정량의 시스템 메모리를 할당해 각자의 작업을 보장하곤 한다.

또 프로그램이 갑작스레 대규모의 추가 메모리를 요청하는 경우에도 OS가 이를 종료하는데, 주로 메모리 누수(memory leak) 오류가 있는 경우 이런 문제가 발생한다. 온전하게 동작 중인 시스템도 여타 이유로 시스템 메모리가 고갈되는 경우 종료되기도 한다.


페이스북 엔지니어링 팀 내부에선 백그라운드 프로그램이 갑자기 종료되는 문제를 BOOM(Background Out-Of-Memory error, 백그라운드 에너지 고갈 오류), 그리고 스크린에 띄워져 있는 프로그램이 종료되는 문제를 FOOM(Foreground Out-Of-Memory error)라 줄여서 구분한다.


차단 이전에 iOS는 앱에 해당 사실을 알리는 경고 메시지를 발송하지만, 앱이 차단 이전에 그것을 기록한다고 보장하기는 어렵다.

안사리와 트루샤는 “확실한 로그가 없기 때문에 우리로썬 앱이 종료된 것이 메모리 문제로 인한 OS 측에서의 차단이었는지를 확인할 방법이 없었다”라고 설명했다.

그럼에도 페이스북 엔지니어들은 iOS용 페이스북 앱의 전반적인 메모리 캐시를 낮추는 몇 가지 기법을 개발했다.

간단하게는 OS에게의 메모리 요청 및 반환 과정을 보다 간소화하는 기법도 새로 적용했다.

작업 초기 페이스북 엔지니어링 팀은 앱이 필요로 하는 메모리 량을 초과해 이용하지 않는데 초점을 맞춰 작업을 진행했다. 웹 페이지 보기 등의 신규 동작 수행을 위해 앱이 추가적인 메모리를 요구하는 경우면 OS에 이를 요청하되, 해당 작업이 끝나면 곧바로 반환함으로써 잉여 메모리를 남겨두지 않는 식이었다.

그러나 이런 방식으로는 앱 내 충돌 횟수를 유의미하게 줄이는 것이 어려웠다. 반환한 메모리를 iOS가 회수하지 않는 경우가 많았기 때문이다.

이에 대한 대안으로 아예 할당 메모리 규모에 변화를 주지 않음으로써 충돌을 낮추는 방법이 제안됐다. 앱 개시 시점에 필요로 하는 모든 메모리를 요청하고, 그 내부에서 메모리를 관리하는 것이다.

이 방식을 통해 엔지니어링 팀은 프로그램 충돌을 30% 줄이는데 성공했다.

애플 본사 측에서도 메모리 할당과 관련한 몇 가지 추가적 지원을 제공했다. iOS 8에서 소개된 새로운 프로그래밍 클래스 WK웹뷰(WKWebView)를 통해, 이제는 웹 페이지 열람이 앱 내 작업들과는 별도의 프로세스로 처리된다.

잠재적 메모리 에러를 감지하기 위해 여러 내부 개발 툴들 역시 적용됐다.

페이스북에서 개발해 오픈소스로 배포한 스캐닝 툴 CT-스캔 인프라스트럭처도 그 가운데 하나다. 본래 모바일 앱 퍼포먼스 튜닝용으로 개발된 CT-스캔은 메모리 누수 감지에 있어서도 탁월한 성능을 보여주고 있다.

엔지니어링 팀의 또 다른 개발물인 인-앱 메모리 분석기는 프로그램이 생성한 모든 메모리 할당을 추적해주지만, 그 자신은 프로그램에 전혀 부하를 전달하지 않는다. 분석기는 페이스북 팀이 프로그램의 테스트 카피를 구동하며 운영 특질을 수집하는데 많은 도움을 줬다.

프로그램이 업데이트되며 페이스북 엔지니어링 팀은 앱의 각 프로세스가 소요하는 메모리 규모를 버전 별로 비교할 수 있게 됐다. 이전 버전과 신형 버전 사이에 가장 큰 차이가 감지된 지점은, 바로 지금까지 포착되지 않았던 메모리 누수였다. ciokr@idg.co.kr 
CIO Korea 뉴스레터 및 IT 트랜드 보고서 무료 구독하기
Sponsored
추천 테크라이브러리

회사명:한국IDG 제호: CIO Korea 주소 : 서울시 중구 세종대로 23, 4층 우)04512
등록번호 : 서울 아01641 등록발행일자 : 2011년 05월 27일

발행인 : 박형미 편집인 : 천신응 청소년보호책임자 : 한정규
사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.