【问题标题】:Find total memory used by Python process and all its children查找 Python 进程及其所有子进程使用的总内存
【发布时间】:2014-08-21 01:58:42
【问题描述】:

如何找到 Python 进程及其所有分叉子进程使用的常驻内存总量?

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

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

但我正在寻找一个进程及其子进程使用的总内存(如果有的话)。

【问题讨论】:

    标签: python memory process parallel-processing fork


    【解决方案1】:

    您可以使用来自 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()
    

    这会将来自主进程的内存百分比相加,它是子进程(fork)和子进程的子进程(recursive=True)。您可以在current psutil docsold docs 中找到此功能。

    如果您使用的 psutil 版本低于 2,则必须使用 get_children() 而不是 children()

    【讨论】:

    • 对我来说,psutil.Process()psutil.Process(os.getpid())psutil==5.6.3 是等价的。
    • 小心!如果子进程不再存在,psutil.Process.memory_percent() 可能会引发 psutil.NoSuchProcess 异常。
    【解决方案2】:

    一种方法是使用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,会给孩子的内存使用量。

    请注意,上面的内容非常粗略,但对正在发生的事情有所了解。

    【讨论】:

    • 请注意:您不能依赖 getpagesize(),因为 getrusage() 返回的数据对齐为 1 KiB,而页面通常可以有 4 KiB 的大小
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多