Прокпат

Прокпат

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

решение1

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

top -p PID

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

top -pid PID

решение2

Прокпат

Обновление 2020 (Linux/procfs-only). Возвращаясь к проблеме анализа процессов достаточно часто и не будучи удовлетворенным решениями, которые я изначально описал ниже, я решил написатьмой собственный. Это пакет CLI на чистом Python, включающий несколько зависимостей (без тяжелой Matplotlib), потенциально может отображать множество метрик из procfs, запросов JSONPath к дереву процессов, имеет базовую прореживание/агрегацию (Рамера-Дугласа-Пейкера и скользящее среднее), фильтрацию по временным диапазонам и PID, а также несколько других функций.

pip3 install --user procpath

Вот пример с Firefox. Он записывает все процессы с "firefox" в их cmdline(запрос по PID будет выглядеть как '$..children[?(@.stat.pid == 42)]') 120 раз один раз в секунду.

procpath record -i 1 -r 120 -d ff.sqlite '$..children[?("firefox" in @.cmdline)]'

График RSS и использования ЦП одного процесса (или нескольких) из всех зарегистрированных будет выглядеть следующим образом:

procpath plot -d ff.sqlite -q cpu -p 123 -f cpu.svg
procpath plot -d ff.sqlite -q rss -p 123 -f rss.svg

Диаграммы выглядят так (на самом деле это интерактивные SVG-файлы Pygal):

RSS Процессор

psrecord

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

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

профилировщик_памяти

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

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

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

мпроф

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

Это может показаться излишним для простого одноразового теста, но для чего-то вроде многодневной отладки это, безусловно, разумно. Удобное все в одном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. Часть Grafana та же самая, за исключением названий метрик.

пидстат

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

решение3

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

Среди всех функций, на странице руководства говорится, что вы можете нажать, Fчтобыследоватьпроцесс.

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

Отобразить один процесс:

htop -p PID

решение4

Я немного опоздал, но поделюсь своим трюком с командной строкой, используя только параметры по умолчанию.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, который вы хотите профилировать, уже запущен. Просто поместите нужный id в переменную.

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

  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
  ....

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