Как найти процесс(ы), которые загружают машину

Как найти процесс(ы), которые загружают машину

Сценарий: Внезапно мой компьютер стал работать медленно. Мышь двигается, но окна долго открываются и т. д., uptimeпишет, что загрузка 7,69 и продолжает расти.

Какой самый быстрый способ узнать, какой процесс(ы) является причиной нагрузки?

Теперь, "top" и подобные инструменты не являются ответом, потому что они показывают либо использование ЦП, либо памяти, но не оба одновременно. Мне нужна одна команда, которую я мог бы набрать, когда это произойдет - что-то, что выяснит любой из

Система пытается выгрузить 8 ГБ оперативной памяти на диск, поскольку процесс X ...

или

процесс X ищет по всему диску

или

процесс X использует 400% ЦП"

Итак, я ищу iostat, htop/atop и подобные инструменты, которые выводят что-то вроде этого:

 1235 cp - Disk trashing
   87 chrome - Uses 2 GB of RAM
  137 nfs_bench - Uses 95% of the network bandwidth

Мне не нужен инструмент, который дает мне какие-то цифры, которые я могу анализировать, а инструмент, который точно сообщает мне, какой процесс вызывает текущую нагрузку. Предположим, что пользователь перед клавиатурой едва знает, как написать «процесс», но он быстро теряется, когда дело доходит до «резидентного размера», «виртуальной памяти» или «жизненного цикла процесса».

Мой аргумент таков: Пользователь замечает проблему. Причин может быть тысячи... ну, почти :-) Пользователь хочет знать источник проблемы.

Текущие решения дают мне много цифр, и мне нужно знать, что эти цифры означают. Я ищу метаинструмент. 99% данных не имеют отношения к проблеме. Поэтому инструмент должен искать процессы, которые потребляют некоторые ресурсы, и перечислять только те, которые вместе с «этот процесс требует много ресурсов ЦП, он создает много IRQ, этот процесс выделяет много оперативной памяти (и он все еще растет)».

Это будет относительно короткий список. Для кого-то нового будет гораздо проще найти виновника из этого списка, чем из вывода, скажем, htopкоторый дает мне около 5000 чисел, но требует от меня сворачивать многопоточные процессы самостоятельно (у меня 50 строк, которые говорят, VIRT 2750Mно только 16 ГБ ОЗУ - машина должна сама себя подкачивать, но, конечно, это неверное толкование данных, которое может произойти быстро).

решение1

Мне приходится улыбаться, глядя на ответы, потому что каждый из них советовал вам запустить инструмент X. Единственная проблема в том, что если то, что вы видите, прерывисто, то не будет возможности что-либо сопоставить. Такой инструмент, каксарможет помочь, если вы запустите его на достаточно высокой частоте, но я бы сказал,собиратьеще лучше.

Нравитьсясар, вы запускаете его как демон, установив RPM и выполнив /etc/init.d/collectl start.

Теперь, когда вы видите что-то вялое, collectl -p /var/log/collectl/filename --topвоспроизведет данные и покажет вам главные процессы. Вы также могли бы просто запустить collectl --topи увидеть их в реальном времени. Кстати, все, что вы можете сделать в реальном времени, вы также можете воспроизвести.

Что касается загрузки ЦП, что делать, если вы перегружены прерываниями? collectl -sCне только покажет загрузку отдельных ЦП (или использование -scдля средней нагрузки), но и покажет, как они тратят свое время. Включите -j( -scj), и вы увидите количество прерываний/ЦП. Используйте заглавные буквы -J, и вы увидите ТИПЫ каждого прерывания/ЦП.

Конечно, если вам действительно нравится vmstat, вы всегда можете воспроизвести данные collectl, --vmstatи он покажет исторические данные в формате vmstat.

Переключателей гораздо больше, чем я успею перечислить, но вы можете проверить это здесьSourceForgeили просто погуглите.

решение2

"top" работает достаточно хорошо, если вы смотрите на правильные числа. Давайте посмотрим:

top - 13:11:45 up 13 days,  1:13, 21 users,  load average: 0.06, 0.11, 0.26
Tasks: 271 total,   2 running, 267 sleeping,   0 stopped,   2 zombie
Cpu(s): 19.0%us,  6.3%sy,  0.0%ni, 74.0%id,  0.5%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8183668k total,  8002712k used,   180956k free,    12476k buffers
Swap: 11847900k total,   723480k used, 11124420k free,   767016k cached

Теперь, если система работает медленно из-за того, что весь ЦП занят, это отображается в столбцах «us» и «sy» в строке «Cpu(s):», которые вместе близки к 100%.

Если медленная работа вызвана подкачкой, «Mem:» «free» показывает очень низкие значения, а «Swap:» «used» — высокие.

Если это медленно из-заВвод/выводв общем случае "Cpu(s):" "wa" говорит о том, что время тратится на ожидание ввода-вывода.

Теперь, если вы знаете, что проблема заключается в ожидании ввода-вывода, вы можете использовать программу «iotop», чтобы узнать, какие процессы создают больше всего операций ввода-вывода.

решение3

Исходя из 400% использования, я предполагаю, что у вас четырехъядерный процессор. Ваша средняя загрузка почти вдвое больше мощности, и половина процессов ждут CPU.

Сначала reniceваша оболочка 0 или -10, чтобы получить более отзывчивую систему, а затем используйте htopдля поиска проблемного процесса(ов) и следуйте за ним straceна данном процессе. Другие инструменты, которые могут быть полезны:

  • vmsat
  • sar
  • iostat
  • pmap

решение4

vmstat может помочь вам в общих чертах. Пример использования:

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 977908 426184 1543884    0    0    38    45  106  385  4  1 95  1

Вы также можете запускать его каждые X секунд — просто добавьте число X после команды.

Редактировать: Ввиду комментария... Запишите следующее в файл и сделайте его исполняемым. Он покажет вам 3 основных процесса на машине.

top -n 1 | tail -16 | head -4 | awk '{print $13}'

Если вы хотите узнать, какая из них загружает память, а какая — процессор, то прочитайте верхнюю страницу руководства и измените порядок отображения.

Связанный контент