What is zombie process?

Zombie process란?

실제로는 종료 되었는데도 계속 남아있는 프로세스
Zombie process는 실제로는 종료된 프로세스이지만, Process Table에 여전히 남아있는 프로세스입니다. 이러한 Zombie process는 Defunct process라고도 부릅니다.

Zombie process가 생성되는 이유
일반적으로 프로세스는 부모 프로세스가 자식 프로세스를 실행하고, 자식 프로세스가 종료되어 부모 프로세스로부터 wait system call(e.g. waitpid)이 호출되면 Process table로부터 제거됩니다. 또한, 자식 프로세스의 실행이 종료된 이후에 부모 프로세스가 종료되면, 부모 프로세스와 함께 Process Table로부터 제거됩니다.

하지만 반대로, 부모 프로세스가 자식 프로세스보다 먼저 종료되는 경우 혹은 부모 프로세스가 자식 프로세스의 종료 처리 역할을 제대로 하지 못하는 경우 Zombie process가 생성됩니다.

Zombie process가 문제가 되는 이유
이렇게 Defunct process가 된 process는 같은 일부 시스템 리소스를 차지하게 됩니다. 그로인해 리소스의 용량이 꽉 차게 되면 더 이상 프로세스를 실행할 수 없는 상황이 발생할 수 있습니다.

딥러닝 프로젝트에서의 좀비프로세스 원인
금번 프로젝트에서는 pytorch 1.6을 사용하는 패키지를 사용했습니다. 그러나 프로젝트에서 사용하는 GPU서버가 pytorch 1.7이상 부터만 지원하기 때문에 문제가 발생했습니다. 이렇듯 딥러닝 프로젝트에서는 사용하려는 패키지와 실제 설치 되어있는 패키지 간 dependancy에 대해서도 정확히 고민해야합니다.

좀비 프로세스를 파악하는 방법

GPU 상에서 top 명령어를 통해 좀비 프로세스의 수, 좀비 프로세스를 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
[root@sunghwan ~]# top
top - 22:01:31 up 97 days, 17:08, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 118 total, 3 running, 114 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1048576k total, 990160k used, 58416k free, 180060k buffers
Swap: 2031608k total, 48520k used, 1983088k free, 203936k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 15 0 10368 544 512 S 0.0 0.1 0:00.12 init
2 root RT -5 0 0 0 Z 0.0 0.0 0:03.16 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0

두번째줄 마지막에 1 zombie를 통해 Zombie process의 개수를 확인 가능합니다. 프로세스 목록 중 두번째 S(Status)가 Z로 표시된 프로세스 확인을 하는 것도 또한 방법이다.

또한 아래와 같은 명령어를 통해 간단히 개수만 확인할 수도 있습니다.

1
top -b -n 1 | grep zombie

좀비 프로세스를 제거하는 방법

아래의 명령어를 사용하면 일괄적으로 좀비프로세스를 죽일 수 있습니다.

1
ps -ef | grep defunct | awk '{print $3}' | xargs kill -9

다만 kubernetes가 관리하는 container의 경우 kubernetes가 container의 상태를 모니터링하고 다시 컨테이너를 실행하는 경우가 있으므로 실제로 container를 삭제한 후 zombie process를 확인해보면 더 확실합니다.