좀비 상태가 지워지지 않은 경우 문제가 있습니까? Java 프로세스가

Java 프로세스가 Zombie가 된 생산 단위를 가지고 있으며 얼마 동안 거기에 남아있었습니다. 장치가 다시 시작되면 지워집니다. 그러나 장치가 다시 시작되지 않고 다른 Java 프로세스가 시작되어 실행 중입니다. 이 좀비 상태를 지우지 않고 그대로 유지하면 문제가 있습니까? 어떤 식 으로든 (성능 또는 속도 저하) 영향을 줍니까?



답변

좀비 프로세스는 성능이나 속도 저하에 영향을 미치지 않습니다. 시스템 리소스를 사용하지 않으므로 좀비 프로세스는 않습니다.

참고 :- 실제로는 여전히 제한된 리소스 인 PID를 사용하고 있으며 프로세스의 커널 데이터 구조는 여전히 할당되어 있습니다. 일반적으로 이것은 중요하지 않지만 메모리가 매우 제한된 시스템에서는 커널 메모리 사용량이 중요 할 수 있습니다.

좀비 프로세스로 인한 문제

각 좀비 프로세스는 프로세스 ID를 유지합니다. Linux 시스템에는 32 비트 시스템에서 기본적으로 유한 한 수의 프로세스 ID ( 32767) 가 있습니다. 좀비가 매우 빠른 속도로 누적되면 사용 가능한 PID 풀 전체가 좀비 프로세스에 할당되어 다른 프로세스가 시작되지 못하게합니다.

참고 : 64 비트 시스템에서 최대 PID를 늘릴 수 있습니다 ( /unix//a/16884/170373 참조).

그러나 몇 가지 좀비 프로세스가 문제가되지는 않지만 시스템에서 상위 프로세스에 버그가 있음을 나타냅니다.

설명:

프로세스가 Linux에서 종료되면 프로세스가 메모리에서 즉시 제거되지는 않습니다. 프로세스 설명자는 메모리에 남아 있습니다.

프로세스 상태가 EXIT_ZOMBIE되고 프로세스의 상위 프로세스에 해당 하위 프로세스가 SIGCHLD신호로 종료 되었음을 알립니다 .

그런 다음 상위 프로세스는 대기 프로세스의 종료 상태 및 기타 정보를 읽기 위해 wait () 시스템 호출을 실행해야합니다. 이것은 부모 프로세스가 죽은 프로세스로부터 정보를 얻을 수있게합니다. wait ()가 호출 된 후 좀비 프로세스가 메모리에서 완전히 제거됩니다.

이것은 일반적으로 매우 빨리 발생하므로 시스템에서 좀비 프로세스가 누적되는 것을 볼 수 없습니다. 그러나 부모 프로세스가 올바르게 프로그래밍되지 않고 wait ()를 호출하지 않으면 좀비 자식이 정리 될 때까지 메모리에 고정됩니다.

해결:

SIGKILL 신호로 일반 프로세스를 종료 할 수 있으므로 좀비 프로세스를 종료 할 수 없습니다. 좀비 프로세스는 이미 종료되었습니다.

좀비를 죽이는 한 가지 방법은 부모 프로세스에 SIGCHLD 신호를 보내는 것입니다. 이 신호는 부모 프로세스에게 wait () 시스템 호출을 실행하고 좀비 자식을 정리하도록 지시합니다. 아래 명령의 pid를 상위 프로세스의 PID로 대체하여 kill 명령으로 신호를 전송하십시오.

kill -s SIGCHLD pid

좀비를 만든 프로세스가 종료되면 init는 좀비 프로세스를 상속하여 새 부모가됩니다. (init는 부팅시 Linux에서 시작된 첫 번째 프로세스이며 PID 1이 할당됩니다.)

참고 : -Linux 3.4부터 프로세스는 PR_SET_CHILD_SUBREAPER 옵션을 사용하여 prctl () 시스템 호출을 발행 할 수 있으므로 프로세스 # 1이 아닌 프로세스는 독립된 하위 프로세스의 상위가됩니다. 참조 : /unix//a/177361/5132  

그런 다음 INIT는 wait () 시스템 호출을 실행하여 좀비 하위를 정리하므로 init는 좀비의 짧은 작업을 수행합니다. 상위 프로세스를 닫은 후 다시 시작할 수 있습니다.


답변

대부분 좀비는 큰 문제가 아닙니다. CPU 시간이 걸리지 않으며 할당 된 메모리 죽기 전에 프로세스가 해제 . 그들이 실제로받는 유일한 리소스는 프로세스 목록의 항목입니다. 시스템에 따라 최대 허용 스레드 수를 가질 수 있으며 좀비를 사용하면 이유없이이 제한에 더 빨리 도달 할 수 있습니다.

그러나 좀비는 일반적으로 프로그래머 가 자식 프로세스의 상태를 확인하는 것을 잊어 버린 나쁜 / 버기 코드로 인해 나타납니다 . 이것은 의도적 일 수 있지만 종종 그렇지 않습니다. 불량 / 버기 코드는 종종 메모리를 잘못된 특수 방식으로 처리 하며 할당 된 리소스를 해제 하지 않습니다 . 이 경우 이러한 리소스는 좀비가 완전히 종료 될 때까지 할당 된 상태로 유지됩니다.

편집 : 프로세스가 Java 프로그램 인 경우 Java 가비지 콜렉터가 모든 것을 처리하므로 사용 가능한 메모리가 문제가되지 않아야합니다.


답변