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

11 投票
2 回答
7020 浏览
提问于 2025-04-18 11:36

我怎么才能找到一个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()

撰写回答