Я хотел бы контролировать использование памяти одним процессором / процессором в режиме реального времени. Аналогично, top
но нацелено только на один процесс, предпочтительно с каким-то графом истории.
Я хотел бы контролировать использование памяти одним процессором / процессором в режиме реального времени. Аналогично, top
но нацелено только на один процесс, предпочтительно с каким-то графом истории.
Ответы:
В Linux top
фактически поддерживает фокусировку на одном процессе, хотя у него, естественно, нет графа истории:
top -p PID
Это также доступно в Mac OS X с другим синтаксисом:
top -pid PID
top -p `pgrep -f /usr/bin/kvm`
.
hostname
_pid.txt; exit'and
htop
это отличная замена top
. У него есть ... Цвета! Простые сочетания клавиш! Прокрутите список с помощью клавиш со стрелками! Убейте процесс, не выходя и не принимая к сведению PID! Отметьте несколько процессов и убейте их всех!
На этой странице руководства сказано, что вы можете нажать, Fчтобы следить за процессом.
На самом деле, вы должны попробовать htop
. Я никогда не начинал top
снова, после первого раза, когда я использовал htop
.
Показать один процесс:
htop -p PID
top
также имеет цвета. Нажмите z
.
top
имеет цвета! Жаль, что его цвета совершенно бесполезны, особенно по сравнению с htop
(который затухает в процессах других пользователей и выделяет базовое имя программы).
htop -p PID
будет работать так же, как пример @Michael Mrozek.
Следующий адрес истории граф какой-то . 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'
Пакет предоставляет 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
. Графана часть такая же, кроме метрик имен.
sysdig
(доступно в репозиториях Debian и Ubuntu) с sysdig-inspect UI выглядит очень многообещающе, предоставляя чрезвычайно детализированные детали наряду с загрузкой процессора и RSS, но, к сожалению, пользовательский интерфейс не может их визуализировать и sysdig
не может фильтровать procinfo
события по процессам в время написания. Тем не менее, это должно быть возможно с пользовательским долотом ( sysdig
расширение написано на Lua).
pgrep --help
на помощь. Там по крайней мере --newest
и --oldest
.
Ctrl+C
psrecord в процессе psrecord, который просто завершается без сохранения графика, необходимо завершить тестируемый процесс.
Чтобы использовать эту информацию в сценарии, вы можете сделать это:
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); это обеспечивает хороший и быстрый точный результат того, что происходит в данный момент.
Настройте переменные в соответствии с вашими потребностями.
$nPercCpu
): shell, top, grep, sed, cut ... bc. Многие, если не все, вы можете, например, объединить в 1 Sed или Awk скрипт.
top
выход «s является в среднем более чем $delay
. Ср Как рассчитать
Я обычно использую следующие два:
Штангенциркуль HP : это очень хороший инструмент для мониторинга процессов, вы также можете проверить график звонков и другую информацию низкого уровня. Но обратите внимание, это бесплатно только для личного использования.
daemontools : коллекция инструментов для управления сервисами UNIX
Используя 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
.
Если вы знаете имя процесса, вы можете использовать
top -p $(pidof <process_name>)
Если у вас есть урезанный дистрибутив Linux, в котором у top нет опций для каждого процесса (-p) или связанных опций, вы можете проанализировать вывод команды top для имени вашего процесса, чтобы получить информацию об использовании процессора для каждого процесса.
while true; do top -bn1 | awk '/your_process_name/ {print $8}' ; sleep 1; done
8 представляет использование ЦП для процесса в выводе команды top в моем дистрибутиве встроенного Linux
Не достаточно репутации, чтобы комментировать, но для psrecord вы также можете вызвать ее напрямую, программным способом, прямо в Python:
from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
Если вам нужны средние значения за период времени определенного процесса, попробуйте накопительную опцию -c top:
top -c a -pid PID
"-c a" находится в топе для Mac 10.8.5.
Для Scientific Linux опция -S может быть установлена в интерактивном режиме.
top
действительно предоставляют эту функцию. Моей версии на Fedora 19 нет. То же самое и в Ubuntu 13.04.
Я немного опоздал здесь, но я поделюсь своим трюком командной строки, используя только по умолчанию 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, который вы хотите профилировать, уже запущен. Просто поместите нужный идентификатор в переменную.
Вы получите такой вывод:
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
....