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區可用的連續最大塊的大小