1. 程式人生 > >proc/meminfo 檔案記憶體詳解

proc/meminfo 檔案記憶體詳解

/proc/meminfo 解析:

  • MemTotal:可用的總記憶體--總實體記憶體減去kernel 程式碼/資料段佔用再減去保留的記憶體區,mem_init_print_info裡面有具體計算方式;
  • MemFree:完全未用到的實體記憶體 LowFree+HighFree

   計算公式:MemAvailable:MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2))

   file佔用的記憶體是可以釋放的,但是釋放的過多,會導致swap發生

   減去部分記憶體的目的是避免swap

  • Buffers:block device 檔案讀寫用到的page 
    long nr_blockdev_pages(void)
    {
    struct block_device *bdev;
    long ret = 0;
    spin_lock(&bdev_lock);
    list_for_each_entry(bdev, &all_bdevs, bd_list) {
    ret += bdev->bd_inode->i_mapping->nrpages;
    }
    spin_unlock(&bdev_lock);
    return ret;
    }
    
  • Cached:普通檔案佔用的緩衝

        global_page_state(NR_FILE_PAGES) – total_swapcache_pages – i.bufferram         NR_FILE_PAGES:所有緩衝頁(page cache)的總和,包括:         cached+buffer+swap cache         swap cache中包含的是被確定要swapping換頁、但是尚未寫入物理交換區的匿名記憶體頁(匿名指的是未關聯任何具體檔案)         free 命令所顯示的 “buffers” 表示塊裝置(block device)所佔用的快取頁,包括直接讀寫塊裝置、以及檔案系統元資料                     (metadata)如SuperBlock所使用的快取頁;         而 “cached” 表示普通檔案所佔用的快取頁。  

  • SwapCached:記憶體足夠的情況下,這個值一般為0

那些匿名記憶體頁,比如使用者程序通過malloc()申請的記憶體頁是沒有關聯任何檔案的(有別於backing storage基於磁碟檔案的記憶體頁),如果發生swapping換頁,這類記憶體頁會被寫入交換區。從一個匿名記憶體頁被確定要被換頁開始,它就被計入了swap cache,但是不一定會被立刻寫入物理交換區,因為Linux的原則是除非絕對必要,儘量避免I/O。所以swap cache中包含的是被確定要swapping換頁、但是尚未寫入物理交換區的匿名記憶體頁。 cache屬於os管理,對應用程式是透明的用下面的命令可以釋放Cache Memory:  

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
  • Active:(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE])
  • Inactive:pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]

ACTIVE_ANON和ACTIVE_FILE,分別表示anonymous pages和mapped pages。使用者程序的記憶體頁分為兩種:與檔案關聯的記憶體(比如程式檔案、資料檔案所對應的記憶體頁)和與檔案無關的記憶體(比如程序的堆疊,用malloc申請的記憶體),前者稱為file pages或mapped pages,後者稱為anonymous pages 這部分具體可以參考LRU 記憶體管理演算法 HighMem跟LowMem是32bitX86 上面的一種劃分,860MB以上記憶體成為HighMem, ARM架構上面沒有這樣的劃分方式;swap分割槽引數:Swap分割槽在系統的實體記憶體不夠用的時候,把硬碟空間中的一部分空間釋放出來,以供當前執行的程式使用SwapTotal:可用的swap空間的總的大小SwapFree:剩餘swap空間的大小 kswapd()-->balance_pgdat()-->shrink_zone()-->shrink_inactive_list()-->shrink_page_list()(核心函式)-_swap()-->get_swap_page() 記憶體換出到swap的過程

  • Dirty:需要寫入磁碟的記憶體區大小
  • Writeback:正在被寫回磁碟的大小
  • AnonPages:未對映頁的記憶體大小
  • Mapped: 裝置和檔案等對映的大小。
  • Slab: 核心資料結構slab的大小,可以減少申請和釋放記憶體帶來的消耗。
  • SReclaimable:可收回Slab的大小
  • SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
  • PageTables:管理記憶體分頁頁面的索引表的大小。
  • NFS_Unstable:不穩定頁表的大小
  • VmallocTotal: vmalloc記憶體區大小
  • VmallocUsed: 已用的vmalloc區大小 
  • VmallocChunk: vmalloc區可用的連續最大塊的大小