21

私は、Python で書かれたある種のシステム サービス (実際には単なるログ パーサーです) に取り組んでいます。このプログラムは、長期間にわたって継続的に動作するはずです (できれば、数日から数週間、障害や再起動の必要がないことを意味します)。そのため、メモリ消費が気になります。

さまざまなサイトからのプロセス メモリ使用量に関するさまざまな情報を 1 つの単純な関数にまとめました。

#!/usr/bin/env python
from pprint import pprint
from guppy import hpy
from datetime import datetime
import sys
import os
import resource
import re

def debug_memory_leak():
    #Getting virtual memory size 
    pid = os.getpid()
    with open(os.path.join("/proc", str(pid), "status")) as f:
        lines = f.readlines()
    _vmsize = [l for l in lines if l.startswith("VmSize")][0]
    vmsize = int(_vmsize.split()[1])

    #Getting physical memory size  
    pmsize = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss

    #Analyzing the dynamical memory segment - total number of objects in memory and heap size
    h = hpy().heap()
    if __debug__:
        print str(h)
    m = re.match(
        "Partition of a set of ([0-9]+) objects. Total size = ([0-9]+) bytes(.*)", str(h))
    objects = m.group(1)
    heap = int(m.group(2))/1024 #to Kb

    current_time = datetime.now().strftime("%H:%M:%S")
    data = (current_time, objects, heap, pmsize, vmsize)
    print("\t".join([str(d) for d in data]))

この関数は、長時間実行するプロセスのメモリ消費のダイナミクスを研究するために使用されていますが、その動作はまだ説明できません。この 20 分間で、物理メモリと仮想メモリが 11% と 1% 増加しているのに対し、オブジェクトのヒープ サイズと合計量は変化していないことがわかります。

UPD:この時点で、プロセスはほぼ 15 時間機能しています。ヒープは同じですが、物理メモリが 6 倍に増加し、仮想メモリが 50% 増加しました。曲線は、午前 3 時の奇妙な外れ値を除いて、線形のように見えます。

時間 オブジェクト ヒープ PhM VM

19:04:19 31424 3928 5460 143732

19:04:29 30582 3704 10276 158240

19:04:39 30582 3704 10372 157772

19:04:50 30582 3709 10372 157772

19:05:00 30582 3704 10372 157772

(...)

19:25:00 30583 3704 11524 159900

09:53:23 30581 3704 62380 210756

私のプロセスのアドレス空間で何が起こっているのだろうか。ヒープのサイズが一定であることは、すべての動的オブジェクトが正しく割り当て解除されていることを示しています。しかし、メモリ消費量の増加が、長期的にはこの命にかかわるプロセスの持続可能性に影響を与えることに疑いの余地はありません。

ここに画像の説明を入力

誰でもこの問題を明確にしてもらえますか? ありがとうございました。

(RHEL 6.4、カーネル 2.6.32-358、Python 2.6.6 を使用)

4

1 に答える 1

7

プログラムが何をしているのかわからなくても、これは役立つかもしれません。

しばらく前にプロジェクトに取り組んでいたときに、この記事に出くわしました: http : //chase-seibert.github.io/blog/2013/08/03/diagnosing-memory-leaks-python.html実行中に大量のメモリを消費するジョブは、すべてが適切にガベージ コレクションされたとしても、プロセスが実際に終了するまで、そのメモリをオペレーティング システムに返さない可能性があります。」

multiprocessing モジュールを使用して、プロジェクトを別のプロセスに分岐させ、作業が必要なときに戻るようにしましたが、それ以来、メモリの問題に気づいていません。

それか、Python 3.3 http://bugs.python.org/issue11849で試してください

于 2014-05-01T05:52:21.837 に答える