Отключение процессов с использованием процессора

Выход из ps aux содержит следующее:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ubuntu    1496  9.1  0.0      0     0 pts/0    Z+   19:47   0:30 [python] <defunct>
ubuntu    1501 14.6  0.0      0     0 pts/0    Z+   19:47   0:48 [python] <defunct>
ubuntu    1502 14.8  0.0      0     0 pts/0    Z+   19:47   0:48 [python] <defunct>
ubuntu    1503 15.1  0.0      0     0 pts/0    Z+   19:47   0:49 [python] <defunct>
ubuntu    1504 15.4  0.0      0     0 pts/0    Z+   19:47   0:50 [python] <defunct>
ubuntu    1505 15.8  0.0      0     0 pts/0    Z+   19:47   0:52 [python] <defunct>
ubuntu    1506 16.0  0.0      0     0 pts/0    Z+   19:47   0:53 [python] <defunct>
ubuntu    1507 14.1  0.0      0     0 pts/0    Z+   19:47   0:46 [python] <defunct>
ubuntu    1508 14.3  0.0      0     0 pts/0    Z+   19:47   0:47 [python] <defunct>
ubuntu    1509 14.4  0.0      0     0 pts/0    Z+   19:47   0:47 [python] <defunct>
ubuntu    1510 14.6  0.0      0     0 pts/0    Z+   19:47   0:48 [python] <defunct>
ubuntu    1511 14.9  0.0      0     0 pts/0    Z+   19:47   0:49 [python] <defunct>
ubuntu    1512 10.7  0.0      0     0 pts/0    Z+   19:47   0:35 [python] <defunct>
ubuntu    1513 71.3  0.0      0     0 pts/0    Z+   19:47   3:55 [python] <defunct>

Это куча процессов, порожденных многопроцессорностью, которые завершились и ожидают присоединения от родителя. Почему они занимают процессор?

Если это просто артефакт psКак я могу получить точное представление о том, сколько ЦП используется?

3 ответа

Процесс зомби (то есть тот, который "не функционирует") не потребляет ЦП: он просто сохраняется ядром, чтобы родительский процесс мог получить информацию о нем (например, состояние возврата, использование ресурсов и т. Д.).

Загрузка ЦП указана ps Команда соответствует использованию ЦП во время работы процесса, то есть до его завершения и превращения в зомби.

Это процессы Zombie, как указано Z в столбце stat - они не будут очищены, пока их родительский процесс не будет завершен. Я не знаю много о питоне, но, вероятно, вы вызвали fork или подобное в вашем интерпретаторе python, чтобы вызвать их. Убейте переводчика и зомби будут пожинены (убраны).

Попробуйте команду "top", если вы хотите обновлять информацию о процессоре.

Кроме того, я предпочитаю выходной сигнал из "ps -ef", а не "ps aux". Aux всегда казался мне нестандартным хаком (следовательно, отсутствие '-' для разделения команд и аргументов) он также не работает на многих другие системы Unix, такие как HPUX, AIX и т. д.

"ps -ef" показывает ppid (родительский pid), который помогает вам отследить подобные проблемы.

Интересно и, возможно, сбивает с толку, что на данный момент у меня есть зомби-процесс, который накапливает процессорное время в моей системе. Итак, вопрос в том, почему? Считается, что любой выход из psкоторый показывает зомби-процесс, означает, что используется только запись в таблице процессов; из википедии: «... процесс-зомби или несуществующий процесс - это процесс, который завершил выполнение (через системный вызов выхода), но все еще имеет запись в таблице процессов: это процесс в« Завершенном состоянии ».» и из unix.stackexchange: https://unix.stackexchange.com/questions/11172/how-can-i-kill-a-defunct-process-whose-parent-is-init "Зомби-процессы почти не занимают ресурсов, поэтому нет отсутствие затрат на производительность в том, чтобы позволить им задерживаться ".

Итак, у меня есть зомби-процесс:

      # ps -e -o pid,ppid,stat,comm| grep Z
 7296     1 Zl   myproc <defunct>

Что, похоже, использует время процессора:

      # ps -e -o pid,ppid,bsdtime,stat,comm| grep Z; sleep 10; ps -e -o pid,ppid,bsdtime,stat,comm | grep Z
 7296     1  56:00 Zl   myproc <defunct>
 7296     1  56:04 Zl   myproc <defunct>

Итак, как процесс-зомби может накапливать процессорное время?

Я изменил свой поиск:

      # ps -eT -o pid,lwp,ppid,bsdtime,stat,comm| grep 7296 
 7296  7296     1   1:29 Zl   myproc <defunct>
 7296  8009     1  56:11 Dl   myproc

и я вижу, что у меня есть запущенный поток, использующий системный ввод-вывод. В самом деле, если я сделаю это, я увижу изменение поля 15 (stime):

      # watch -d -n 1 cat /proc/8009/stat
Every 1.0s: cat /proc/8009/stat                  Fri Jun  4 11:19:55 2021

8009 (myproc) D 1 7295 7295 0 -1 516 18156428 12281 37 0 11609 344755

(обрезано в поле 15)

Поэтому я пытаюсь убить процесс 8009 с помощью TERM ... не сработало. Убивать его с помощью УБИЙСТВА тоже бесплодно.

Для меня это похоже на ошибку ядра. Я все же попытался сдержать его, что было глупо, потому что теперь моя привязка не выходила.

Это на RHEL 7.7 с ядром 3.10.0-1062. Стар в это время, но достаточно молод, чтобы сделать (на мой взгляд) вывод, что процесс Зомби может накапливать системные ресурсы из-за какой-то ошибки.

Кстати, по мнению iotopпиковая скорость нашего ввода-вывода составляет 4 Гбит / с, что очень много. Я думаю, что это определенно влияет на нашу систему, и я хочу перезагрузиться.

ls вывод / proc / 8009 возвращает это:

      # ls -l /proc/8009
ls: cannot read symbolic link /proc/8009/cwd: No such file or directory
ls: cannot read symbolic link /proc/8009/root: No such file or directory
ls: cannot read symbolic link /proc/8009/exe: No such file or directory

(следует нормальный вывод / proc / pid ... но я его обрезал)

/ proc / 8009 / fd пуст. Таким образом, хотя у меня происходит значительный объем операций ввода-вывода, он не записывается ни в какие файлы. Я не вижу, чтобы пространство файловой системы использовалось, как показано df -h выход.

Наконец: попытка перезагрузки оказывается невозможной. shutdown -r nowне работает. Есть пара процессов systemd, которые застревают в ожидании ввода-вывода:

        PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
22725 root       20   0  129M  2512  1548 R  0.0  0.0  0:00.19 htop
22227 root       20   0  195M  4776  2652 D  0.0  0.0  0:00.00 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
    1 root       20   0  195M  4776  2652 D  0.0  0.0  0:58.41 /usr/lib/systemd/systemd --switched-root --system --deserialize 22

Вот результат выключения. Я бы сказал, что init довольно запутался на этом этапе:

      # shutdown -r now
Failed to open /dev/initctl: No such device or address
Failed to talk to init daemon.

rebootговорит то же самое. Мне придется отключить эту машину.

... Обновление: как только я вошел в консоль, система перезагрузилась! Наверное, минут 10 ушло. Так что я не знаю, что делал systemd, но он что-то делал.

Другие вопросы по тегам