
Я хотел бы отслеживать использование памяти / процессора одним процессом в реальном времени. Похоже на , 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):
psrecord
Следующие адресаисторический график какой-то. Питонpsrecord
package делает именно это.
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'
профилировщик_памяти
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,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
. Часть 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
....