-
docker container 에서 zombie 프로세스 발생 문제docker 2021. 10. 14. 12:05
문제
jupyterhub 를 docker 로 실행해 서비스를 제공했다. 각각의 사용자들이 notebook 을 닫지 않은채 single-user server 를 재시작할 경우 zombie 프로세스가 발생했다. bare metal 장비에 직접 jupyterhub 를 설치했으면 발생하지 않았을 문제인데, docker 를 사용해서 발생한 문제였다. 왜 그럴까?
설명
jupyterhub 는 user 마다 single-user server process 가 실행된다. 그리고 user 가 notebook 을 실행할 때 마다 single-user server process 의 child process 가 실행된다. 결국 아래와 같은 구조가 된다.
jupyterhub L single-user server L notebook
docker container 에서 jupyterhub 가 실행중일 때
single-user server 를 재시작하게 되면 실행중인 notebook 의 parent 가 jupyterhub 로 변경된다. docker container 에서 PID 1 로 실행중인 jupyterhub process 가 orphan process 의 종료를 책임져야 하는데 이를 잘 수행하지 못해서 notebook process 는 zombie 프로세스가 된다.
docker 를 사용하지 않고 장비에서 직접 jupyterhub 가 실행중일 때
single-user server 를 재시작하게 되면 실행중인 notebook 의 parent 가 system process (systemd, init ..) 로 변경된다. docker container 에서 PID 1 로 실행중인 systemd 혹은 init process 가 orphan process 를 잘 처리해 준다.
해결
docker container 에서 jupyterhub process 가 PID 1 로 실행된다는 것이 문제다.
docker run 시 --init 옵션을 주고 실행해 해결할 수 있다.
docker run -d --init ...
--init 옵션 추가 전
root 1 0 0 Oct08 ? 00:01:13 /usr/bin/python3 /usr/local/bin/jupyterhub user123 313 1 0 Oct13 ? 00:00:28 /usr/bin/python3 /usr/local/bin/jupyterhub-singleuser
--init 옵션 추가 후
root 1 0 0 Oct13 ? 00:00:00 /sbin/docker-init -- jupyterhub root 6 1 0 Oct13 ? 00:00:07 /usr/bin/python3 /usr/local/bin/jupyterhub user123 27 6 0 Oct13 ? 00:00:09 /usr/bin/python3 /usr/local/bin/jupyterhub-singleuser
--init 옵션 추가후 jupyterhub 가 PID 1 값이 아닌 다른 값으로 실행되는 것을 알 수 있다.
참고 링크
'docker' 카테고리의 다른 글
docker 로 kafka 설치 (0) 2021.12.22 docker 로 mysql 설치하고 접속하기 (0) 2021.11.07 docker 로 postgresql 설치하고 접속하기 (0) 2021.11.07 동일한 docker image 를 사용했는데 실행 결과가 다르다? (0) 2021.07.31 docker image 만들기 (0) 2021.06.01