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


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, telegraf(і procstatвхідний плагін) можна використовувати для передачі показників безпосередньо в 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.