공부일지

Airflow 서버 부하 줄이기(로컬, GCE 시범 적용) 본문

Computer/도전기

Airflow 서버 부하 줄이기(로컬, GCE 시범 적용)

쿄우의 공부일지 2026. 3. 1. 14:19

배경

  • CPU 및 메모리 고부하 문제로 파이프라인 및 데이터 안정성 해침.
  • git-sync 무작위로 내려가는 문제도 함께 해결할 수 있을지 확인하고자 함.

순서

  1. 로컬 부하 테스트
    1. 프로세스: core, scheduler, webserver
    2. airflow 환경변수만
  2. 실제 서버 부하 테스트
    1. GCE: worker → standby → master(운영)
    2. 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
02.03 변경 전
02.11 변경 후

 

지표 변경 전 변경 후 개선율
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 구문 구조 등, 코드 소스 단에서의 수정이 필요해 보인다.

 

참고

Configuration Reference — Airflow Documentation