查找Python进程及其所有子进程使用的总内存

时间:2014-06-30 16:11:38

标签: python memory process parallel-processing fork

如何找到Python进程及其所有分叉子所使用的常驻内存总量?

我知道我可以使用psutil来查找当前进程使用的可用物理内存的百分比,如下所示:

import os
import psutil
current_process = psutil.Process(os.getpid())
mem = current_process.memory_percent()

但我正在寻找一个进程及其子进程使用的总内存,如果有的话。

2 个答案:

答案 0 :(得分:10)

您可以使用psutil.Process.children()(或psutil.Process.get_children()用于较旧的psutil版本)的结果来获取所有子进程并迭代它们。
它可能看起来像:

import os
import psutil
current_process = psutil.Process(os.getpid())
mem = current_process.memory_percent()
for child in current_process.children(recursive=True):
    mem += child.memory_percent()

这将总结来自主要过程的孩子(叉子)和孩子的孩子(recursive=True)的记忆百分比。您可以在current psutil docsold docs

中找到此功能

如果您使用的旧版本psutil不是2,则必须使用get_children()代替children()

答案 1 :(得分:1)

一种方法是使用resource库。这是单个进程的内存和其他资源信息:

# https://docs.python.org/2/library/resource.html#resource.getrusage

import resource, time

pagesize = resource.getpagesize()
info = resource.getrusage(resource.RUSAGE_SELF)

print 'EMPTY:', info
print info.ru_maxrss * pagesize, 'bytes'

beer = open('/vmlinuz').read(), 'bytes'

info=resource.getrusage(resource.RUSAGE_SELF)
print
print 'FULL:', info
print info.ru_maxrss * pagesize, 'bytes'

输出

EMPTY: resource.struct_rusage(ru_utime=0.011235, ru_stime=0.0037449999999999996, ru_maxrss=4872, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=1448, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=0, ru_nivcsw=4)
19955712 bytes

FULL: resource.struct_rusage(ru_utime=0.013916, ru_stime=0.004638, ru_maxrss=10380, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=2824, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=0, ru_nivcsw=4)
42516480 bytes

页面中的ru_idrss号码为maximum resident set size。将其乘以页面大小(以字节为单位),以获得父进程使用的最大内存量。

重复上述内容,指定RUSAGE_CHILDREN,将为孩子的内存使用量。

请注意,上述内容非常粗略,但可以了解发生了什么。