Как регистрировать использование памяти и процессора приложением?

Как регистрировать использование памяти и процессора приложением?

Похоже на вопросКак регистрировать загрузку процессора?, Я хотел бы зарегистрировать память процесса.

Процесс, который я хочу зарегистрировать, завершен на удаленном сервере, и я хочу узнать загрузку ЦП и использование памяти непосредственно перед его завершением.

[обновлять]

И аккуратный маленький скрипт на Python Стефано Палаццо, и

Значения выходных данных Михала в одну строку меньше, чем в topдля ЦП и Памяти. Есть ли у вас идея, почему?

выход сверху:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

вывод скрипта Python Стефано Палаццо:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

решение1

Вы можете создать однострочный код в оболочке:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

для регистрации процесса с pid=123 просто:

logpid 123

или просмотреть и записать журнал в файл:

logpid $$ | tee /tmp/pid.log

Если вы хотите, чтобы регистрировались другие данные, измените -o {this}параметры. См. man psраздел "СТАНДАРТНЫЕ СПЕЦИФИКАЦИИ ФОРМАТА" для доступных параметров для использования. Если вы хотите другое разрешение по времени, измените sleep {this}функцию logpid().

решение2

Если вам нужна именно topстатистика, вы можете запустить ее topв пакетном режиме, указав pid нужного вам процесса. Взяв пример с этой страницы (http://www.dedoimedo.com/computers/linux-cool-hacks.html) если вы набрали

top -b -d 10 -n 3 >> top-file

Вы бы "запустили top в пакетном режиме (-b). Он будет обновляться каждые 10 секунд, как указано флагом задержки (-d), для общего количества 3 итераций (-n). Вывод будет отправлен в файл". Включая, -pвы можете указать pidпроцесс, который вам нужен. Это, конечно, вернет больше, чем просто cpu и ram, но оно будет содержать эти поля. В моем случае, например, я бы получил следующее при мониторинге pid 9189 с помощью top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit

решение3

Этот простой скрипт на Python должен сделать то, что вам нужно:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Сначала вам необходимо узнать идентификатор процесса программы, которую вы хотите отслеживать, затем вы можете запустить скрипт с PID в качестве аргумента:

python log.py 3912

Он будет выводить загрузку процессора и оперативной памяти в процентах два раза в секунду:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Затем вы можете перенаправить его вывод в файл, чтобы позже импортировать его в электронную таблицу ( python log.py 9391 > firefox_log.txt) и импортировать данные в электронную таблицу, выбрав Tabв качестве разделителя.

Программа завершает работу при нажатии Ctrl+C или при завершении процесса.

решение4

Прокпатможет использоваться для записи метрик Procfs приложения (деревьев процессов), включая использование ЦП и размер резидентного набора (RSS). Полное раскрытие информации: я написал это.

Возьмем в качестве примера Firefox. На моей машине его дерево процессов выглядит так:

 /usr/lib/firefox/firefox
 ├─ /usr/lib/firefox/firefox -contentproc -childID 4 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 3 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 2 ...
 ├─ /usr/lib/firefox/firefox -contentproc -childID 1 ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 ├─ /usr/lib/firefox/firefox -contentproc -parentBuildID ...
 └─ /usr/lib/firefox/firefox -contentproc -childID 8 ... 

С помощью Procpath вы можете собирать метрики процесса из этого дерева следующим образом (и см.документацияесли вы хотите запросить у супервизора процесса вашего объединения, например systemd или Docker, корневой PID):

procpath record -d firefox.sqlite '$..children[?(@.stat.comm == "firefox")]'

С помощью этой команды Procpath будет собирать и записывать метрики Procfs этого дерева раз в 10 секунд. Вы можете оставить его запущенным в терминальном мультиплексоре (например, Byobu), чтобы он работал в фоновом режиме на вашем сервере.

Если приложение снова даст сбой, вы можете использовать эту команду для визуализации загрузки ЦП и размера резидентного набора приложения.

procpath plot -d firefox.sqlite -f firefox.svg -q cpu -q rss --formatter=integer

График зависимости ЦП от RSS

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