我该如何找到Python进程以及其所有派生子进程所使用的常驻内存总量?
我知道可以使用psutil
来查找当前进程所使用的可用物理内存百分比,例如:
import os
import psutil
current_process = psutil.Process(os.getpid())
mem = current_process.memory_percent()
但我正在寻找一个进程及其子进程使用的总内存。
我该如何找到Python进程以及其所有派生子进程所使用的常驻内存总量?
我知道可以使用psutil
来查找当前进程所使用的可用物理内存百分比,例如:
import os
import psutil
current_process = psutil.Process(os.getpid())
mem = current_process.memory_percent()
但我正在寻找一个进程及其子进程使用的总内存。
您可以使用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()
。一种方法是使用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
,将给出子进程的内存使用情况。
请注意,以上内容相对简略,但可以提供一些正在发生的情况的想法。
psutil.Process()
等同于psutil.Process(os.getpid())
,使用的是psutil==5.6.3
版本。 - Asclepiuspsutil.Process.memory_percent()
可能会引发psutil.NoSuchProcess
异常。 - Lacobus