Memray로 메모리 프로파일링하기
Memray로 메모리 프로파일링하기 (Memory Profiling with Memray)
Airflow에 통합된 Python 메모리 프로파일러 Memray를 사용해 컴포넌트의 메모리 사용 패턴을 진단하고 잠재적 메모리 누수를 찾는 방법을 설명하는 문서예요. scheduler·API server·DAG processor·triggerer 같은 핵심 컴포넌트를 프로파일링하는 과정을 단계별로 살펴볼게요.
출처: 문서
본문
Airflow는 Python용 메모리 프로파일러 Memray를 통합해 Airflow 컴포넌트의 메모리 사용 패턴을 진단하고 잠재적 메모리 누수를 식별하도록 도와줘요. 이 가이드는 scheduler, API server, DAG processor, triggerer 같은 핵심 Airflow 컴포넌트의 메모리 사용량을 프로파일링하는 방법을 안내해요.
참고 (Note)
메모리 프로파일링은 비용이 큰 작업이고 일반적으로 개발 환경에서 디버깅 목적으로만 사용해야 해요. 프로덕션 사용에는 권장되지 않아요. 중요한 주의사항은 아래 '주의사항(Precautions)'을 참고하세요.
전제 조건 (Prerequisites)
메모리 프로파일링을 사용하려면 memray extra로 Airflow를 설치해야 해요:
pip install 'apache-airflow[memray]'
또는 기존 Airflow 설치가 있다면:
pip install 'memray>=1.19.0'
참고 (Note)
지원되는 환경에 대한 자세한 내용은 Memray supported environments documentation을 참고하세요.
메모리 프로파일링 구성하기 (Configuring Memory Profiling)
메모리 프로파일링은 Airflow의 구성을 통해 제어돼요. airflow.cfg 파일의 [profiling] 섹션에서 memray_trace_components 옵션을 설정하거나 환경 변수를 통해 특정 컴포넌트에 대해 활성화할 수 있어요.
구성 옵션 (Configuration Options)
airflow.cfg 파일에 다음을 추가해요:
[profiling]
# Comma-separated list of Airflow components to profile with memray
# Valid components: scheduler, api, dag_processor, triggerer
# Invalid component names will be ignored
memray_trace_components = scheduler,dag_processor,api, triggerer
또는 환경 변수로 설정해요:
export AIRFLOW__PROFILING__MEMRAY_TRACE_COMPONENTS="scheduler,dag_processor,api,triggerer"
참고 (Note)
분석을 마친 후 메모리 프로파일링을 비활성화하려면
memray_trace_components를 빈 문자열로 설정하고(또는 환경 변수를 unset하고) 관련 컴포넌트를 재시작하면 돼요.
더 상세한 트레이스 캡처 (Capturing More Detailed Traces)
기본 트레이스로 메모리 문제의 원인을 식별하기에 정보가 부족하다면, memray_detailed_tracing을 활성화하면 더 깊은 통찰을 얻을 수 있어요.
기본적으로 Memray는 시스템 할당자(system allocator)에 도달하는 할당만 기록해요. C/C++ 스택 프레임과 작은 pymalloc 할당도 캡처하려면 memray_detailed_tracing을 True로 설정해요:
[profiling]
memray_trace_components = scheduler
memray_detailed_tracing = True
이렇게 하면 Memray의 native_traces(numpy나 pandas 같은 컴파일된 확장의 C/C++ 프레임; Linux에서 가장 정확하고 macOS에서는 덜 정확)와 trace_python_allocators(기존 pymalloc 아레나에서 제공되는 작고 수명이 짧은 Python 객체)가 활성화돼요.
경고 (Warning)
상세 트레이싱은 오버헤드를 상당히 늘리고 수 기가바이트 크기의 프로파일 파일을 만들 수 있어요. 짧고 집중적인 세션에서만 활성화하세요.
단계별 프로파일링 가이드 (Step-by-Step Profiling Guide)
이 섹션은 Airflow 배포에서 메모리 사용량을 프로파일링하는 실용적인 과정을 안내해요.
1단계: 메모리 프로파일링 활성화 (Step 1: Enable Memory Profiling)
먼저 프로파일링할 컴포넌트를 결정해요. 이 예시에서는 scheduler를 프로파일링할게요.
airflow.cfg를 수정해요:
[profiling]
memray_trace_components = scheduler
또는 환경 변수를 설정해요:
export AIRFLOW__PROFILING__MEMRAY_TRACE_COMPONENTS=scheduler
2단계: 컴포넌트 재시작 (Step 2: Restart the Component)
컴포넌트에 대한 프로파일링을 활성화한 후 변경 사항이 적용되도록 재시작해야 해요.
# If running standalone
airflow scheduler
# If running with systemd
sudo systemctl restart airflow-scheduler
# If running with Docker Compose
docker-compose restart airflow-scheduler
3단계: 워크로드 실행 (Step 3: Run Your Workload)
Airflow를 정상적으로 실행시키고 프로파일링하려는 작업을 수행하게 해요. 예를 들어:
- 스케줄러를 일정 시간 동안 실행하게 한다
- 문제가 될 수 있는 특정 DAG 파일을 처리한다
오래 실행할수록 더 많은 데이터를 수집해요. 다만 메모리 프로파일링은 오버헤드를 추가하므로, 진단에는 보통 몇 분에서 한 시간이면 충분해요.
4단계: 프로파일 파일 가져오기 (Step 4: Retrieve the Profile File)
Memray는 $AIRFLOW_HOME 디렉토리에 바이너리 프로파일 파일을 자동으로 생성해요. 파일명은 <component>_memory.bin 패턴을 따라요:
# Default locations
$AIRFLOW_HOME/scheduler_memory.bin
$AIRFLOW_HOME/api_memory.bin
$AIRFLOW_HOME/dag_processor_memory.bin
$AIRFLOW_HOME/triggerer_memory.bin
컨테이너화된 환경에서 실행 중이라면 컨테이너에서 파일을 복사해야 할 수 있어요:
# Docker
docker cp <container_name>:/path/to/airflow/home/scheduler_memory.bin .
# Kubernetes
kubectl cp <namespace>/<pod_name>:/path/to/airflow/home/scheduler_memory.bin ./scheduler_memory.bin
5단계: 프로파일 분석 (Step 5: Analyze the Profile)
프로파일 파일을 얻었다면 Memray의 분석 도구를 사용해 메모리 사용을 시각화하고 이해해요.
Flamegraph 생성 (Generate a Flamegraph)
Flamegraph는 메모리 할당을 시각화하는 가장 흔한 방법이에요:
memray flamegraph scheduler_memory.bin
이렇게 하면 웹 브라우저에서 열 수 있는 HTML 파일(memray-flamegraph-scheduler_memory.html)이 생성돼요.
Flamegraph는 콜 스택을 보여주며 각 박스의 너비는 해당 함수가 할당한 메모리 양을 나타내요. 그래프 맨 위의 함수는 직접 메모리를 할당하는 리프 함수예요.
다른 분석 방법 (Other Analysis Methods)
Memray는 테이블 리포트, 요약 통계, 실시간 모니터링 등 메모리 프로파일을 분석하는 여러 다른 방법을 제공해요. 모든 분석 명령과 옵션에 대한 자세한 내용은 Memray documentation on analyzing results를 참고하세요.
결과 해석하기 (Interpreting Results)
메모리 프로파일을 분석할 때 다음을 찾아보세요:
높은 메모리 할당 함수 (High Memory Allocation Functions)
많은 메모리를 할당하거나 자주 호출되는 함수. flamegraph에서 가장 넓은 막대 또는 테이블 리포트의 최상위 항목이에요.
메모리 보유 패턴 (Memory Retention Patterns)
특정 함수가 시간이 지나도 계속 메모리를 보유하고 있다면 메모리 누수를 나타낼 수 있어요.
예상치 못한 할당 (Unexpected Allocations)
예상하지 못한 곳의 메모리 할당을 찾아보세요. 비효율적인 코드나 불필요한 데이터 구조를 나타낼 수 있어요.
제3자 라이브러리 사용 (Third-Party Library Usage)
때로 메모리 문제는 제3자 라이브러리를 어떻게 사용하는지에서 발생해요. 특정 라이브러리가 높은 메모리 사용의 원인이라면 flamegraph가 보여줘요.
주의사항 (Precautions)
- 비프로덕션 환경에서 프로파일링 (Profile in Non-Production Environments) — 메모리 프로파일링은 메모리 사용 증가와 성능 저하를 포함한 상당한 오버헤드를 추가해요. 프로덕션 구성을 반영하는 개발 환경에서 사용하세요.
- 대표적인 워크로드 사용 (Use Representative Workloads) — 프로파일링하는 워크로드가 실제 유스케이스를 대표하도록 보장하세요.
- 프로파일 파일 크기 관리 (Manage Profile File Sizes) — 프로파일 파일은 매우 커질 수 있고(수백 MB에서 수 GB) 상당한 디스크 공간을 소비할 수 있어요. 프로파일링 세션 중 디스크 공간을 모니터링하고, 분석 후 정기적으로 오래된 프로파일 파일을 정리해 저장 공간 문제를 방지하세요.
더 읽을거리 (Further Reading)
Memray와 그 기능에 대한 더 자세한 정보는 공식 문서를 참고하세요: