类似于问题如何记录 CPU 负载?,我想记录一个过程的记忆。
我想要记录的进程在远程服务器上被终止,并且我想找出它被终止之前的 CPU 负载和内存使用情况。
[更新]
Stefano Palazzo 的简洁 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
输出 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