cat /proc/meminfo 各字段詳解

一、cat /proc/meminfo 各字段詳解

/ $ cat /proc/meminfo
MemTotal:         877368 kB  :所有可用RAM大小(即物理內存減去一些預留位和內核的二進制代碼大小)(HighTotal + LowTotal),系統從加電開始到引導完成,BIOS等要保留一些內存,內核要保留一些內存,最後剩下可供系統支配的內存就是MemTotal。這個值在系統運行期間一般是固定不變的。
MemFree:           22516 kB  :LowFree與HighFree的總和,被系統留着未使用的內存,MemFree是說的系統層面
MemAvailable:     470244 kB  :應用程序可用內存數。系統中有些內存雖然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的內存,這部分可回收的內存加上MemFree纔是系統可用的內存,即:MemAvailable≈MemFree+Buffers+Cached,它是內核使用特定的算法計算出來的,是一個估計,MemAvailable是說的應用程序層面
Buffers:            1772 kB  :用來給文件做緩衝大小
Cached:           459224 kB  :被高速緩衝存儲器(cache memory)用的內存的大小(等於 diskcache minus SwapCache )
SwapCached:           16 kB  :被高速緩衝存儲器(cache memory)用的交換空間的大小,已經被交換出來的內存,但仍然被存放在swapfile中。用來在需要的時候很快的被替換而不需要再次打開I/O端口
Active:           333148 kB  :在活躍使用中的緩衝或高速緩衝存儲器頁面文件的大小,除非非常必要否則不會被移作他用. (Active(anon) + Active(file))
Inactive:         330384 kB  :在不經常使用中的緩衝或高速緩衝存儲器頁面文件的大小,可能被用於其他途徑. (Inactive(anon) + Inactive(file))
Active(anon):     104368 kB  :活躍的與文件無關的內存(比如進程的堆棧,用malloc申請的內存)(anonymous pages),anonymous pages在發生換頁時,是對交換區進行讀/寫操作
Inactive(anon):   104508 kB  :非活躍的與文件無關的內存(比如進程的堆棧,用malloc申請的內存)
Active(file):     228780 kB  :活躍的與文件關聯的內存(比如程序文件、數據文件所對應的內存頁)(file-backed pages) File-backed pages在發生換頁(page-in或page-out)時,是從它對應的文件讀入或寫出
Inactive(file):   225876 kB  :非活躍的與文件關聯的內存(比如程序文件、數據文件所對應的內存頁)
Unevictable:        6708 kB  :
Mlocked:            1428 kB  :
HighTotal:        261888 kB  :高位內存總大小(Highmem是指所有內存高於860MB的物理內存,Highmem區域供用戶程序使用,或用於頁面緩存。該區域不是直接映射到內核空間。內核必須使用不同的手法使用該段內存)
HighFree:           5680 kB  :未被使用的高位內存大小
LowTotal:         615480 kB  :低位內存總大小,低位可以達到高位內存一樣的作用,而且它還能夠被內核用來記錄一些自己的數據結構
LowFree:           16836 kB  :未被使用的低位大小
SwapTotal:        614396 kB  :交換空間的總大小
SwapFree:         611044 kB  :未被使用交換空間的大小
Dirty:                40 kB  :等待被寫回到磁盤的內存大小
Writeback:             0 kB  :正在被寫回到磁盤的內存大小
AnonPages:        209224 kB  :未映射頁的內存大小
Mapped:           280668 kB  :設備和文件等映射的大小
Shmem:              1084 kB  :
Slab:              59840 kB  :內核數據結構緩存的大小,可以減少申請和釋放內存帶來的消耗
SReclaimable:      34196 kB  :可收回Slab的大小
SUnreclaim:        25644 kB  :不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
KernelStack:        7504 kB  :常駐內存,每一個用戶線程都會分配一個kernel stack(內核棧)
PageTables:        15508 kB  :管理內存分頁頁面的索引表的大小
NFS_Unstable:          0 kB  :不穩定頁表的大小
Bounce:                0 kB  :
WritebackTmp:          0 kB  :
CommitLimit:     1053080 kB  :根據超額分配比率('vm.overcommit_ratio'),這是當前在系統上分配可用的內存總量,這個限制只是在模式2('vm.overcommit_memory')時啓用。CommitLimit用以下公式計算:CommitLimit =('vm.overcommit_ratio'*物理內存)+交換例如,在具有1G物理RAM和7G swap的系統上,當`vm.overcommit_ratio` = 30時 CommitLimit =7.3G
Committed_AS:   16368536 kB  :目前在系統上分配的內存量。是所有進程申請的內存的總和,即時所有申請的內存沒有被完全使用,例如一個進程申請了1G內存,僅僅使用了300M,但是這1G內存的申請已經被 "committed"給了VM虛擬機,進程可以在任何時間使用。如果限制在模式2('vm.overcommit_memory')時啓用,分配超出CommitLimit內存將不被允許
VmallocTotal:     245760 kB  :可以vmalloc虛擬內存大小
VmallocUsed:           0 kB  :vmalloc已使用的虛擬內存大小
VmallocChunk:          0 kB  :最大的連續未被使用的vmalloc區域

