解讀vmstat中的ACTIVE/INACTIVE MEMORY

vmstat 命令可以報告關於內核線程、虛擬內存、磁盤、陷阱和 CPU 活動的統計信息,那麼咱們又該如何理解其工做原理呢?
vmstat -a 命令能看到active memory 和 inactive memorylinux

$ vmstat -a 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  0 138096 319560 1372408 1757848    0    0     2     3    2    3  1  0 99  0  0

但它們的含義在manpage中只給了簡單的說明,並未詳細解釋:算法

inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)

在此咱們試圖準確理解它的含義。經過閱讀vmstat的源代碼(vmstat.c和proc/sysinfo.c)得知,vmstat命令是直接從/proc/meminfo中獲取的數據:數據結構

$ grep -i act /proc/meminfo
Active:          1767928 kB
Inactive:        1373760 kB

/proc/meminfo的數據是在如下內核函數中生成的:app

fs/proc/meminfo.c:
==================
0023 static int meminfo_proc_show(struct seq_file *m, void *v)
0024 {
...
 
0032         unsigned long pages[NR_LRU_LISTS];
...
 
0051         for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
0052                 pages[lru] = global_page_state(NR_LRU_BASE + lru);
...
 
0095                 "Active:         %8lu kB\n"
0096                 "Inactive:       %8lu kB\n"
0097                 "Active(anon):   %8lu kB\n"
0098                 "Inactive(anon): %8lu kB\n"
0099                 "Active(file):   %8lu kB\n"
0100                 "Inactive(file): %8lu kB\n"
...
 
0148                 K(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE]),
0149                 K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
0150                 K(pages[LRU_ACTIVE_ANON]),
0151                 K(pages[LRU_INACTIVE_ANON]),
0152                 K(pages[LRU_ACTIVE_FILE]),
0153                 K(pages[LRU_INACTIVE_FILE]),
...

這段代碼的意思是統計全部的LRU list,其中Active Memory等於ACTIVE_ANON與ACTIVE_FILE之和,Inactive Memory等於INACTIVE_ANON與INACTIVE_FILE之和。函數

LRU list是Linux kernel的內存頁面回收算法(Page Frame Reclaiming Algorithm)所使用的數據結構,LRU是Least Recently Used的縮寫詞,這個算法的核心思想是:回收的頁面應該是最近使用得最少的,爲了實現這個目標,最理想的狀況是每一個頁面都有一個年齡項,用於記錄最近一次訪問頁面的時間,惋惜x86 CPU硬件並不支持這個特性,x86 CPU只能作到在訪問頁面時設置一個標誌位Access Bit,沒法記錄時間,因此Linux Kernel使用了一個折衷的方法——它採用了LRU list列表,把剛訪問過的頁面放在列首,越接近列尾的就是越長時間未訪問過的頁面,這樣,雖然不能記錄訪問時間,但利用頁面在LRU list中的相對位置也能夠輕鬆找到年齡最長的頁面。Linux kernel設計了兩種LRU list: active list 和 inactive list, 剛訪問過的頁面放進active list,長時間未訪問過的頁面放進inactive list,這樣從inactive list回收頁面就變得簡單了。內核線程kswapd會週期性地把active list中符合條件的頁面移到inactive list中,這項轉移工做是由refill_inactive_zone()完成的。
解讀vmstat中的ACTIVE/INACTIVE MEMORY解讀vmstat中的ACTIVE/INACTIVE MEMORY
vmstat看到的active/inactive memory就分別是active list和inactive list中的內存大小,若是inactive list很大,代表在必要時能夠回收的頁面不少;而若是inactive list很小,說明能夠回收的頁面很少,Active/inactive memory是針對用戶進程所佔用的內存而言的,內核佔用的內存(包括slab)不在其中。
至於在源代碼中看到的ACTIVE_ANONACTIVE_FILE,分別表示anonymous pagesmapped pages。用戶進程的內存頁分爲兩種:與文件關聯的內存(好比程序文件、數據文件所對應的內存頁)和與文件無關的內存(好比進程的堆棧,用malloc申請的內存),前者稱爲file pages或mapped pages,後者稱爲anonymous pages,File pages在發生換頁(page-in或page-out)時,是從它對應的文件讀入或寫出;anonymous pages在發生換頁時,是對交換區進行讀/寫操做。線程

免費提供最新Linux技術教程書籍,爲開源技術愛好者努力作得更多更好:http://www.linuxprobe.com/設計

相關文章
相關標籤/搜索