vmstata命令能看到activememory和inactivememory: 但它们的含义在manpage中只给了简单的说明,并未详细解释: inact:theamountofinactivememory。(aoption) active:theamountofactivememory。(aoption) 在此我们试图准确理解它的含义。通过阅读vmstat的源代码(vmstat。c和procsysinfo。c)得知,vmstat命令是直接从procmeminfo中获取的数据: 而procmeminfo的数据是在以下内核函数中生成的: 这段代码的意思是统计所有的LRUlist,其中ActiveMemory等于ACTIVEANON与ACTIVEFILE之和,InactiveMemory等于INACTIVEANON与INACTIVEFILE之和。 LRUlist是Linuxkernel的内存页面回收算法(PageFrameReclaimingAlgorithm)所使用的数据结构,LRU是LeastRecentlyUsed的缩写词。这个算法的核心思想是:回收的页面应该是最近使用得最少的,为了实现这个目标,最理想的情况是每个页面都有一个年龄项,用于记录最近一次访问页面的时间,可惜x86CPU硬件并不支持这个特性,x86CPU只能做到在访问页面时设置一个标志位AccessBit,无法记录时间,所以LinuxKernel使用了一个折衷的方法:它采用了LRUlist列表,把刚访问过的页面放在列首,越接近列尾的就是越长时间未访问过的页面,这样,虽然不能记录访问时间,但利用页面在LRUlist中的相对位置也可以轻松找到年龄最长的页面。Linuxkernel设计了两种LRUlist:activelist和inactivelist,刚访问过的页面放进activelist,长时间未访问过的页面放进inactivelist,这样从inactivelist回收页面就变得简单了。内核线程kswapd会周期性地把activelist中符合条件的页面移到inactivelist中,这项转移工作是由refillinactivezone()完成的。 LRUlist示意图 vmstat看到的activeinactivememory就分别是activelist和inactivelist中的内存大小。如果inactivelist很大,表明在必要时可以回收的页面很多;而如果inactivelist很小,说明可以回收的页面不多。 Activeinactivememory是针对用户进程所占用的内存而言的,内核占用的内存(包括slab)不在其中。 至于在源代码中看到的ACTIVEANON和ACTIVEFILE,分别表示anonymouspages和filebackedpages。用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的内存(比如进程的堆栈,用malloc申请的内存),前者称为filebackedpages,后者称为anonymouspages。Filebackedpages在发生换页(pagein或pageout)时,是从它对应的文件读入或写出;anonymouspages在发生换页时,是对交换区进行读写操作。