2013-07-25 82 views
1

我正在運行一個python應用程序,它正在查詢(選擇)mysql db,每次讀取〜1k行數據,並對它們進行計算並重複數小時。讀取的表具有〜20m的讀數,並且由MyISAM引擎驅動。 MySQLdb連接器用於從python訪問MySQL。Python和MySQL的神祕內存泄漏

問題在於幾個小時後,所有服務器的內存都被使用,只剩下16mb內存的服務器。

第一個想法是python應用程序中的內存泄漏,但memory_profiler和dozer/dowser都顯示所有變量都已正確釋放。

接下來嘗試捕獲在內存耗盡前後使用進程內存使用快照(ps vax | sort -k8n)的進程。

快照(由MEM排序)當服務器有280MB免費(從頂部的信息):http://pastebin.com/0F3Wht0s 2個小時後... 快照母雞服務器只有18MB免費(從頂部的信息):http://pastebin.com/9MJkLX2g

出乎我的意料是mysqld和statcalculator進程的內存消耗量在整個時間內幾乎相同。

我很明顯缺少一些與linux內存分配相關的東西。 如何查看哪個進程分配了內存?

服務器運行Ubuntu Server 10.04,總共有1GB RAM。 MySQL和MySQLdb是從Ubuntu的回購。如果需要其他信息,我會在這裏添加。

TLDR:Python應用程序不斷地從mysql中讀取select。幾個小時之後,內存全部消失,但是top沒有顯示任何mysqld或python進程的內存分配增加。

+1

那麼* *頂部-a'顯示內存增加了多少? (電子表格或kdiff3可能對於初始和幾個小時後的兩個頂級輸出是有用的......) – 2013-07-25 13:27:07

+1

磁盤緩存可能是罪魁禍首嗎?試試'$ free -m'並查看:http://www.linuxatemyram.com/。 – 2013-07-25 13:40:54

+0

給我一兩個小時重現,我會在這裏發佈信息。 – Jox

回答

0

作爲@ebyrob建議,LinuxAteMyRam(.com)。

由於$ free -m已確認,「缺失」內存已被用於磁盤緩存,並且實際上可用於應用程序。

謝謝,@ebyrob。