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

16

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

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

[Обновить]

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

Выходные значения Michał в одну строку меньше, чем topдля CPU и Mem. У тебя есть идея почему?

выходной верх:

 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
Framester
источник
Я, к сожалению, пока не могу комментировать здесь, но вы можете найти интересный пост, объясняющий, почему он psможет отличаться от top: stackoverflow.com/questions/131303/…
PM

Ответы:

16

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

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

Михал Шрайер
источник
Просто и делает свою работу!
rafaelbattesti
3

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

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

Вы бы «запустили верх в пакетном режиме (-b). Он будет обновляться каждые 10 секунд, как указано в флаге задержки (-d), для общего количества 3 итераций (-n). Вывод будет отправлен в файл. " В том числе -pвы можете указать pidпроцесс, который вы после. Это, конечно, вернет больше, чем просто процессор и оперативная память, но будет содержать эти поля. Например, в моем случае я получу следующее при мониторинге 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
ВЕЧЕРА
источник
Эта страница, хотя она и не перенаправляет в файл, выполняет некоторые более сложные модификации, позволяющие получить только распечатанный процессор. Если вам кто-то знает хороший способ перенаправить вывод в файл и периодически обновлять его, мне было бы интересно узнать. watchне кажется мне идеальным для этого: superuser.com/questions/281347/filtering-top-command-output
PM
2

Этот простой скрипт на 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 или когда процесс завершается.

Стефано Палаццо
источник
Уважаемый Стефано, большое спасибо за ваш сценарий. К сожалению, это похоже на неправильные результаты. У тебя есть идеи почему? Пожалуйста, смотрите мой обновленный вопрос.
Framester
На странице ps man man7.org/linux/man-pages/man1/ps.1.html ps выводит «использованное время ЦП, деленное на время выполнения процесса (отношение cputime / realtime), выраженное в процентах "- таким образом, вы получаете среднее значение
Николас Чарльз