如何找到Python进程及其所有分叉子所使用的常驻内存总量?
我知道我可以使用psutil
来查找当前进程使用的可用物理内存的百分比,如下所示:
import os
import psutil
current_process = psutil.Process(os.getpid())
mem = current_process.memory_percent()
但我正在寻找一个进程及其子进程使用的总内存,如果有的话。
答案 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 docs或old 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
,将为孩子的内存使用量。
请注意,上述内容非常粗略,但可以了解发生了什么。