查找Python进程及其子进程使用的总内存
我怎么才能找到一个Python程序及其所有派生子进程使用的总内存量呢?
我知道可以使用psutil
这个工具,比如说,可以这样查看当前程序使用的可用物理内存的百分比:
import os
import psutil
current_process = psutil.Process(os.getpid())
mem = current_process.memory_percent()
但是我想要的是一个程序及其子进程(如果有的话)使用的总内存。
2 个回答
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
这个数字代表的是 最大常驻集大小
,单位是页。你可以把这个数字乘以每页的字节数,就能得到父进程使用的最大内存量。
如果你重复上面的操作,并指定 RUSAGE_CHILDREN
,就可以得到子进程的内存使用情况。
需要注意的是,上面的内容比较粗略,但可以大致了解发生了什么。
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()
这个方法会计算主进程、它的子进程(也就是分叉出来的进程)以及任何子进程的子进程所使用的内存百分比(如果你设置了 recursive=True
)。你可以在 当前的psutil文档 或者 旧文档 中找到这个函数。
如果你使用的psutil版本低于2.0,那么你需要用 get_children()
代替 children()
。