it-swarm-ru.tech

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

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

194
Josh K

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

top -p PID

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

top -pid PID
157
Michael Mrozek

psrecord

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

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 example

memory_profiler

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

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

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

mprof

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

Это может показаться излишним для простого одноразового теста, но для чего-то вроде отладки на несколько дней это, конечно, разумно. Удобный моноблок raintank/graphite-stack (от авторов Графаны) изображение и 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: 808 , аутентификация как admin:admin, настраивая источник данных https: // localhost , вы можете построить график, например:

grafana chart

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

Вместо Python скрипт, отправляющий метрики в Statsd, telegrafprocstat входной плагин) можно использовать для отправки метрик Графит напрямую.

Минимальная конфигурация telegraf выглядит следующим образом:

[agent]
  interval = "1s"

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

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

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

pidstat

pidstat (часть пакета sysstat) может создавать выходные данные, которые могут быть легко проанализированы. Это полезно в случае, когда вам нужны дополнительные метрики из процесса (ов), например, Самые полезные 3 группы (процессор, память и диск) содержат: %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. Я описал это в связанный ответ .

87
saaj

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

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

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

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

htop -p PID

67
Denilson Sá Maia

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

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); это обеспечивает хороший и быстрый точный результат того, что происходит в данный момент.

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

8
Aquarius Power

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

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

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

5
Hemant

Используя 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.

5
xebeche

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

top -p $(pidof <process_name>)
2
user4757345

Я немного опоздал, но я поделюсь своим трюком с командной строкой, используя по умолчанию 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 не вернет "success" и цикл 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
  ....
2
theist

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

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
2
ZettaCircl

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

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

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

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

каждые 2 секунды процесс печати 7994 процессора

0
赵宝磊

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

top -c a -pid PID

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

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

0
Kieleth