Как контролировать использование процессора / памяти одного процесса?

173

Я хотел бы контролировать использование памяти одним процессором / процессором в режиме реального времени. Аналогично, topно нацелено только на один процесс, предпочтительно с каким-то графом истории.

Джош К
источник
Какую статистику памяти вы хотите? Их много.
vwduder
Использование памяти за данный период времени, текущее использование, максимальное использование, среднее.
Джош К

Ответы:

141

В Linux topфактически поддерживает фокусировку на одном процессе, хотя у него, естественно, нет графа истории:

top -p PID

Это также доступно в Mac OS X с другим синтаксисом:

top -pid PID
Михаил Мрозек
источник
9
А так как вы не можете каждый раз искать PID, попробуйте что-то вроде top -p `pgrep -f /usr/bin/kvm`.
Стефан Ласевский
Я использую Cacti для мониторинга отдельных процессов, но установка полноценной установки Cacti звучит слишком сложно для простой ситуации, о которой здесь говорится.
Стефан Ласевский
@ Стефан: Я предполагаю, что мне придется запустить это удаленно?
Джош К
@Josh: Да, вам нужно запустить Cacti (для чего требуются MySQL, Apache и несколько других пакетов) на другом сервере. На большинстве дистрибутивов его довольно просто установить с помощью Yum или apt-get.
Стефан Ласевский
@Stefan, если вы хотите проверить удаленно, вы можете сделать ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
клерк
63

htopэто отличная замена top. У него есть ... Цвета! Простые сочетания клавиш! Прокрутите список с помощью клавиш со стрелками! Убейте процесс, не выходя и не принимая к сведению PID! Отметьте несколько процессов и убейте их всех!

На этой странице руководства сказано, что вы можете нажать, Fчтобы следить за процессом.

На самом деле, вы должны попробовать htop. Я никогда не начинал topснова, после первого раза, когда я использовал htop.

Показать один процесс:

htop -p PID

Денилсон Са Майя
источник
7
+1 за хтоп. Это одна из первых программ, которые я устанавливаю в новой системе. Это делает мою жизнь намного проще. Дерево также очень удобно.
Бартелеми
9
topтакже имеет цвета. Нажмите z.
Чепанг
2
Вы правы! topимеет цвета! Жаль, что его цвета совершенно бесполезны, особенно по сравнению с htop(который затухает в процессах других пользователей и выделяет базовое имя программы).
Денилсон Са Майя
1
И htop -p PIDбудет работать так же, как пример @Michael Mrozek.
шумно
1
Тогда единственная причина использования top - это то, что htop недоступен или не может быть установлен. Вот почему htop был создан, чтобы предоставить гораздо больше возможностей.
Лепе
62

psrecord

Следующий адрес истории граф какой-то . psrecordПакет Python делает именно это.

pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

Для одного процесса это следующее (остановлено Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

Для нескольких процессов следующий скрипт полезен для синхронизации графиков:

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

Графики выглядят так: пример psrecord

memory_profiler

Пакет предоставляет RSS-только выборки (плюс некоторые Python конкретных вариантов). Он также может записывать процесс со своими дочерними процессами (см. mprof --help).

pip install memory_profiler
mprof run /path/to/executable
mprof plot

По умолчанию появляется всплывающий ( python-tkвозможно, необходимый) проводник диаграмм на основе Tkinter, который можно экспортировать:

mprof

стек графита и статистика

Это может показаться излишним для простого одноразового теста, но для чего-то вроде отладки на несколько дней это, конечно, разумно. Удобный raintank/graphite-stackуниверсальный (от авторов Grafana) образ psutilи statsdклиент. procmon.pyобеспечивает реализацию.

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

Затем в другом терминале после запуска целевого процесса:

$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

Затем, открыв Grafana по адресу http: // localhost: 8080 , аутентифицируя как admin:admin, настроив источник данных https: // localhost , вы можете построить диаграмму, например:

графическая карта

графитовый стек и телеграф

Вместо сценария Python отправка метрик в Statsd telegrafprocstatплагин ввода) может использоваться для прямой отправки метрик в Graphite.

Минимальная telegrafконфигурация выглядит так:

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

Затем запустите линию telegraf --config minconf.conf. Графана часть такая же, кроме метрик имен.

sysdig

sysdig(доступно в репозиториях Debian и Ubuntu) с sysdig-inspect UI выглядит очень многообещающе, предоставляя чрезвычайно детализированные детали наряду с загрузкой процессора и RSS, но, к сожалению, пользовательский интерфейс не может их визуализировать и sysdig не может фильтровать procinfo события по процессам в время написания. Тем не менее, это должно быть возможно с пользовательским долотом ( sysdigрасширение написано на Lua).

