Як слідкувати за використанням процесора / пам'яті для одного процесу?


170

Я хотів би відслідковувати використання пам'яті / процесора одного процесу в режимі реального часу. Подібний, topале орієнтований лише на один процес, бажано з графіком історії певного роду.


Яку статистику пам'яті ви хочете? Їх дуже багато.
vwduder

Використання пам'яті за певний часовий період, поточне використання, максимальне використання, середнє значення.
Джош К

Відповіді:


139

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

top -p PID

Це також доступно в Mac OS X з іншим синтаксисом:

top -pid PID

9
А оскільки ви, можливо, не хочете шукати PID кожен раз, спробуйте щось подібне top -p `pgrep -f /usr/bin/kvm`.
Стефан Ласєвський

Я використовую кактуси для моніторингу деяких окремих процесів, але встановлення повноцінної установки кактусів звучить занадто складно для простої ситуації, яку тут задають.
Стефан Ласєвський

@Stefan: Я припускаю, що мені доведеться запускати це віддалено?
Джош К

@Josh: Так, вам потрібно запустити Cacti (для чого потрібні MySQL, Apache та кілька інших пакетів) на іншому сервері. У більшості дистрибутивів це досить просто встановити за допомогою Yum або apt-get.
Стефан Ласєвський

@Stefan, якщо ви хочете перевірити дистанційно, ви можете зробити ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
Клерк

61

htopє чудовою заміною top. У ньому є ... Кольори! Прості комбінації клавіш! Прокрутіть список за допомогою клавіш зі стрілками! Вбийте процес, не виходячи і не беручи до уваги ПІД! Позначте кілька процесів і вбийте їх усіх!

Серед усіх функцій на сторінці вказується, що ви можете натиснути, Fщоб слідкувати за процесом.

Дійсно, слід спробувати htop. Я ніколи не починав topзнову, після першого разу використовував htop.

Відображення одного процесу:

htop -p PID


7
+1 для htop. Це одна з перших програм, які я встановлюю в новій системі. Це значно полегшує моє життя. Вид на дерево також дуже зручний.
Бартелемей

9
topтакож має кольори. Натисніть z.
tshepang

2
Ти правий! topмає кольори! Шкода, що його кольори досить марні, особливо в порівнянні з htop(що зникає процесів інших користувачів та підкреслює базову назву програми).
Denilson Sá Maia

1
І htop -p PIDтеж буде працювати, подібно до прикладу, поданого @Michael Mrozek.
шумив

1
Тоді єдина причина використовувати вершину, тому що htop недоступний або не може бути встановлений. Саме тому htop був створений, щоб забезпечити набагато більше функцій.
lepe

59

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

графіт-стек і statsd

Це може здатися надмірним для простого одноразового тестування, але для чогось на зразок багатоденної налагодження це, безумовно, розумно. 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: 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, виглядають дуже перспективно, надаючи надзвичайно дрібні деталі разом із використанням процесора та RSS, але, на жаль, інтерфейс не в змозі їх відобразити і sysdig не може фільтрувати procinfo події за допомогою процесу в час написання. Хоча це має бути можливо за допомогою спеціального зубила ( sysdigрозширення, написане в Луа).


pgrep systemd дає кілька ліній виводу, і, таким чином, помилки psrecord, що робити? Я просто хочу перевірити будь-який процес.
EralpB

1
@EralpB pgrep --helpна допомогу. Там принаймні --newestі --oldest.
саай

2
Це має бути прийнятою відповіддю, оскільки це насправді дає графік історії використання пам'яті. Зверніть увагу на метод Ctrl+Cpsrecord: процес psrecord просто закривається, не зберігаючи сюжет, вам потрібно закінчити тестування процесу.
користувач2561747

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; # налаштувати його" :)
Водолій Сила

Я мав на увазі, що мені не подобається те, що ви викликаєте 10 процесів, щоб отримати 1 число ( $nPercCpu): оболонка, верх, греп, sed, вирізати ... до н.е. Багато, якщо не все це ви могли, наприклад, об'єднати в сценарій 1 Sed або Awk.
xebeche

@xebeche прикольно, не соромтесь редагувати, додаючи кращу команду до існуючої (як альтернатива), ти отримав мою цікавість :)
Водолій Сила

1
Я додав власну відповідь . До речі, зауважте, що немає сенсу обчислювати середній показник, оскільки topвихід ' є середнім $delay. Ср. Як розрахувати використання процесора
xebeche

5

Я зазвичай використовую наступні два:

  1. Супорт HP : його дуже хороший інструмент для моніторингу процесів, ви також можете перевірити графік викликів та іншу інформацію низького рівня. Але зауважте, що вона безкоштовна лише для особистого користування.

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


6
Я використовував демонтоли протягом багатьох років. Це чудово як керівник / сторожовий працівник для інших процесів. Як це допомагає вам відстежувати використання процесора / пам'яті для одного процесу?
Стефан Ласєвський

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працює вихід. Не вдаючись до занадто багато деталей, один простий спосіб цього - це зафіксувати час, передбачений 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.


2

Якщо ви знаєте ім'я процесу, ви можете використовувати

top -p $(pidof <process_name>)

8
Це майже те, що було прийнято відповідь з років тому, і його перший коментар говорить.
dhag

1

Якщо у вас є скорочений дистрибутив Linux, де у верхній частині немає опції для процесу (-p) або пов'язаних з цим параметрів, ви можете проаналізувати висновок верхньої команди для імені вашого процесу, щоб отримати інформацію про використання процесора на процес.

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

8 представляє використання процесора на процес у висновку верхньої команди в моєму вбудованому дистрибутиві Linux


1

Недостатньо репутації для коментування, але для psrecord ви можете також зателефонувати йому безпосередньо, програмно, безпосередньо в Python:

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

0

Якщо вам потрібні середні показники за певний період певного процесу, спробуйте накопичувальну опцію -c вгорі:

top -c a -pid PID

"-c a" знайдено в топі для Mac 10.8.5.

Для Scientific Linux опція -S, яку можна встановити інтерактивно.


Ви, ймовірно, захочете додати докладнішу інформацію про те, в якій версії topфактично надається ця функція. Моя версія на Fedora 19 не відповідає. Те саме і на Ubuntu 13.04.
slm

Ви маєте рацію !, Я був такий щасливий, що знайшов щось корисне, що забув, що перебуваю вдома вдома.
Кілет
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.