如何在Python中使用psutil获得程序的最大内存使用率

我正在使用以下代码来获取程序的最大内存使用率.import os, subprocess , psutildef mem(cmd):try:with open(in.txt,r) as infile, open(out.txt, w) as outfile:p=psutil.Popen(./+cmd,shell=False,stdin...

我正在使用以下代码来获取程序的最大内存使用率.

    import os, subprocess , psutil
    def mem(cmd):
        try:
            with open('in.txt','r') as infile, open('out.txt', 'w') as outfile:
                p=psutil.Popen("./"+cmd,shell=False,stdin=infile,stdout = outfile)
            print p.memory_info()
        except Exception:
             print "Error"
    cmd=raw_input()
    mem(cmd)

问题有时是在程序的初始运行中,内存使用量输出为(0,0),但随后它显示正确的输出.我不知道为什么会这样.对于某些程序,例如c中的hello world程序,输出为pmem(rss = 4096,vms = 315392),大约为0.3M(我认为输出以字节为单位),但是在ideone.com上运行hello world程序可以得到输出为?3M.为什么会有这种分散?

cmd是可执行文件的名称.

命令print subprocess.check_output([‘ps’,’v’,’-p’,str(p.pid)])的输出

PID TTY STAT TIME MAJFL TRS DRS RSS%MEM COMMAND
16150 pts / 16 Z 0:00 0 0 0 0 0.0 [a.out]< defunct>

我的示例C程序之一:

`int a[1000000];
int main()
{
    return 0;
}`

有时返回pmem(rss = 4096,vms = 4313088)有时返回pmem(rss = 0,vms = 0)

解决方法:

<已终止>表示子进程是一个zombie process(它已经死了,但是父进程尚未读取其状态(p.poll()或p.wait())).看来psutil和ps都表明RSS对于这些进程为零.

结果取决于子进程是否在调用p.memory_info()之前退出.这是一场比赛.如果在C程序的出口处添加延迟,则可能在子进程退出之前调用p.memory_info(),并且您应该获得非零的结果.

The problem is that I can get arbitrary programs to evaluate . The language is also not fixed. Isn’t there an elegant solution to this problem?

您可能需要操作系统支持才能保存有关子进程内存使用情况的信息,即使该进程退出后也是如此.或者,您可以使用内存分析器(例如valgrind)运行该程序并读取其结果.收集结果:

$valgrind --tool=massif cmd arg1 arg2 

要查看结果,可以使用ms_print:

$ms_print massif.out.* | less

或GUI Massif-Visualizer

@mdadm suggested一个更简单的解决方案:time command:

from subprocess import Popen, PIPE

p = Popen(['time', '-f', '%M'] + args, stderr=PIPE)
ru_maxrss = int(p.communicate()[1])
print("Maximum rss %d KB" % ru_maxrss)

GNU时间使用wait3()填充资源使用情况信息(如果可用).可以在Python中调用:

import os
from subprocess import Popen

p = Popen(args)
ru = os.wait4(p.pid, 0)[2]
print("Maximum rss %d KB" % ru.ru_maxrss)

我将psutil.Process.memory_info(rss)返回的最大值与os.wait4返回的ru_maxrss值以及valgrind –tool = massif报告的最大总内存进行了比较:它们是相似的.

也可以看看:

> A way to determine a process’s “real” memory usage, i.e. private dirty RSS?
> How is memory usage reported in Linux?
> Find maximum memory consumed by a process specified at the command-line.

本文标题为:如何在Python中使用psutil获得程序的最大内存使用率

基础教程推荐