Rails 앱이 RAM을 지나치게 많이 차지하고 있나요? 사실 이제 와서 놀랄 일은 아니지만, 그렇다고 '원래 그런 것'이라고 받아들일 필요는 없습니다. 애플리케이션의 메모리 사용량이 커진 원인이 하나 이상의 무거운(bloated) gem에 있을 가능성도 있습니다.
Derailed란?
최근 Richard Schneeman이 만든 아주 유용한 오픈소스 프로젝트를 발견했습니다. 이름은 Derailed이며, 자동 벤치마킹 도구 모음입니다. GitHub 저장소에서 소스 코드를 확인할 수 있습니다.
사용법도 간단합니다. 다음과 같이 Gemfile에 추가하기만 하면 됩니다:
gem 'derailed', group: :development
gem "stackprof", group: :development
Gem별 메모리 사용량 확인하기
설정이 끝나면 부팅(컴파일) 시점에 각 gem이 얼마나 많은 메모리를 요구하는지 정확하게 확인할 수 있습니다.

위 화면처럼 bundle:mem 명령을 실행하면 gem별 메모리 점유율이 큰 순서대로 정렬되어 표시됩니다. 어떤 gem이 병목인지 한눈에 파악할 수 있습니다.
객체 할당 정보 분석하기
메모리 용량뿐만 아니라, 로드 시점에 각 gem이 얼마나 많은 객체를 할당하는지도 확인할 수 있습니다.

bundle:objects 명령을 사용하면 객체 할당 관련 상세 정보를 얻을 수 있으며, 불필요한 객체 생성으로 인한 메모리 낭비를 추적하는 데 유용합니다.
런타임 메모리 측정
뿐만 아니라 애플리케이션이 실제로 실행되는 동안의 메모리 사용량을 측정하는 도구도 함께 제공됩니다. 다만 이 기능들은 개발 환경에서 앱을 프로덕션 모드로 구동할 수 있어야 사용할 수 있기 때문에, 아직 직접 테스트해 보지는 못했습니다.
마무리
Rails 앱의 메모리 문제는 대체로 특정 gem에서 비롯되는 경우가 많습니다. Derailed를 활용하면 추측이 아닌 데이터에 기반해 원인을 좁혀 나갈 수 있으니, 메모리 최적화가 필요하다면 꼭 시도해 볼 만한 도구입니다.