【问题标题】:How much time is the garbage collector using?垃圾收集器使用了多少时间?
【发布时间】:2011-09-01 04:27:24
【问题描述】:

我的 python 程序有一个奇怪的性能行为:它运行的时间越长,它变得越慢。早期,它每分钟生产数十个工作单位。一个小时后,每个工作单元需要几十分钟。我怀疑这是由拥塞的垃圾收集器造成的。

问题是我的脚本内存太大,cProfile 无法在大型运行中运行。 (见:cProfile taking a lot of memory

我们已经编写了自己的性能插件,我们可以观察系统的大部分部分,但似乎没有一个是问题所在。一块尚未翻身的石头是 GC。

是否有其他方法(除了 profile 或 cProfile)来查看 GC 需要多少时间?

【问题讨论】:

    标签: python garbage-collection profile


    【解决方案1】:

    在 Python 中,大多数垃圾都是使用引用计数来收集的。人们会期望这是快速且无痛的,这似乎不太可能是您所追求的。我假设您问的是 gc 模块引用的收集器,它仅用于循环引用。

    有一些东西可能有用:http://docs.python.org/library/gc.html

    虽然似乎没有直接的方法来计时垃圾收集器,但您可以打开和关闭它、启用调试、查看收集计数等。所有这些都可能会有所帮助在你的任务中。

    例如,在我的系统上,gc 会在您打开调试标志时打印出经过的时间:

    In [1]: import gc
    
    In [2]: gc.set_debug(gc.DEBUG_STATS)
    
    In [3]: gc.collect()
    gc: collecting generation 2...
    gc: objects in each generation: 159 2655 7538
    gc: done, 10 unreachable, 0 uncollectable, 0.0020s elapsed.
    

    除了所有这些,我首先要看的是程序运行时内存使用的演变。一种可能性是它只是达到了可用物理 RAM 的限制,并且由于过多的页面错误而变慢,而不是由于与垃圾收集器有关。

    【讨论】:

    • 是的,我知道这一点。这些可以告诉我 GC 正在处理多少东西,但我的直接问题是处理器周期,而不是内存。如果它可以告诉我 GC 使用的 时间 甚至 它运行的频率,那可能会有所帮助。
    • @Matthew:您的进程调用gc.collect() 本身是否有帮助,以及返回需要多长时间?
    • @Thomas K,这将告诉我单个收集需要多长时间,而不是收集器运行的频率。鉴于我拥有的其他数据,我怀疑 GC 在系统运行时运行得越来越频繁(影响越来越小)。
    • @Matthew Scouten:请看我的回答。如果您打开gc.DEBUG_STATS,则每次运行收集器时都会打印一条消息,以及每次调用所用的时间。
    • @Matthew Scouten:或者,关闭它,看看是否有任何变化(同样,正如我的回答所暗示的那样)。
    猜你喜欢
    • 2013-12-03
    • 2012-06-28
    • 1970-01-01
    • 2021-04-30
    • 2021-12-26
    • 2023-03-07
    • 2018-12-30
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多