Python 和 MySQL 神秘的内存泄漏

Posted

技术标签:

【中文标题】Python 和 MySQL 神秘的内存泄漏【英文标题】:Python and MySQL mysterious memory leak 【发布时间】:2013-07-25 10:01:00 【问题描述】:

我正在运行一个 python 应用程序,它正在查询(选择)mysql db,一次读取约 1k 行,用它们执行计算并重复数小时。读取的表有大约 20m 的读数,它由 MyISAM 引擎提供支持。 MySQLdb连接器用于从python访问MySQL。

问题是几个小时后所有服务器的内存都用完了,服务器只剩下 16mb 可用内存。

第一个想法是python app中的内存泄漏,但是memory_profiler和dozer/dowser都显示所有变量都被正确释放了。

接下来尝试捕捉泄漏者在内存耗尽前后拍摄进程内存使用情况快照 (ps vax | sort -k8n)。

服务器有 280mb 可用空间时的快照(按内存排序):http://pastebin.com/0F3Wht0s 2小时后... 快照母鸡服务器只有 18mb 可用空间(来自顶部的信息):http://pastebin.com/9MJkLX2g

令我惊讶的是,mysqld 和 statcalculator 进程的内存消耗随着时间的推移几乎相同。

我显然遗漏了一些与 linux 中的内存分配相关的内容。 如何查看哪个进程分配了该内存?

服务器运行 Ubuntu Server 10.04,总共有 1gb 内存。 MySQL 和 MySQLdb 来自 ubuntu repo。如果需要任何其他信息,我会在此处添加。

TLDR:Python 应用程序不断地通过选择从 mysql 中读取数据。几个小时后,内存全部消失,但 top 显示 mysqld 或 python 进程的内存分配都没有增加。

【问题讨论】:

那么 top -a 显示内存增加了什么? (电子表格或 kdiff3 可能对最初和几个小时后的两个***输出有用......) 磁盘缓存是罪魁祸首吗?试试$ free -m 看看:linuxatemyram.com。 给我一两个小时来重现,我会在这里发布信息。 @ebyrob,是的,就是这样。 问题说您使用的是“MySQLdb 连接器”,但 MySQL Connector/Python 和 MySQLdb 是两个不同的工具。 mysql-python 标签是 MySQLdb 特有的;你用的是那个工具吗? 【参考方案1】:

正如@ebyrob 建议的那样,LinuxAteMyRam(.com)。

正如$ free -m 所确认的,“缺失”内存已用于磁盘缓存,并且实际上可用于应用程序。

谢谢,@ebyrob。

【讨论】:

以上是关于Python 和 MySQL 神秘的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的关闭和回调内存泄漏

自动释放池外的 NSString alloc 会造成神秘的内存泄漏?

内存泄漏与垃圾回收机制

分析 ThreadLocal 内存泄漏问题

Android开发常见的Activity中内存泄漏及解决办法

OpenGL VBO 会泄漏内存吗?