1

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

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

第一个想法是 python 应用程序中的内存泄漏,但 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 进程的内存分配都没有增加。

4

1 回答 1

0

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

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

谢谢,@ebyrob。

于 2013-07-25T15:57:52.667 回答