에어플로우의 컨테이너의 로그로 접근해서, 위로 조금 올려보면 Gunicorn server의 상태가 나옵니다. 현재는 sync된 4개의 Worker가 있습니다. Gunicorn은 다양한 워커를 갖습니다.
현재는 4개의 Sync Worker가 있고, Gunicorn이 초당 수천건의 작업을 처리하려면, 4~12건의 작업 프로세스가 필요합니다. 사실 Airflow에서는 이렇게나 많은 작업을 처리하진 않습니다. 즉 일반적으로 4개의 Sync Worker로도 에어플로우 웹서버를 돌리는 데에 충분하고, 너무 많은 Worker를 설정할 경우 자원 낭비 또는 처리량 감소의 문제가 있습니다.
에어플로우에서 Gunicorn의 Woker의 공식적으로 권장하는 Worker의 수는 다음 공식을 따르면 됩니다.
number of wokers = 2 * number_of_cores * + 1
이 설정은 airflow.cfg
파일에서 수정할 수 있습니다.
# Number of workers to run the Gunicorn web server
workers = 4
# The worker class gunicorn should use. Choices include
# sync (default), eventlet, gevent
worker_class = sync
worker_refresh_batch_size = 1
이 옵션은 에어플로우가 webserver의 worker를 주기적으로 kill하고 새로운 worker를 만드는 수입니다. 0으로 하면, 교체되지 않습니다. 아래 로그를 보면 알 수 있습니다.
[2024-03-11 15:23:40 +0000] [42] [INFO] Booting worker with pid: 42
[2024-03-11 15:23:40 +0000] [43] [INFO] Booting worker with pid: 43
[2024-03-11 15:23:40 +0000] [44] [INFO] Booting worker with pid: 44
[2024-03-11 15:23:40 +0000] [59] [INFO] Booting worker with pid: 59
처음에 worker 4개를 부팅합니다.
2024-03-11 15:24:13 +0000] [39] [INFO] Handling signal: ttou
[2024-03-11 15:24:13 +0000] [42] [INFO] Worker exiting (pid: 42)
[2024-03-11 15:24:41 +0000] [39] [INFO] Handling signal: ttin
[2024-03-11 15:24:41 +0000] [148] [INFO] Booting worker with pid: 148
여기서 시그널을 보내고, 30초마다 가장 오래된 worker를 찾아서 kill하고, 새로운 worker를 띄웁니다. 이는 worker 프로세스가 메모리 누수 또는 다른 이유로 인해 문제가 발생할 경우에 대비한 안전장치로 볼 수 있습니다.
logging_level = INFO
이 옵션을 사용해서 로그 레벨을 바꿀 수도 있습니다. 다만, product 환경에서 절대 바꾸지 않는 것을 권장합니다.