奇怪的内存泄漏与python + paramiko

时间:2012-11-01 08:34:59

标签: python paramiko

我在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())

如果有人能够对此有所了解,或者我只是愚蠢而有人可以指出为什么我会非常感激。感谢

3 个答案:

答案 0 :(得分:3)

我设法重现。在调查时,我发现很可能是泄漏与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

看起来像libssl或paramiko本身的bug,因为gc.garbage是空的并且len(gc.get_objects())是常量,这意味着没有不可破坏的循环和没有新的python对象(使用你的第一个版本)。 / p>

BTW,你可以每次迭代运行gc.collect()以避免锯齿。

答案 1 :(得分:1)

似乎至少有一位其他用户最近在Paramiko的IRC上遇到过这种情况;我在这里创建了一张跟踪它的票证:https://github.com/paramiko/paramiko/issues/182 - 遗憾的是我没有智慧分享自己,因为这个级别的问题不是我遇到的故障排除方法。

答案 2 :(得分:0)

这些天我遇到了同样的问题。我认为这是lib的错误。 同时您的使用不正确。 关键问题是您没有定义密钥文件。根据AutoAddPolicy源代码:

class DoNothingPolicy ():
    def missing_host_key(self, client, hostname, key):
        pass

您可以将策略处理程序更改为WarningPolicy或自行定义空句柄。 如:

<select name="">
foreach($result as $Sport){
?>
    <option value ="<?php echo $Sport['Sport']; ?>"><?php echo $Sport['Sport']; ?></option>    // The value between <option> value </option> is the value which is to be shown in the dropdown, without this it is showing blank 
<?php
}
</select>