当前位置: 首页 > 科技观察

Vmstat命令中的Activememory和inactivememory

时间:2023-03-14 10:32:04 科技观察

vmstat-a命令可以看到activememory和inactivememory:但是在manpage中只是简单解释了它们的含义,没有详细解释:inact:inactive内存的数量。(-a选项)active:活动内存的数量。(-a选项)这里我们尝试准确理解它的含义。通过阅读vmstat的源码(vmstat.c和proc/sysinfo.c),我们知道vmstat命令是直接从/proc/meminfo中获取数据的:而/proc/meminfo的数据是在下面的内核函数中生成的:这段代码的意思是统计所有的LRU列表,其中ActiveMemory等于ACTIVE_ANON和ACTIVE_FILE之和,InactiveMemory等于INACTIVE_ANON和INACTIVE_FILE之和。LRU列表是Linux内核的页框回收算法使用的一种数据结构。LRU是最近最少使用的缩写。这个算法的核心思想是:回收的页面应该是最近最少使用的。为了达到这个目的,理想的情况是每个页面都有一个age项,用来记录上次访问该页面的时间。不幸的是,x86CPU硬件不支持这个特性。x86CPU在访问页面时只能设置一个标志AccessBit,不能记录时间。因此,LinuxKernel采用了一种折衷的方法:它使用LRUlist列表来存放新访问的页面,放在列的头部,越靠近列尾的是未访问过的页面很长时间。这样虽然不能记录访问时间,但是可以很容易的通过页面在LRU链表中的相对位置找到最早的页面。Linux内核设计了两种LRU链表:活跃链表和非活跃链表。刚访问过的页面放入activelist,长时间未访问的页面放入inactivelist,这样从inactivelist中回收页面就变得简单了。内核线程kswapd会周期性地将activelist中符合条件的页面移动到inactivelist中。此传输由refill_inactive_zone()完成。LRU列表示意图vmstat看到的active/inactivememory分别是activelist和inactivelist中的内存大小。如果inactivelist很大,说明有很多页面需要的话可以回收;而如果inactivelist很小,说明可以回收的页面不多。Active/inactive内存是指用户进程占用的内存,不包括内核(包括slab)占用的内存。至于源码中看到的ACTIVE_ANON和ACTIVE_FILE,分别代表匿名页面和文件后台页面。用户进程的内存页分为两种:与文件相关的内存(如程序文件和数据文件对应的内存页)和与文件无关的内存(如程序的栈)process,malloc申请的内存),前者称为file-backedpages,后者称为anonymouspages。当发生页面更改(页入或页出)时,文件支持的页面从其对应的文件中读入或写出;当发生页面更改时,匿名页面在交换区执行读/写操作。