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 神秘的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
自动释放池外的 NSString alloc 会造成神秘的内存泄漏?