【发布时间】: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 特有的;你用的是那个工具吗?
标签: python mysql ubuntu mysql-python