Defunct Processes in Docker ?
Docker container를 이용하여 서비스 중인 호스트에서 아래와 같이 지속적으로 Defunct Processes(=좀비프로세스) 가 상승 하는 이슈가 발생 하였다.
아래와 같이 프로세스들이 <defunct> 상태로 유지 되고 있는 것을 볼 수있다.
사실 docker 환경과 같이 isolation되어 있는 환경이 아니라면 부모 프로세스를 kill 한다면 해결 될 수 있지만,
docker 환경에서 해당 <defunct> 상태의 ppid 는 1 이라는 pid로 해당container 가 실행되는 프로세스이다.
즉, 해당 pid를 kill 할 경우 해당 docker 도 종료 된다.
Docker init
UNP에서는 아래와 같은 이야기가 있다.
If a process terminates, and that process has childern in the zombie state, the parent process ID of all zombie childern is set to 1(the init process), which will inherit the childern and clean them up(i.e, init will wait for them, which removes the zombie)
즉 , zobmie인 상태의 자식을 거두지 않고 부모가 죽으면 자식 ppid가 init으로 바꿔게 되며,
Init프로세스가zombie상태인 자식들을 wait를 통해 거둬 줄 것이다. 이말은 init이 wait 를 통하여 zombie를 지워 준다는 것이다.
그렇다면 해당 container안에 init프로세스를 생성 시키면 해결 될것 같다 .
위와 같이 -- init 옵션을 추가 하여 실행 할 경우 아래와 같이 pid 1 이 /dev/init 으로 실행 되며 기존의 pid 1 로 실행 되던 프로세스가 pid 5 로 실행 되는 것을 볼 수 있다.
그렇기 때문에 위 문제점을 해결 할 수 있도록 해당 프로세스가 wait를 통하여 zombie 를 지워 질 수 있도록 하여 더이상 좀비 프로세스가 상승 하는 것을 찾을 수 없게 되었다.
Ref
https://github.com/krallin/tini
반응형
'System > Container' 카테고리의 다른 글
Podman Rootless Container 의 PID/User Namespace (0) | 2024.02.15 |
---|---|
Podman short-name 설정 (1) | 2023.12.30 |
docker 이미지를 이용한 tomcat war 파일 deploy (0) | 2017.08.15 |
오프라인 환경의 docekr image save/load (0) | 2017.08.15 |