我有一個問題,一直困擾着我上週。Linux堆碎片
在Windows調試存在!heap -s
命令輸出該虛擬存儲器的堆狀態,並使用下列公式計算所述外部碎片:
External fragmentation = 1 - (larget free block/total free size)
是否有在Linux的相似方法,其輸出以計算所需要的那些統計效果如何?
長篇大論現在: 我有一個C應用程序,它使用malloc和free來保持不同大小的空間的分配和釋放,每個分配的壽命不同。 我使用的平臺是Lubuntu,所以ptmalloc2
算法是默認的。
我知道這些分配是在虛擬用戶空間堆(除了那些大於128Kb,分配器使用mmap
),並在實際訪問時映射到物理頁面。 大部分分配的大小爲< 80字節,所以它們來自FastBins。
使用Valgrind
和Massif
我可以得到內部碎片,因爲它報告用於每個分配的額外字節。
但是,我主要關心的是如何弄清楚外部碎片。 我知道/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
的大小。 我如何能夠通過堆「遍歷」並收集這些統計信息?
謝謝大家提前。
我不知道回答你的問題,但如果這是一個問題,也許你可以使用malloc來從系統得到一大塊,併爲你特別的數據更專業的分配器。 – GRAYgoose124