Notice
Recent Posts
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- functools.wraps
- blinker
- reverse v.s. reversed
- Python
- sort v.s. sorted
- OS
- [초급(예비) 개발자 오픈소스 실무 역량강화 교육]
- pandas
- ds_store
- 쿼리
- 함수형 프로그래밍
- 고차함수
- Airflow
- 순수함수
- r-string
- decorator
- boto3
- mongoDB
- S3
- 코딩 테스트
- selenium-wire
- Chatbot
- 생각
- sort(reverse=True) v.s. reverse
- timestamp
- Rag
- CI/CD
- PIP
- slicing [::-1]
- os.path
Archives
- Today
- Total
공부일지
Airflow 서버 부하 줄이기(로컬, GCE 시범 적용) 본문
배경
- CPU 및 메모리 고부하 문제로 파이프라인 및 데이터 안정성 해침.
- git-sync 무작위로 내려가는 문제도 함께 해결할 수 있을지 확인하고자 함.
순서
- 로컬 부하 테스트
- 프로세스: core, scheduler, webserver
- airflow 환경변수만
- 실제 서버 부하 테스트
- GCE: worker → standby → master(운영)
- airflow 및 git-sync 환경변수
머신 유형
- 로컬: CPU 10코어, 메모리 32GB
- worker: e2-medium (vCPU 2개, 메모리 4GB)
- standby, master: e2-standard-2 (vCPU 2개, 메모리 8GB)
작업
1. 로컬 부하 테스트
전제
- core, scheduler, webserver 환경변수 중 인프라 부하(특히 CPU, 메모리)에 영향을 미치는 인자의 값을 조절하고 10분간 수집한 데이터에 통계를 내 실제 부하의 감소를 보기.
- VM과 설정이 다르니 실제 CPU, Memory와 같게 조절하고 테스트하기 보단 변수 변경으로 유의미한 감소를 보는지만 확인.
환경변수
다음 환경변수를 하나씩 적용하면서 전후 비교
environment:
&airflow-common-env
# core settings
AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
AIRFLOW__CORE__PARALLELISM: 16
# scheduler settings
AIRFLOW__SCHEDULER__PARSING_PROCESSES: 1
AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL: 60
AIRFLOW__SCHEDULER__SCHEDULER_HEARTBEAT_SEC: 60
# webserver settings
AIRFLOW__WEBSERVER__WORKERS: 2
AIRFLOW__WEBSERVER__PAGE_SIZE: 25
수정 전
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,64.9005421686747,191.40249999999997,230.98,3.595722891566265,5.2825,6.36
de-airflow-local-sandbox-airflow-triggerer-1,6.153734939759036,51.3925,76.38,1.9302409638554214,1.9525,2.62
de-airflow-local-sandbox-airflow-webserver-1,0.3397590361445783,1.5325,2.75,11.66,11.66,11.66
de-airflow-local-sandbox-airflow-worker-1,10.066686746987951,67.9375,83.57,19.95042168674699,20.24,20.79
de-airflow-local-sandbox-postgres-1,3.1713253012048197,8.5825,20.28,0.48186746987951806,0.49,0.53
de-airflow-local-sandbox-redis-1,0.5627710843373495,1.6575,2.17,0.14319277108433734,0.15,0.15
수정 후
개별 결과 정리
[core]
AIRFLOW__CORE__PARALLELISM
- 32 → 16: worker 메모리 최대치(이하 MEM_최대)가 약 21GB. 실제로 돌지도 않는데 한 번 실행할 때 너무 큰 메모리를 차지.
- 32 → 8: MEM_최대가 눈에 띄게 감소했지만 worker 업무 자체가 잘 안 되는 걸 의미. 그런데 현재 VM들 메모리 사양이 너무 낮기 때문에 안전상 낮추는 게 맞지만, 실제 작업이 안 돌아가면 안 되므로 다른 직접적인 원인을 고쳐야할 것으로 보임.
AIRFLOW__CORE__PARALLELISM: 32 → 16
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,66.0019393939394,193.13,247.55,3.666060606060606,6.079999999999999,6.32
de-airflow-local-sandbox-airflow-triggerer-1,8.721333333333334,61.99599999999997,74.63,1.9281212121212121,2.003999999999999,2.63
de-airflow-local-sandbox-airflow-webserver-1,0.35175757575757577,1.54,3.62,11.65,11.65,11.65
de-airflow-local-sandbox-airflow-worker-1,8.972727272727273,58.931999999999974,73.08,19.933454545454545,19.95,20.66
de-airflow-local-sandbox-postgres-1,2.9694545454545453,7.24799999999998,18.0,0.48242424242424237,0.5,0.53
de-airflow-local-sandbox-redis-1,0.5554545454545455,1.7619999999999985,2.03,0.1430909090909091,0.15,0.16
AIRFLOW__CORE__PARALLELISM: 32 → 8
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,66.231732,191.048,248.07,3.402520,5.117,6.14
de-airflow-local-sandbox-airflow-triggerer-1,7.196457,48.881,72.61,1.807323,1.810,2.27
de-airflow-local-sandbox-airflow-webserver-1,0.480315,2.079,14.54,11.688976,11.737,11.76
de-airflow-local-sandbox-airflow-worker-1,3.092049,0.000,176.50,0.024180,0.000,1.82
de-airflow-local-sandbox-postgres-1,3.093543,8.341,19.76,0.567953,0.640,0.68
de-airflow-local-sandbox-redis-1,0.494803,1.730,2.11,0.160079,0.160,0.17
[scheduler]
AIRFLOW__SCHEDULER__PARSING_PROCESSES
- 기존 Deprecated된 AIRFLOW__SCHEDULER__MAX_THREADS 와 같음. worker 프로세스 CPU 평균의 약 60% 감소로, 유의미함. 이름만 업데이트하면 될 듯.
AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL
- 이미 적용된 값과 같음. worker 프로세스 평균 CPU의 약 33% 감소했고, 이전 문서 기록에서는 약 40%대까지 감소율 보이므로 유의미함.
AIRFLOW__SCHEDULER__SCHEDULER_IDLE_SLEEP_TIME
- worker 프로세스 CPU 평균은 약 65%, P95는 87% 하락으로 긍정적이지만, 스케줄링 지연(Queued → Running 넘어가는 시간 길어짐)이 보임. 하지만 현재처럼 CPU가 꽉 찬 상태일 때는 약간의 지연을 감수하고 안정성 택하는 게 나아보임.
AIRFLOW__SCHEDULER__PARSING_PROCESSES: 2 → 1
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,57.14879518072289,107.4425,171.99,3.553012048192771,4.7,4.83
de-airflow-local-sandbox-airflow-triggerer-1,6.859277108433735,51.58,73.36,1.930722891566265,1.93,2.61
de-airflow-local-sandbox-airflow-webserver-1,0.26385542168674697,1.3875,2.91,11.650060240963857,11.65,11.66
de-airflow-local-sandbox-airflow-worker-1,4.200120481927711,34.7675,42.44,19.958253012048193,20.3275,20.44
de-airflow-local-sandbox-postgres-1,2.822951807228916,11.92,14.75,0.4818072289156627,0.5,0.51
de-airflow-local-sandbox-redis-1,0.46379518072289155,1.4775,2.14,0.14343373493975906,0.15,0.15
AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL: 30 → 60
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,32.592121212121214,187.09799999999998,247.25,3.400606060606061,4.8759999999999994,6.25
de-airflow-local-sandbox-airflow-triggerer-1,6.288848484848486,48.77199999999998,73.11,1.9378181818181819,1.94,2.61
de-airflow-local-sandbox-airflow-webserver-1,0.43672727272727274,2.0379999999999967,2.81,11.642666666666667,11.65,11.65
de-airflow-local-sandbox-airflow-worker-1,6.748060606060607,51.56999999999998,79.63,19.992060606060605,20.374,20.83
de-airflow-local-sandbox-postgres-1,2.106969696969697,5.063999999999998,19.43,0.48145454545454547,0.49,0.52
de-airflow-local-sandbox-redis-1,0.5797575757575757,1.7519999999999993,3.1,0.14387878787878788,0.15,0.15
AIRFLOW__SCHEDULER__SCHEDULER_IDLE_SLEEP_TIME: 1 → 5
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,64.41126506024096,193.8425,254.34,3.5797590361445786,5.4475,6.32
de-airflow-local-sandbox-airflow-triggerer-1,11.59668674698795,72.1175,101.11,1.9424096385542169,2.225,2.62
de-airflow-local-sandbox-airflow-webserver-1,0.3902409638554217,2.1075,2.68,11.640240963855423,11.64,11.67
de-airflow-local-sandbox-airflow-worker-1,3.5309638554216867,8.495000000000001,76.07,19.92210843373494,19.94,20.77
de-airflow-local-sandbox-postgres-1,2.771566265060241,7.2725,20.67,0.48198795180722886,0.4975,0.51
de-airflow-local-sandbox-redis-1,0.5445180722891566,1.6524999999999999,2.43,0.14295180722891568,0.15,0.15
[webserver]
AIRFLOW__WEBSERVER__WORKERS
- 메모리 평균이 11.66GB → 8.1GB로 약 30% 감소해 약 3.5GB의 여유 메모리 확보. VM 배포 시 도움될 것임.
AIRFLOW__WEBSERVER__PAGE_SIZE
- 큰 차이는 없음. 그러나 페이지 사이즈를 줄이면 DB에서 긁어오는 양이 줄기 때문에 DB 병목을 방지할 수 있어 약간의 효과 기대 가능.
AIRFLOW__WEBSERVER__WORKERS: 4 → 2
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,65.68843373493976,192.8975,242.69,3.6645783132530125,5.8325,6.31
de-airflow-local-sandbox-airflow-triggerer-1,8.56210843373494,61.1725,78.59,1.941566265060241,2.1275,2.63
de-airflow-local-sandbox-airflow-webserver-1,0.2977710843373494,1.51,2.3,8.099277108433736,8.1,8.1
de-airflow-local-sandbox-airflow-worker-1,7.78421686746988,72.15,91.48,19.931807228915662,19.95,20.78
de-airflow-local-sandbox-postgres-1,3.075481927710843,7.8475,19.75,0.4239759036144578,0.4375,0.46
de-airflow-local-sandbox-redis-1,0.575843373493976,1.7875,2.32,0.1430120481927711,0.15,0.15
AIRFLOW__WEBSERVER__PAGE_SIZE: 100 → 25
container,CPU_평균,CPU_P95,CPU_최대,MEM_평균,MEM_P95,MEM_최대
de-airflow-local-sandbox-airflow-scheduler-1,65.04915662650602,190.485,277.3,3.4639759036144575,5.395,6.14
de-airflow-local-sandbox-airflow-triggerer-1,7.255722891566266,53.7275,85.18,1.8219879518072288,1.9725,2.49
de-airflow-local-sandbox-airflow-webserver-1,0.3987951807228916,1.79,4.28,11.153433734939759,11.2,11.21
de-airflow-local-sandbox-airflow-worker-1,12.315421686746987,69.08749999999999,84.02,19.29680722891566,19.622500000000002,20.11
de-airflow-local-sandbox-postgres-1,3.083855421686747,8.1525,19.44,0.4812650602409639,0.4975,0.52
de-airflow-local-sandbox-redis-1,0.5700000000000001,1.85,2.39,0.14289156626506025,0.15,0.15
[core]
- AIRFLOW__CORE__PARALLELISM
: 병렬 처리의 문제는 아님. 처리 전 DAG을 스캔하는 데에서부터 과부하가 걸려있음.
[scheduler]
- AIRFLOW__SCHEDULER__PARSING_PROCESSES
- AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL
- AIRFLOW__SCHEDULER__SCHEDULER_IDLE_SLEEP_TIME
: CPU 부하 감소에 유의미
[webserver]
- AIRFLOW__WEBSERVER__WORKERS
- AIRFLOW__WEBSERVER__PAGE_SIZE
: Memory 부하 감소에 유의미
2. GCE 환경변수 최적화 분석
- 시범 적용: worker VM
- 변경 일주일 전: 2/3(변경 일주일 전)
- 변경 후: 2/11
시범 적용한 환경변수
- AIRFLOW__CORE__PARALLELISM
- AIRFLOW__SCHEDULER__PARSING_PROCESSES
- AIRFLOW__SCHEDULER__MIN_FILE_PROCESS_INTERVAL
- AIRFLOW__WEBSERVER__WORKERS
- AIRFLOW__WEBSERVER__PAGE_SIZE


