Task를 실행할 때 Negsinal.SIGKILL
이란 Log를 발생시키며 Task fail이 난다.
{local_task_job.py:159} INFO - Task exited with return code Negsignal.SIGKILL
이 경우 Memory 문제라고 한다.
Task가 Airflow Worker에 할당된 Memory보다 더 많이 사용하기 때문에 발생한다고 한다.
따라서 해결 방법은 단순하다. Memory 사양을 올리면 된다.
여담으로 필자의 Case는 다음과 같다.
현재 AWS EC2 Airflow Cluster에 Worker가 2개가 구성되어 있는데, 2 GiB Memory
를 가진 t2.small
로 구성되어 있다.
실행할 DAG는 400MB
대의 파일과 500 MB
가 넘는 파일을 각각의 Worker의 Memory에 다운받고 S3에 업로드하는 DAG이다.
요런 느낌
- Worker1 :
400MB
대 데이터 다운로드 & 업로드- Worker2 :
500MB
대 데이터 다운로드 & 업로드
Worker는 DAG 실행시마다 자동 할당되어서 담당 Worker가 바뀌는데,
500MB
이상의 데이터 다운로드 & 업로드하는 Task를 할당받는 Worker가 계속 fail 난다.
그래서 Worker에서 free
명령으로 Memory 사용량을 계속 체크를 해봤다.
이미 2 GB
를 가진 Worker의 절반을 Task 실행 전에 이미 잡아먹고 있었다.
아마 systemctl
로 서비스 자동 실행을 등록한 airflow, github actions runner 등의 프로세스들이 Memory를 잡아 먹고 있나보다.
파일을 다운로드 받는 중 400~500M
대까지 유휴 메모리가 남았는데도, 버티지 못하고 Task가 fail 났다.
fail 이후 다시 Memory 유휴량이 1.2G
으로 증가하였다.
1.2G
에서 넉넉잡아 600M
파일을 다운받는데 추가적으로 600M
는 더 든 샘처럼 보인다.
생각보다 Airflow가 Memory를 많이 잡아먹나보다..
결국 Memory 사양을 올리면 된다.
Worker의 인스턴스 유형을 t2.small
→ t2.medium
으로 올렸다.
Memory가 충분히 남는데도 Negsinal.SIGKILL
에러가 난다면 DAG 설계 문제도 의심해보아야 한다.
무거운 Library를 사용한다거나, 대용량 처리를 비효율적으로 한다거나 등이 원인이 될 수 있다.
따라서, Negsinal.SIGKILL
에러가 해결되지 않는다면 DAG 최적화에 대해 고려해보자.
아래 포스팅 참고 바람
https://velog.io/@jskim/Airflow-Task-Memory-최적화하기