复杂度3/5
机密度3/5
先总结一下上文。AIX VMM设计了独特的缓存文件数据管理模式,既将缓存的文件数据与对其它类型虚拟内存(例如,进程数据、进程堆栈等等)的管理集成到一起,文件数据缓存也通过页方式管理,如同进程的虚拟内存一样。AIX根据实际访问需要将页映射到物理内存: 如果应用程序访问/引用(reference,read or write)某个页面,而该页面并没有映射到实际内存中(不在PFT),那么系统将产生一个page fault缺页中断。为了解决缺页,AIX 内核会将所引用的页面加载到实际物理内存中的某个位置。如果所引用的页面是一个新的页面,也就是说,位于先前从未引用过的进程数据堆中的页面,那么“加载”所引用的页面过程只需要用零来填充一个实际物理内存位置(也就是说,提供一个填满零的页面)。如果所引用的分页是一个预先存在的页面(也就是说,文件中的某个页面、或者以前交换出paged out的某个页面),那么加载过程要从磁盘(换页空间paging space或者磁盘文件系统)中将该页面读入到实际物理内存中对应的位置。
在将页面加载到物理内存后,它将被标记为未被修改的。如果某个进程或者内核修改了该页面,那么该分页的状态将更改为已修改的。这使得AIX能跟踪页面加载到内存之后是否对其进行过修改,以决定今后换页操作时需要采取的动作:直接放弃或回写。
随着系统将更多的页面添加(分配)到物理内存中,物理内存中空闲页面的数目越来越少。当空闲页面数目达到某个较低的值时,AIX 内核就必须清空一些已被分配的物理内存,以便获得空闲页面供新分配使用。这个过程也称为page swap过程。
AIX VMM运行着一些后台守护进程,专门负责进行页面替换。其中页面替换守护进程称为 lrud(显示为 ps -k 的输出中的 lrud)。lrud 守护进程负责对物理内存页面进行扫描,回收某些页面以便为新物理内存分配腾出空间。lrud通过下面这样一个算法查找可释放的物理内存页:
-
全部物理内存页被分为若干扫描组,lrud按内存组,以并行方式循环扫描同组内物理内存
-
首次扫描时,如果某个页面从未被访问过(reference),则此页面将会被释放,如何释放要看此页面是否被修改过(MOD标记)
-
如果该分页没有经过修改,那么lrud进程可以简单地将物理内存块标记为空闲,这样一来,就可以将该物理内存块重用于另一个分页,该页面在内存中的数据并没被修改过,因此与位于磁盘中的页面副本完全相同
-
如果此页面被修改过,则需要回写,既将页面数据写回对应的磁盘文件或者交换区
-
如果这个页面被访问过,则清除掉reference标记,等待下一次扫描过程
-
在下一次扫描开始之前,如果页面被CPU访问,页面会被设置reference标志
-
下一次扫描时,重复上一次扫描过程,那么在两次扫描时间间隔之内,数据没有被CPU访问过的页面状态会保持在未被访问(reference标志被清0),就会被释放掉,也就实现了所谓得less referenced(最少访问)算法
lrud进程可以根据系统内存的使用情况和vmo参数,控制扫描组大小mempools(其实是控制多少个组,而不是每组大小);何时开始释放内存(minfree);何时停止释放内存(maxfree)
另有一组与新物理内存分配有关的重要参数是minperm, maxperm和maxclient。这几个参数专门用来控制对文件系统进行映射(file cache)的内存的分配和清理策略。如果全部物理内存使用中用于文件映射的内存低于全部物理内存的minperm,那么将不释放文件映射内存;而如果用于文件映射的内存高于maxperm(jfs文件系统)或者maxclient(jfs2,veritas文件系统)时,则优先释放文件系统;当在此二者之间,则不区分内存使用内容,大家平等地依照lru算法进行清理;
与文件的物理内存映射机制有关,AIX系统存在这样一个现象:
当系统操作巨大文件时(例如生成备份文件),如果此文件保存在文件系统中,则会消耗大量的内存(与文件大小相等),直到占据全部可用物理内存(并非全部,具体与minperm,maxperm有关,暂不展开),很可能造成物理内存缺乏,而导致系统出现paging操作。因此,建议备份生成文件不要保存在文件系统上,或者分为多个文件依次操作,因为当aix关闭文件时,当时会将所有该文件映射的物理内存标志为free,也就是一次性释放了这些内存,降低了paging的可能。另一个方案是调整minperm为比较小,maxperm和maxclient为比较大的值。