我在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())
Run Code Online (Sandbox Code Playgroud)
我认为问题可能是我一直在实例化一个新的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())
Run Code Online (Sandbox Code Playgroud)
如果有人能够对此有所了解,或者我只是愚蠢而有人可以指出为什么我会非常感激.谢谢
我成功地重现了。在调查时,我发现泄漏很可能与 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
Run Code Online (Sandbox Code Playgroud)
一段时间后:
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
Run Code Online (Sandbox Code Playgroud)
似乎是 libssl 或 paramiko 本身的错误,因为 gc.garbage 是空的并且 len(gc.get_objects()) 是常量,这意味着没有牢不可破的循环,也没有新的 python 对象(使用您的第一个版本)。
顺便说一句,您可以在每次迭代时运行 gc.collect() 以避免锯齿。