핵심 요약
NAVER D2가 Python GC와 fork의 상호 작용으로 생기는 메모리 증가와 MySQL 연결 이슈를 Memray 분석과 gc.freeze로 해결하고 Airflow의 핵심 컴포넌트에서 메모리 효율을 개선했습니다.
구현 방법
- fork 직전 heavy 모듈 로드 지연 및 import 최적화
- LocalExecutor: fork 직전 gc.freeze, 자식 생성 후 gc.unfreeze
- dag-processor: 파싱 루프 진입 직전에 한 번 freeze
- CeleryExecutor: preload 시 gc.freeze, worker_ready 시 unfreeze
- MySQL 연결 이슈 대응: connect 이벤트 추적 및 커넥션 종료 원인 파악
- gc.freeze/unfreeze 오버헤드 약 19μs/10μs
- Airflow 3.1.4/3.1.7, Celery provider 3.17.2 적용
주요 결과
- LocalExecutor: 컨테이너 합계 PSS 3.6GB→1.5GB, 프로세스당 100MB→40MB
- dag-processor: 메모리 스파이크 감소 및 재시작 이슈 해결
- CeleryExecutor: 워커당 2.25GB→1.07GB