我正在運行一個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進程的內存分配增加。
那麼* *頂部-a'顯示內存增加了多少? (電子表格或kdiff3可能對於初始和幾個小時後的兩個頂級輸出是有用的......) – 2013-07-25 13:27:07
磁盤緩存可能是罪魁禍首嗎?試試'$ free -m'並查看:http://www.linuxatemyram.com/。 – 2013-07-25 13:40:54
給我一兩個小時重現,我會在這裏發佈信息。 – Jox