1、Inactive(anon) 和 Inactive(file),分別表示anonymous pages和mapped pages。

用戶進程的內存頁分爲兩種:與文件關聯的內存(比如程序文件、數據文件所對應的內存頁)和與文件無關的內存(比如進程的堆棧,用malloc申請的內存),前者稱爲file pages或mapped pages,後者稱爲anonymous pages;其中LRU lists包括如下幾種,在/proc/meminfo中都有對應的統計值:

  LRU_INACTIVE_ANON  –  對應 Inactive(anon)
  LRU_ACTIVE_ANON  –  對應 Active(anon)
  LRU_INACTIVE_FILE  –  對應 Inactive(file)
  LRU_ACTIVE_FILE  –  對應 Active(file)
  LRU_UNEVICTABLE  –  對應 Unevictable

Inactive list裏的是長時間未被訪問過的內存頁,Active list裏的是最近被訪問過的內存頁,LRU算法利用Inactive list和Active list可以判斷哪些內存頁可以被優先回收。

2、MemAvailable

應用程序可用內存數。系統中有些內存雖然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的內存,這部分可回收的內存加上MemFree纔是系統可用的內存,即:MemAvailable≈MemFree+Buffers+Cached,它是內核使用特定的算法計算出來的,是一個估計值。

3、VmallocUsed

通過vmalloc分配的內存都統計在/proc/meminfo的 VmallocUsed 值中,但是要注意這個值不止包括了分配的物理內存,還統計了VM_IOREMAP、VM_MAP等操作的值,譬如VM_IOREMAP是把IO地址映射到內核空間、並未消耗物理內存,所以我們要把它們排除在外。從物理內存分配的角度,我們只關心VM_ALLOC操作,這可以從/proc/vmallocinfo中的vmalloc記錄看到。

4、KernelStack:

Kernel stack(內核棧)是常駐內存的,既不包括在LRU lists裏,也不包括在進程的RSS/PSS內存裏,所以我們認爲它是kernel消耗的內存。統計值是/proc/meminfo的KernelStack。64bit 系統的 task_struct size 是16KB,  32bit的系統task_struct size爲 8KB,每一個用戶線程都會分配一個kernel stack(內核棧),內核棧雖然屬於線程,但用戶態的代碼不能訪問,只有通過系統調用(syscall)、自陷(trap)或異常(exception)進入內核態的時候纔會用到,也就是說內核棧是給kernel code使用的。
 

內存黑洞:

進程通過將memoryinfo中的內存大小相加起來,發現總是比真實內存小,那是因爲有內存黑洞的存在,我們知道,Kernel的動態內存分配通過以下幾種接口:

alloc_pages/__get_free_page: 以頁爲單位分配

vmalloc: 以字節爲單位分配虛擬地址連續的內存塊

slab allocator

vmalloc和slab分配的內存都會被記錄在meminfo中,但通過alloc_pages/__get_free_page分配的內存,沒有在/proc/meminfo中統計,不知道有多少,就像個黑洞。

參考博客《android cat /proc/meminfo 字段分析》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章