2011-07-12 126 views
1

我需要在linux進程中有可靠的分配內存測量。我一直在尋找mallinfo,但我讀過it is deprecated。這種統計數據的最新狀態是什麼?進程從內核分配內存塊

基本上我很感興趣,至少有兩個數字:任何malloc

  • 號(和大小)從內核分配的內存塊/頁或任何實現使用選擇

  • 的C庫
  • (可選的,但仍然是重要的)數量的所分配的存儲器的由用戶空間代碼(通過mallocnew等)減去由它的解除分配的存儲器(經由freedelete等)

我有一種可能性是override malloc calls with LD_PRELOAD,但它可能會在運行時引入不必要的開銷,也可能與我使用的其他庫無法正常交互,這也依賴於LD_PRELOAD aop-ness。

我讀過的另一種可能性是rusage

需要明確的是,這是NOT用於調試目的,存儲器使用率(即在塊級顯示的存儲器使用量,只有更精確類似於數學或Matlab)的應用程序的固有特徵

回答

3

/proc/PID/status包含的信息的一些有用件(嘗試運行cat /proc/$$/status爲例)。

VmPeak是進程的虛擬內存空間在執行過程中變得最大。這包括映射到流程中的所有頁面,包括可執行頁面,mmap文件,堆棧和堆。

VmSize是進程的虛擬內存空間的當前大小。

是您的流程的駐留集大小;即它現在佔用了多少物理RAM。 (一個典型的過程會有大量映射它從未使用過的東西,就像大多數C庫一樣,如果沒有進程需要頁面,最終它將被驅逐併成爲非常駐的RSS。RSS測量仍然駐留並映射的頁面進入你的過程。)

VmHWM是的高水位標記;即在該過程的整個生命週期中該數字的最高值。

VmData是進程「數據」段的大小;即,大概是它的堆使用率。請注意,從內核的角度來看,您已完成malloc,然後free的小塊仍將被使用;釋放大塊實際上會返回到內核。 (如果內存有效,「大」意味着當前glibc的大於128k)。這可能與您正在查找的內容最接近。

這些測量結果可能比試圖跟蹤malloc和free更好,因爲它們表明從系統範圍的角度來看,「真正發生了什麼」。僅僅因爲你在某些內存上調用了free(),這並不意味着它已被返回到系統供其他進程使用。

+0

+1:很好的答案,很好的解釋個人價值! –

4

爲此目的 - 應用程序中的「內存使用」內省功能 - 最合適的接口是malloc_hook(3)。這些是GNU擴展,它允許您連接每個malloc()realloc()free()調用,以維護您的統計信息。

要從內核的角度來看應用程序映射了多少內存,您可以閱讀並整理/proc/self/smaps僞文件中的信息。這也可以讓你瞭解每個分配的多少是居民,交換,共享/私營,清潔/骯髒等