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


16

类似于问题如何记录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

可惜我还不能在这里发表评论,但你会发现这个职位感兴趣expalining为什么ps可能不同于topstackoverflow.com/questions/131303/...
下午

Answers:


16

您可以在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()


简单而有效!
rafaelbattesti

3

如果您恰好在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字段。以我为例,使用监视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

该页面虽然不重定向到文件,但确实进行了一些更复杂的修改,使您仅能获得打印出的CPU。如果您知道将输出重定向到文件并定期更新的一种好方法,我很想知道。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)

您首先需要找出要监视的程序的进程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或进程被杀死时,程序将退出。


亲爱的Stefano,非常感谢您的脚本。不幸的是,它似乎输出了错误的结果。你知道为什么吗?请查看我更新的问题。
Framester 2011年

从ps手册页man7.org/linux/man-pages/man1/ps.1.html,ps输出“使用的CPU时间除以进程已运行的时间(cputime /实时比率),以百分比表示“-因此,您可以获取自启动以来的平均CPU使用量
Nicolas Charles
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.