当前位置: 首页 > 面试题库 >

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

梁丘远航
2023-03-14
问题内容

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

    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)


问题答案:

<defunct>表示该子进程是一个僵尸进程(已死,但其父级(p.poll()p.wait())尚未读取其状态)。这似乎都psutilps节目RSS是这样的过程为零。

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

问题是我可以得到任意程序进行评估。语言也不是固定的。没有解决这个问题的优雅方法吗?

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

$ valgrind --tool=massif cmd arg1 arg2

要查看结果,可以使用ms_print

$ ms_print massif.out.* | less

或GUI Massif- Visualizer

@mdadm建议了一个更简单的解决方案time命令:

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)ru_maxrss返回os.wait4的最大值,和返回的值以及通过报告的最大总内存valgrind --tool=massif它们是相似的



 类似资料:
  • 本文向大家介绍python中使用psutil查看内存占用的情况,包括了python中使用psutil查看内存占用的情况的使用技巧和注意事项,需要的朋友参考一下 有的时候需要对python程序内存占用进行监控,这个时候可以用到psutil库,Anaconda中是自带的,如果import出错,可以用pip install psutil(安装在python中)或conda install psutil(

  • 问题内容: 有-Xmx和max-heap-size(jnlp)选项来设置Java应用程序可以使用的最大内存。 如果未指定这些选项,则允许应用程序在系统中仅使用少量的可用物理内存。 这就是人们使用-Xmx允许应用程序使用更多内存的原因。但这对我来说确实是一场噩梦,因为客户端计算机上可能会有不同的内存,甚至应该考虑使用OS。 有什么方法可以让Java应用程序在系统中使用最大可用内存? 谢谢。 问题答案

  • 问题内容: 这是一个很棒的工具,但我似乎无法让表格显示每列的完整宽度。我看不到整个标题,有时可能会很长。 这是我所拥有的: 但是除非我手动调整大小,否则列标题是部分隐藏的。关于如何显示列的整个宽度的任何想法,以便我可以看到整个标题? 问题答案: 设置属性后立即调用。

  • 问题内容: 我在具有16GB Ram和64位OS的Linux机器上运行Python 2.7。我编写的python脚本可能会将过多的数据加载到内存中,这使计算机的运行速度降低到我什至无法杀死进程的地步。 虽然可以通过以下方式限制内存: 在运行脚本之前,请在外壳程序中添加一个限制选项。在我到处看的地方,该模块具有与相同的功能。但是调用: 在我的脚本开始时,绝对没有任何作用。即使将值设置为12000,也

  • 本文向大家介绍Python使用psutil获取进程信息的例子,包括了Python使用psutil获取进程信息的例子的使用技巧和注意事项,需要的朋友参考一下 psutil是什么 psutil是一个能够获取系统信息(包括进程、CPU、内存、磁盘、网络等)的Python模块。主要用来做系统监控,性能分析,进程管理,像glances也是基于psutil写成的。 在不了解这个模块之前,我都是直接用subpr

  • 问题内容: 我想限制JVM使用的最大内存。注意,这不仅是堆,我想限制此过程使用的总内存。 问题答案: 使用参数。在数字后面使用M或G分别表示字节的兆位和千兆位。表示最小值和最大值。