2013-07-26 54 views
1

我有一個mutlithreaded linux服務器(64位),它應該運行並處理天的請求。但是一段時間以來,我看到了這個過程的內存利用突然跳躍。有時會在一段時間後下降,但有時我的過程在達到閾值限制後崩潰。Linux進程顯示突然的內存跳轉

我用smapsPMAP找出映射,發現堆的大小爲390 MB,而此時的總存儲器利用率爲4.5GB。

我可以看到在pmaps輸出大量的匿名內存段,所以我跑了strace的,發現在memery的時間跳到我的進程調用帶有134MB大小的mmap:

29045 19:52:45 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aabf8000000 
29045 19:53:12 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac00000000 
29045 19:53:21 mmap(0x2aac04000000, 67108864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac04000000 
29045 19:53:28 mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x2aac08000000 

我寫我的包裝爲malloc,發現我的應用程序完成的最大內存分配是一個30MB的分配和一個20MB的跳轉時間分配。這個記憶被釋放了。

我需要知道爲什麼我的過程調用這些大的mmap?

附加信息:

我breaked在MMAP,發現以下BT:

#0 0x00000032af6d0940 in mmap64() from /lib64/libc.so.6 
#1 0x00000032af66f9cf in new_heap() from /lib64/libc.so.6 
#2 0x00000032af673515 in _int_malloc() from /lib64/libc.so.6 
#3 0x00000032af674cde in malloc() from /lib64/libc.so.6 

malloc的調用了5060個字節,但MMAP被稱爲大小爲134217728.爲什麼malloc的呼喚new_heap()?

+0

這可能是malloc()爲「小」分配創建一個新的堆。根據malloc實現,你可能會得到不同分配大小的堆(例如,一個用於4096到8092字節之間的malloc()調用,另一個用於10到20MB之間的分配...)。你可以檢查其他mmap()調用的回溯並檢查它們的分配大小嗎? – oliver

+0

另外,如果你做很多小的分配,也許你的堆越來越分散,導致浪費的內存?你可以檢查你正在做的少量malloc()和free()調用嗎?另請參閱http://stackoverflow.com/questions/3770457/what-is-memory-fragmentation以獲取概述。 – oliver

回答

0

您可以嘗試將GDB附加到進程並在mmap()上設置條件斷點。這會給你一個鉅額撥款的回溯。

+0

好吧我會嘗試這個,但我的代碼不直接調用mmap任何地方。令人驚訝的是,我的堆不是那麼大,malloc沒有被大尺寸調用,所以我的記憶在哪裏? –