如何记录应用程序的内存和 CPU 使用情况?

如何记录应用程序的内存和 CPU 使用情况?

类似于问题如何记录 CPU 负载?,我想记录一个过程的记忆。

我想要记录的进程在远程服务器上被终止,并且我想找出它被终止之前的 CPU 负载和内存使用情况。

[更新]

Stefano Palazzo 的简洁 Python 脚本和

Michał 的一行输出值小于topCPU 和 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 

输出 Stefano Palazzo 的 python 脚本:

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

答案1

您可以在 shell 中创建单行命令:

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)

您首先需要找出要监控的程序的进程 ID,然后可以使用 PID 作为参数运行脚本:

python log.py 3912

它将每秒两次以百分比形式打印 CPU 使用率和 RAM 使用率:

%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 指标,包括 CPU 使用率和驻留集大小 (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 将每 10 秒收集并记录一次此树的 Procfs 指标。您可以让它在终端多路复用器(如 Byobu)中运行,以便在服务器的后台运行它。

当您的应用程序再次崩溃时,您可以使用此命令来可视化应用程序的 CPU 使用率和常驻集大小。

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

CPU 与 RSS 图

相关内容