2

我有一個問題,一直困擾着我上週。Linux堆碎片

在Windows調試存在!heap -s命令輸出該虛擬存儲器的堆狀態,並使用下列公式計算所述外部碎片:

External fragmentation = 1 - (larget free block/total free size) 

是否有在Linux的相似方法,其輸出以計算所需要的那些統計效果如何?

長篇大論現在: 我有一個C應用程序,它使用malloc和free來保持不同大小的空間的分配和釋放,每個分配的壽命不同。 我使用的平臺是Lubuntu,所以ptmalloc2算法是默認的。

我知道這些分配是在虛擬用戶空間堆(除了那些大於128Kb,分配器使用mmap),並在實際訪問時映射到物理頁面。 大部分分配的大小爲< 80字節,所以它們來自FastBins。

使用ValgrindMassif我可以得到內部碎片,因爲它報告用於每個分配的額外字節。

但是,我主要關心的是如何弄清楚外部碎片。 我知道/proc/[pid]/smaps堆大小和pmap-d[pid] anon統計信息,但我發現很難從外部碎片解釋它們。

我也知道LD_PRELOAD,我可以動態連接/lib/i386-linux-gnu/libmemusage.so。該庫輸出堆總數,峯值和所請求分配大小的分佈。

我知道__malloc__hook現在已經被棄用了,我並不想依靠特定的實施統計,如malloc_stats()mallinfo()。但是,如果您有任何建議使用這兩個請讓我知道。

我可以告訴外部碎片問題,當請求不能滿足時,因爲堆中沒有連續的空間,但所請求的總大小分散在該區域周圍。

我還沒有想出,如何獲得所需的統計數據,以便我可以計算出這種影響。例如不同的公式,說明我必須捕獲live_memory或獲得total_free_pages,或獲得largest_free_block的大小。 我如何能夠通過堆「遍歷」並收集這些統計信息?

謝謝大家提前。

+0

我不知道回答你的問題,但如果這是一個問題,也許你可以使用malloc來從系統得到一大塊,併爲你特別的數據更專業的分配器。 – GRAYgoose124

回答

0

我相信這將取決於您正在使用的分配器。也就是說,您可能需要採用與您正在使用的實施方案不同的策略,其中包括您所使用的任何實施方案的malloc(等)和免費。如果實現不提供您尋求擴展的信息,您可能需要閱讀它的源代碼並輸入自己的邏輯來檢查分配狀態。

相信的頁面映射到交換空間和物理內存是在一個較低的水平,因此不會特別幫助你在你的目標。實施可能會或可能不會關心這些較低級別的細節。

如果您確定您正在使用ptmalloc2,您能找到它的源代碼嗎?