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

11

我该如何找到Python进程以及其所有派生子进程所使用的常驻内存总量?

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

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

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

2个回答

21

您可以使用psutil.Process.children()(或旧版本 psutil 的 psutil.Process.get_children())的结果来获取所有子进程并对它们进行迭代。
代码示例:


代码示例:
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()
这将总结主进程、其子进程(forks)以及任何子孙进程(如果您使用recursive=True)所使用的内存百分比。您可以在当前的psutil文档旧文档中找到此功能。 如果您使用的是低于2版本的psutil,则必须使用get_children()而不是children()

在我的情况下,psutil.Process() 等同于 psutil.Process(os.getpid()),使用的是 psutil==5.6.3 版本。 - Asclepius
1
注意!如果子进程已经不存在了,psutil.Process.memory_percent() 可能会引发 psutil.NoSuchProcess 异常。 - Lacobus

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
< p > ru_idrss 数字是以页面为单位的最大常驻集大小。将其乘以字节中的页面大小即可获得父进程使用的最大内存量。

重复上述过程,指定 RUSAGE_CHILDREN,将给出子进程的内存使用情况。

请注意,以上内容相对简略,但可以提供一些正在发生的情况的想法。


1
请注意:您不能依赖于getpagesize(),因为getrusage()返回按1 KiB对齐的数据,而页面通常具有4 KiB的大小。 - oblalex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接