SAAJ
источник
pgrep systemd выдает несколько строк вывода и, таким образом, выдает ошибку psrecord. Что делать? Я просто хочу проверить с любым процессом.
EralpB
1
@EralpB pgrep --helpна помощь. Там по крайней мере --newestи --oldest.
Saaj
2
Это должен быть принятый ответ, поскольку он фактически дает график истории использования памяти. Обратите внимание, что для метода Ctrl+Cpsrecord в процессе psrecord, который просто завершается без сохранения графика, необходимо завершить тестируемый процесс.
user2561747
8

Чтобы использовать эту информацию в сценарии, вы можете сделать это:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

используйте как: calcPercCpu.sh 1234где 1234 является пид

Для указанного $ nPid он будет измерять среднее значение 10 снимков использования процессора в целом за 1 секунду (задержка 0,1 с каждый * nTimes = 10); это обеспечивает хороший и быстрый точный результат того, что происходит в данный момент.

Настройте переменные в соответствии с вашими потребностями.

Водолей Сила
источник
Хм, 10 процессов для мониторинга использования процессора 1?
xebeche
@xebeche "он будет измерять в среднем 10 снимков" "nTimes = 10; # настроить его" :)
Aquarius Power
Я имел в виду, что мне не нравится тот факт, что вы вызываете 10 процессов, чтобы получить 1 число ( $nPercCpu): shell, top, grep, sed, cut ... bc. Многие, если не все, вы можете, например, объединить в 1 Sed или Awk скрипт.
xebeche
@xebeche круто, не стесняйтесь редактировать, добавив лучшую команду к существующей (в качестве альтернативы), вы получили мое любопытство :)
Aquarius Power
1
Я добавил свой ответ . Кстати, обратите внимание , что нет смысла вычисления среднего , потому что topвыход «s является в среднем более чем $delay. Ср Как рассчитать
загрузку
5

Я обычно использую следующие два:

  1. Штангенциркуль HP : это очень хороший инструмент для мониторинга процессов, вы также можете проверить график звонков и другую информацию низкого уровня. Но обратите внимание, это бесплатно только для личного использования.

  2. daemontools : коллекция инструментов для управления сервисами UNIX

Hemant
источник
6
Я использовал daemontools в течение многих лет. Он великолепен в качестве супервизора / сторожа для других процессов. Как это помогает вам контролировать использование процессора / памяти для одного процесса?
Стефан Ласевский
3

Используя topи awkможно легко создать, например, разделенный запятыми журнал использования% CPU ( $9) +% MEM ( $10), который впоследствии можно будет вводить в любой инструмент статистики и построения графиков.

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

Выход будет как

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

Это не даст хороших результатов для больших $delay, хотя, потому что напечатанная временная метка фактически $delayотстает из-за того, как topработает вывод. Не вдаваясь в подробности, 1 простой способ обойти это - записать время, предоставленное top:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

Тогда отметка времени будет точной, но вывод все равно будет задерживаться $delay.

xebeche
источник
2

Если вы знаете имя процесса, вы можете использовать

top -p $(pidof <process_name>)
user4757345
источник
8
Это в значительной степени то, что говорится в принятом ответе много лет назад и в его первом комментарии.
дхаг
1

Если у вас есть урезанный дистрибутив Linux, в котором у top нет опций для каждого процесса (-p) или связанных опций, вы можете проанализировать вывод команды top для имени вашего процесса, чтобы получить информацию об использовании процессора для каждого процесса.

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8 представляет использование ЦП для процесса в выводе команды top в моем дистрибутиве встроенного Linux

Разан Пол
источник
1

Не достаточно репутации, чтобы комментировать, но для psrecord вы также можете вызвать ее напрямую, программным способом, прямо в Python:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
ZettaCircl
источник
0

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

top -c a -pid PID

"-c a" находится в топе для Mac 10.8.5.

Для Scientific Linux опция -S может быть установлена ​​в интерактивном режиме.

Kieleth
источник
Вы, вероятно, захотите добавить дополнительную информацию о том, какие версии topдействительно предоставляют эту функцию. Моей версии на Fedora 19 нет. То же самое и в Ubuntu 13.04.
СЛМ
Вы правы! Я был так счастлив, что нашел что-то полезное, я забыл, что я был в моем Mac дома.
Килет
0

Я немного опоздал здесь, но я поделюсь своим трюком командной строки, используя только по умолчанию ps

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss" do; 
   sleep 1 
done

Я использую это как однострочник. Здесь первая строка запускает команду и сохраняет PID в переменной. Затем ps напечатает истекшее время, PID, процент использования ЦП, процент памяти и память RSS. Вы можете добавить и другие поля.

Как только процесс завершится, psкоманда не вернет «успех» и whileцикл завершится.

Вы можете игнорировать первую строку, если PID, который вы хотите профилировать, уже запущен. Просто поместите нужный идентификатор в переменную.

Вы получите такой вывод:

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....
теист
источник