8

Python スクリプトで (明らかな) メモリ リークが発生しましたが、これは説明できません (常駐メモリは増え続けています)。最初は約 6MB 常駐していましたが、一晩実行したままにしておくと、200MB を超えていました (gc による鋸歯状のメモリ使用パターンを除外するためにこれを行いました)。私はそれをこのスクリプトに要約しました:

import sys
import time
import paramiko

def update():
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        ssh.connect(hostname='localhost')
    finally:
        ssh.close()

def main():
    while(True):
        update()
        time.sleep(0.001)

if __name__ == '__main__':
    sys.exit(main())

問題は、新しい SSHClient をインスタンス化し続けていることではないかと考えていましたが、どういうわけかそれらが破棄されていませんでしたが、このバージョンではメモリ リークがさらに速くなりました。

import sys
import time
import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
def update():
    global ssh
    try:
        ssh.connect(hostname='localhost')
    finally:
        ssh.close()

def main():
    while(True):
        update()
        time.sleep(0.001)

if __name__ == '__main__':
    sys.exit(main())

誰かがこれに光を当てることができれば、または私がただ愚かで、誰かが私が最も感謝している理由を指摘できるなら. ありがとう

4

3 に答える 3

4

なんとか再現できました。調査したところ、割り当てが増えているため、おそらくリークはlibsslに接続されていることがわかりました

前:

35aaa53000-35aaa5b000 rw-p 00053000 00:11 3360939                        /usr/lib64/libssl.so.1.0.0j
...
7f4530000000-7f453013b000 rw-p 00000000 00:00 0 
Size:               1260 kB
Rss:                1012 kB
Pss:                1012 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      1012 kB
Referenced:         1012 kB
Anonymous:          1012 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
7f453013b000-7f4534000000 ---p 00000000 00:00 0 
Size:              64276 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB

その後しばらくして:

35aaa53000-35aaa5b000 rw-p 00053000 00:11 3360939                        /usr/lib64/libssl.so.1.0.0j
...
7f4530000000-7f4530250000 rw-p 00000000 00:00 0 
Size:               2368 kB
Rss:                2120 kB
Pss:                2120 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      2120 kB
Referenced:         2120 kB
Anonymous:          2120 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
7f4530250000-7f4534000000 ---p 00000000 00:00 0 
Size:              63168 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB

gc.garbage が空で、len(gc.get_objects()) が定数であるため、libssl または paramiko 自体のバグのようです。つまり、壊れないサイクルがなく、新しい python オブジェクトがありません (最初のバージョンを使用)。

ところで、のこぎり歯を避けるために、反復ごとに gc.collect() を実行できます。

于 2013-01-05T07:57:04.833 に答える