Будь-яке питання, якщо стан зомбі не очищено?


18

У мене є виробничий підрозділ, в якому процес Java став Zombie і залишався там деякий час. Якщо блок перезапущений, він буде очищений. Однак пристрій не перезапускається, і інший процес Java працює. Чи є якесь питання, якщо цей стан зомбі залишається таким, яким він є, не очищаючи його? Чи вплине це будь-яким чином (продуктивність чи повільність)?

Відповіді:


22

Процес зомбі не матиме ніякого впливу на продуктивність або повільність, оскільки зомбі-процеси не використовують жодних системних ресурсів.

Примітка: - Практично, він все ще використовує PID (який є обмеженим ресурсом), і структури даних ядра для процесу все ще виділяються. Зазвичай це не має великого значення, але використання пам'яті ядра може бути значним у системах з дуже обмеженою пам'яттю.

Проблема, викликана процесом зомбі

Кожен процес зомбі зберігає свій ідентифікатор процесу. Системи Linux мають обмежену кількість ідентифікаторів процесів - 32767 за замовчуванням для 32-бітних систем. Якщо зомбі накопичуються дуже швидко, весь пул доступних PID-файлів з часом стане призначений для процесів зомбі, не дозволяючи запускати інші процеси.

Примітка . У 64-бітних системах ви можете збільшити максимальний PID, див. Https://unix.stackexchange.com/a/16884/170373

Однак декілька зомбі-процесів, що зависають, не є проблемою - хоча вони і вказують на помилку з батьківським процесом у вашій системі.

Пояснення:

Коли процес гине в Linux, він не видаляється з пам'яті відразу, його дескриптор процесу залишається в пам'яті.

Статус процесу стає EXIT_ZOMBIEі батько процесу повідомляється, що його дочірній процес загинув за допомогою SIGCHLDсигналу.

Потім батьківський процес повинен виконати виклик системи wait () для зчитування стану виходу мертвого процесу та іншої інформації. Це дозволяє батьківському процесу отримати інформацію з мертвого процесу. Після виклику wait () процес зомбі повністю вилучається з пам'яті.

Зазвичай це відбувається дуже швидко, тому ви не побачите процесів зомбі, що накопичуються у вашій системі. Однак якщо батьківський процес не запрограмований належним чином і ніколи не викликає функцію wait (), його зомбі діти залишатимуться в пам'яті, поки вони не очистяться.

Роздільна здатність:

Ви не можете вбивати процесів зомбі, оскільки ви можете вбивати нормальні процеси за допомогою сигналу SIGKILL - процеси зомбі вже мертві.

Один із способів вбивства зомбі - це надсилання сигналу SIGCHLD батьківському процесу. Цей сигнал вказує батьківському процесу виконати виклик системи wait () та очистити своїх дітей-зомбі. Надішліть сигнал командою kill, замінивши pid в команді нижче на PID батьківського процесу:

kill -s SIGCHLD pid

Коли процес, який створив зомбі, закінчується, init успадковує процеси зомбі і стає їх новим батьківським. (init - це перший процес, запущений в Linux під час завантаження і йому присвоюється PID 1.)

Примітка: - З Linux 3.4 процеси можуть видати системний виклик prctl () за допомогою параметра PR_SET_CHILD_SUBREAPER, і в результаті вони, не обробляючи номер 1, стануть батьком своїх осиротілих нащадків. Посилання: /unix//a/177361/5132  

Потім INIT виконує виклик системи wait (), щоб очистити своїх дітей-зомбі, тому init зробить коротку роботу зомбі. Ви можете перезапустити батьківський процес після його закриття.


Чи є шанс, коли очікування () не вдається?
Раві

3
У 64-бітних системах можна збільшити максимальний PID, див. Unix.stackexchange.com/a/16884/170373
ilkkachu

1
Частина про переоформлення теж неправильна. unix.stackexchange.com/a/177361/5132 За іронією долі, перетворення програм на підпрограми, які не сподіваються на це, є простим способом викликати тривалі процеси зомбі.
JdeBP

2
Батько вже отримав SIGCHLD, коли процес, який зараз є зомбі, загинув.
Ángel

2
Строго кажучи, невірно сказати, що він не використовує ресурсів. Він все ще використовує PID (що є обмеженими ресурсами), і структури даних ядра для процесу все ще виділяються. Зазвичай це не має великого значення, але використання пам'яті ядра може бути значним у системах з дуже обмеженою пам'яттю.
Остін Хеммельгарн

6

Здебільшого, зомбі - це не велика проблема. Це "мертвий" процес, який не вимагає часу процесора, і будь-яка виділена пам'ять повинна бути звільнена процесом перед смертю. Єдиний ресурс, який вони фактично беруть, - це запис у вашому списку процесів. Залежно від вашої системи, ви можете мати максимально дозволену кількість потоків, а зомбі може змусити вас швидше досягти цієї межі без будь-якої причини.

Однак: Зомбі зазвичай з'являються через поганий / помилковий код, коли програміст забув перевірити стан своїх дочірніх процесів. Це може бути навмисно, але часто це не так. Неправильний / помилковий код часто також обробляє пам'ять погано спеціальним чином, і не звільняє деякі виділені ресурси. Якщо це так, ці ресурси залишатимуться виділеними для зомбі, поки вони повністю не припиняться.

Редагувати : Якщо процес є програмою java, не звільнена пам'ять не повинна бути проблемою, оскільки збирач сміття Java бере на себе все.


3
Насправді, не подача пам'яті не видає її для більшості ОС на всіх мовах. Система звільнить усю пам'ять, за винятком невеликого обсягу для батьківського процесу.
Валь каже: Відновіть Моніку
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.