2010-06-17 64 views
1

我在裝有16 G RAM和2個四核CPU的機器上使用SUSE 10 Linux。 有8個進程正在做一些工作(CPU密集型/網絡I/O)。其中4個存在內存泄漏(這些是測試條件,所以在這裏沒有泄漏問題)。 所有進程佔用的總空間約爲15.4 G,系統中只有200 MB空閒空間。 事情很好,幾個小時。但在此之後,malloc掛起(對於沒有內存泄漏的進程)。它堅持了4分鐘以上(注意CPU不是100%,但io已經明顯上升)。 現在在掛起的過程中沒有問題(它沒有損壞內存)。 malloc在做什麼? (它試圖整理或建立交換空間)。malloc在Linux中掛起

任何指針?

+0

malloc可能不會做任何事情,它可能很容易被內核嘗試釋放內存給你,所以它可以給你空間(特別是如果你已經關閉在內核overcommit) – Spudd86 2010-06-17 16:22:51

+0

你不能只是將gdb附加到掛起進程並檢查堆棧跟蹤? – Useless 2010-06-17 17:15:46

回答

1

它可能很煩人,但我會建議在阻塞的過程中使用Valgrind。可能有以前未檢測到的錯誤。至少,你可能對發生的事情有一個概念。但是,幾個小時可能會變成幾天:/

+0

已經嘗試過。 VALGRIND使我的流程運行速度至少降低100倍,並且這種模擬將需要數年時間才能完成。 – Rahul 2010-06-17 15:05:20

+0

要使用valgrind並查找分配錯誤,您可以輕鬆地在較小的數據集上運行您的應用程序,或者將它分成單獨測試的較小塊。 – 2010-06-18 08:46:51

4

如果malloc()只需要很長時間,那麼您可能會遍歷零碎的空閒列表,其中許多條目已被換出。這與低CPU,高IO和有限的可用RAM一致。

有關malloc()實現(包括理解零碎空閒列表)的更多信息,維基百科的文章是好的:http://en.wikipedia.org/wiki/Malloc#Implementations

哦,內存泄漏是不能接受的,即使是在測試環境中。正如你所看到的,它們正在干擾那些(據你所知)沒有泄漏並且花費你時間的程序。

1

之前你的機器只是短暫的人生RAM。現在,您的malloc超出了機器的16G限制,並且您的系統開始交換。 但是,檢查您的應用程序,由PierreBdR暗示,當然是一個好主意。