GOOD4ME

[uvicorn] FastAPI multiprocessing 좀비 프로세스 원인 본문

개발.오류.정리/Python

[uvicorn] FastAPI multiprocessing 좀비 프로세스 원인

de_youn 2022. 11. 29. 11:07
반응형
무엇이 문제인가?

 

Docker swarm을 사용하여 플랫폼을 구축하던 중,
FastAPI를 사용하는 컨테이너(B/E 컨테이너)에 뭔가 문제가 있음을 확인했다.

문제인 즉, uvicorn을 사용하여 FastAPI 서버를 구동한 후,
FastAPI 서버를 종료하면
multiprocessing.semaphore_tracker좀비프로세스가 되는 것이었다.

root       413     1   5  10:35 pts/1    00:00:01 /usr/bin/python3 /usr/local/bin/uvicorn main:app --reload --host=x.x.x.x --port=xxxx
root       414   413   0  10:35 pts/1    00:00:00 /usr/bin/python3 -c from multiprocessing.semaphore_tracker import main;main(4)
root       415   413  25  10:35 pts/1    00:00:06 /usr/bin/python3 -c from multiprocessing.spawn import spawn_main; spawn_main(tracker_fd=5, pipe_handle=7) --multiprocessing-fork
user     17521 18964   0  10:36 pts/3    00:00:00 grep --color=auto python
root       414     1   0  10:35 pts/1    00:00:00 python <defunct>
user     17521 18964   0  10:36 pts/3    00:00:00 grep --color=auto python

 

해결 시도를 해보았는가?

 

우선적으로 필자의 출중한 GSS(Google Search Skills)를 통해
간단하게 문제를 해결해보려고 했으나,
검색 키워드가 잘못되었는지, GSS를 통해서 답을 찾을 수는 없었다.

아무래도 스스로 해결해야 할 듯 싶어
다시 한 번 유심히 프로세스 창을 살펴보았다.

음... multiporcessing 프로세스들main 파일을 실행하는 uvicorn 프로세스부모 프로세스이고
main파일을 실행하는 uvicorn 프로세스PID 1부모 프로세스다...
그리고 FastAPI를 죽이면 multiprocessing 프로세스들의 부모 프로세스가 PID 1이 된다...

아❓ 그럼 도대체 PID 1의 정체가 뭐길래
multiprocessing 프로세스가 이지경이 되는걸까❓

확인해보니, PID 1의 정체는 /sbin/init 이었고,
이러한 현상이 발생한 이유는
docker-compose.yml 작성 당시, container 서비스에 command: /sbin/init 구문을 넣었기 때문이었다.
작성 당시 privileged: true 구문이 필요했었는데
이 구문 사용을 위해 command: /sbin/init 를 추가했던 것이 화근이었다😂😂

docker-compose.yml 파일에서
B/E 컨테이너 서비스 구문 중 command: /sbin/init을 제거한 후,
다시 시도해보니 좀비프로세스 문제가 해결되었다😁

반응형
Comments