zoukankan      html  css  js  c++  java
  • 解读vmstat中的ACTIVE/INACTIVE MEMORY

    vmstat 命令能够报告关于内核线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息,那么我们又该如何理解其工作原理呢? vmstat -a 命令能看到active memory inactive memory

    $ 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的数据是在以下内核函数中生成的:

    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
    "
    0096                 "Inactive:       %8lu kB
    "
    0097                 "Active(anon):   %8lu kB
    "
    0098                 "Inactive(anon): %8lu kB
    "
    0099                 "Active(file):   %8lu kB
    "
    0100                 "Inactive(file): %8lu kB
    "
    ...
     
    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 listinactive list, 刚访问过的页面放进active list,长时间未访问过的页面放进inactive list,这样从inactive list回收页面就变得简单了。内核线程kswapd会周期性地把active list中符合条件的页面移到inactive list中,这项转移工作是由refill_inactive_zone()完成的。
    LURlist
    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技术教程书籍,为开源技术爱好者努力做得更多更好:https://www.linuxprobe.com/

  • 相关阅读:
    zjnu1725 COCI (类似二维树状数组模拟)
    zjnu1730 PIRAMIDA(字符串,模拟)
    hdu5365Shortest Path (floyd)
    表达式的转换 (模拟题)
    zjnu1709 UZASTOPNI (bitset,树形dp)
    zjnu1707 TOPOVI (map+模拟)
    zjnu1716 NEKAMELEONI (线段树)
    zjnuSAVEZ (字符串hash)
    codeforces 55D. Beautiful numbers (数位dp)
    TP5将入口文件放在Public中,能得到那些安全保障?
  • 原文地址:https://www.cnblogs.com/linuxprobe/p/5432855.html
Copyright © 2011-2022 走看看