如何记录应用程序的内存和CPU使用情况?
与问题类似如何记录CPU负载? ,我想记录一个进程的内存。
我想要记录的进程在远程服务器上被杀死,我想在它被杀死之前找出CPU负载和内存使用情况。
[更新]
Stefano Palazzo的整齐的小python剧本和
Michał的一行输出值小于CPU和Mem的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
输出Stefano Palazzo的python脚本:
python memlogger.py 2312 %CPU %MEM 76.00 0.20 76.00 0.20
你可以在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
部分“标准格式说明符”。 如果您想要不同的时间分辨率,请在函数logpid()
更改sleep {this}
。
如果您正好在top
统计数据之后,您可以在批处理模式下运行top
,指定您所追踪的进程的pid。 如果您输入的话,请从此页面( http://www.dedoimedo.com/computers/linux-cool-hacks.html )中获取示例
top -b -d 10 -n 3 >> top-file
您将“以批处理模式(-b)运行顶部。它将按照延迟(-d)标志的指定每10秒刷新一次,总计数为3次迭代(-n)。输出将被发送到文件。“ 包括-p
您可以指定您所在的进程的pid
。 这当然会返回纯粹的cpu和ram,但它将包含thos字段。 在我的例子中,例如,当使用top -b -d 10 -n 3 -p 9189 >> ~/top-file
监视pid 9189时,我会得到以下内容:
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
这个简单的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或进程被终止时程序退出。