Отключение процессов с использованием процессора
Выход из 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, но он что-то делал.