발표자는 ardoc 2.2를 대상으로 한 실제 시연을 통해 메모리 프로파일러의 기능을 상세히 설명합니다. ardoc 2.2는 17,000줄 이상의 코드를 가진 복잡한 애플리케이션으로, 문서 생성에 50분 이상 소요되고 1.3GB의 메모리를 사용하는 성능 문제를 가지고 있었습니다.
메모리 누수 진단 및 해결 과정
-
문제 식별: 프로파일러를
ardoc에 연결하여 실시간으로 클래스별 인스턴스 수, 크기, 총 메모리 사용량 및 동적 그래프를 관찰했습니다.Hash객체의 생존율이 99%로 매우 높고, 라이브 인스턴스 수가 지속적으로 증가하며 전체 메모리 사용량 그래프가 상승하는 경향을 보여Hash객체로 인한 메모리 누수를 의심했습니다. -
누수 위치 특정: 할당 호출 추적(allocation call trace) 기능을 활성화한 후,
Hash객체가Jane what two함수에서 생성됨을 확인했습니다. -
문제 해결 및 검증: 해당 코드(단 3줄)를 수정하고 프로파일러로 재검증한 결과,
Hash객체의 생존율과 라이브 인스턴스 수가 감소하고 메모리 사용량 그래프가 안정화되는 것을 확인했습니다. 수정 후ardoc의 실행 시간은 단축되었고 메모리 사용량도 줄어들었습니다.ardoc 2.3버전부터는 이 메모리 누수 문제가 해결되었다고 언급했습니다.
프로파일러의 주요 기능 및 아키텍처
-
데이터 수집: Ruby VM으로부터 객체 생성/삭제, GC 시작/종료 등 다양한 데이터를 수집하여 클래스별 통계, 할당 호출 추적, 동적 메모리 그래프, GC 상태 등의 분석 리포트를 제공합니다.
- 고급 기능:
- 온라인/오프라인 모드: 실시간 모니터링 또는 데이터 저장 후 분석이 가능합니다.
- 동적 연결/분리: 애플리케이션 실행 중 언제든지 연결/분리 가능하며, 분리 시 오버헤드는 0입니다.
- 로컬/원격 지원: 로컬 및 원격 Ruby 애플리케이션 프로파일링을 지원합니다.
- 데이터 수집 제어: 필요한 데이터만 선택적으로 수집하여 오버헤드를 조절할 수 있습니다.
- 설계 및 구현: 대상 Ruby VM에 미치는 영향을 최소화하고 높은 모듈성을 확보하는 것을 목표로 합니다. Ruby VM 수정, C 확장 백엔드, 소켓 기반 통신 채널, Java Swing 프론트엔드로 구성된 분리형 아키텍처를 채택하여 무거운 작업을 프론트엔드로 분산시켜 VM 부하를 줄입니다.