실시간 프로파일러의 주요 특징 및 기능
-
실시간 성능 모니터링: 프로그램 실행 중 언제든지 성능 데이터를 확인할 수 있어, 애플리케이션 상호작용에 따른 성능 변화를 즉시 관찰할 수 있습니다.
-
네트워크 기반 아키텍처: 정보 수집 모듈은 타겟 프로그램에 내장되고, 수집된 데이터는 별도의 정보 서버에 저장되며, 웹 브라우저를 통해 시각화됩니다. 이는 원격 프로파일링을 가능하게 하며, 프로파일링 대상 시스템의 부하를 줄여 더 정확한 성능 측정 결과를 제공합니다.
-
웹 브라우저 기반 UI: JavaScript로만 구현되어 Flash나 Java 같은 플러그인 없이 다양한 웹 브라우저(iPad 포함)에서 접근 및 사용이 가능합니다.
-
호출 컨텍스트 포함: 메서드 호출 경로(Call Stack)를 트리 구조로 저장하여, 단순히 메서드별 실행 시간을 넘어 동일 메서드라도 어떤 호출자에 의해 실행되었는지에 따른 성능 차이를 분석할 수 있습니다. 이는 복잡한 병목 현상 진단에 매우 유용합니다.
-
낮은 오버헤드: 과도한 재귀 호출이 발생하는 ‘타케우치 함수’ 테스트에서 RubyProf가 원본 대비 25배의 실행 시간 증가를 보인 반면, 본 프로파일러는 약 4.1배의 낮은 오버헤드를 기록하여 실제 서비스 환경에서의 적용 가능성을 높였습니다.
시각화 방식
프로파일러는 사용자가 성능 데이터를 직관적으로 이해할 수 있도록 다양한 시각화 뷰를 제공합니다.
-
트리 뷰: 메서드 호출 관계를 계층적인 트리 형태로 보여주며, 각 노드(메서드)가 소비한 시간을 표시합니다.
-
메서드별 뷰: 일반적인 프로파일러처럼 각 메서드가 소비한 총 시간을 목록 형태로 보여주며, 실행 시간이 긴 순서대로 정렬됩니다.
-
사각형 뷰 (히트맵/플레임 그래프 유사): 전체 프로그램 실행 시간을 하나의 큰 사각형으로 표현하고, 각 메서드 또는 코드 블록의 실행 시간을 면적으로 나타냅니다. 깊이 조절을 통해 상세 수준을 변경할 수 있으며, 직관적으로 성능 병목 구간을 파악할 수 있습니다.
-
시간 경과 그래프: 특정 메서드들의 실행 시간 변화를 시간 축(가로)과 실행 시간 축(세로)을 통해 시계열적으로 보여주어, 특정 시간대에 어떤 작업이 집중적으로 수행되는지 파악할 수 있습니다.
Python 기반 서비스 ‘Arrow’ 적용 사례
본 프로파일러는 언어 독립적인 설계 덕분에 Python 기반의 메시지 교환 웹 서비스 ‘Arrow’에 적용되었습니다. ‘Arrow’는 잦은 메시지 교환과 사용자들의 빈번한 새로고침으로 인해 DoS 공격과 유사한 높은 부하를 겪고 있었습니다.
-
프로파일러 적용: Python 환경에 맞게 트레이스 명령 및 메서드 이름 획득 로직을 교체하였으며, 웹 애플리케이션의 특성을 고려하여
begin_profile과end_profile마커를 통해 특정 요청 처리 구간만 프로파일링하는 기능을 추가했습니다. 또한, Apache + mod_wsgi 환경의 다중 프로세스/스레드에서 발생하는 정보를 통합하여 표시하는 기능도 구현했습니다. -
성능 분석 결과: 프로파일링 결과, 예상대로 HTML 렌더링 시간이 지배적인 병목으로 나타났습니다. 그러나 예상치 못하게
check_blacklist메서드와ping메서드 내의 블랙리스트 처리 로직이 상당한 시간을 소비하고 있음이 발견되었습니다. 특히ping호출의 약 90%가 블랙리스트 처리에 사용되는 비효율성이 드러나, 이는 새로운 최적화 포인트로 식별되었습니다.