| 지표 | 변경 전 | 변경 후 | 개선율 |
| CPU Busy (%) | 13.7 | 12.9 | -0.8%p |
| Sys Load | 21 | 15 | -28.6% |
| RAM Used (%) | 67.67 | 59.3 | -8.37%p |
| Root FS Used (%) | 71.2 | 32.1 | -39.1%p |
- 리소스 효율화: 웹서버 워커 수 및 스케줄러 대기 시간 조정을 통해 RAM 점유율을 줄여 8.37%p의 가용 메모리를 추가 확보하였으며, 시스템 부하를 약 28% 경감시켜 저사양 서버(2vCPU, 8GB)에서의 운용 안정성을 확보함.
- 유지보수성 향상: 로그 및 임시 데이터 관리 설정 변경으로 디스크 사용량을 39%p 이상 확보해 장기 운영 시 발생 가능한 스토리지 병목 현상을 해결.
결론
- 환경변수 튜닝을 통해 한꺼번에 일을 시키지 않도록 해, Disk 가용성과 시스템 부하 개선률이 약 30%, 40%로 높았다.
- Task 실행보다는 DAG 있는지 확인하는 과정에서 이미 과부하가 걸려있기 때문에 환경변수 튜닝을 통한 CPU, Memory 부하 감소는 유의미하지만 직접적인 원인은 아닌 걸로 보인다. 하지만 실제 부하가 큰 프로세스는 standby, master 서버에서 돌고 있기 때문에 해당 서버들에 적용해봤을 때 개선점을 확인할 수 있을 것이다.
- pandas I/O, dags/ 디렉토리 구조, airflow 구문 구조 등, 코드 소스 단에서의 수정이 필요해 보인다.
참고
'Computer > 도전기' 카테고리의 다른 글
| 시나리오: Docker 엔진 업그레이드 및 장애 복구(Rollback) 절차 (0) | 2026.03.01 |
|---|---|
| Airflow Metadata DB 최적화 및 디스크 용량 회수 (0) | 2026.03.01 |
| MongoDB Vector Search를 활용한 사내 문서 검색 도우미 구현 및 성능 검증(PoC)_배경과 아이디어 (1) | 2026.01.07 |
| [코딩테스트] 백준 solved.ac 이용하기 (0) | 2025.04.21 |
| [코딩테스트]백준 solved.ac 클래스(CLASS) 사용해서 효율적으로 공부해보기! (0) | 2025.04.21 |