`

AIX内存概述(原创)

    博客分类:
  • AIX
 
阅读更多

VMM概述

虚拟内存管理器 (AIX VMM) 是一种基于分页的虚拟内存管理器。一个分页就是一个固定大小的数据块。分页既可以位于内存中(也就是说,映射到物理内存中的某个位置)、也可以位于磁盘中(也就是说,从物理内存中替换到分页空间或者文件系统)。
AIX VMM 有一个非常独特的方面,即缓存的文件数据的管理。AIX VMM 将缓存的文件数据与对其它类型虚拟内存(例如,进程数据、进程堆栈等等)的管理集成到了一起。它将文件数据缓存为分页,就如同进程的虚拟内存一样。

VMM的管理机制
AIX 根据需要将分页映射到实际内存。如果应用程序引用了某个分页,而该分页并没有映射到实际内存中,那么系统将产生一个缺页。为了解决缺页,AIX 内核会将所引用的分页加载到实际内存中的某个位置。如果所引用的分页是一个新的分页(也就是说,位于先前从未引用过的进程数据堆中的分页),那么“加载”所引用的分页只需要用零来填充一个实际内存位置(也就是说,提供一个填满零的分页)。如果所引用的分页是一个预先存在的分页(也就是说,文件中的某个分页、或者先前换出的某个分页),那么加载所引用的分页需要从磁盘(分页空间或者磁盘文件系统)中将该分页读入到实际内存中的某个位置。
在将分页加载到实际内存中之后,它将被标记为未经修改的。如果某个进程或者内核修改了该分页,那么该分页的状态将更改为已修改的。这允许 AIX 跟踪在将某个分页加载到内存之后是否对其进行过修改。
随着系统将更多的分页添加到实际内存中,实际内存中空闲位置(可以包含分页)的数目将会减少。也可以将空闲位置的数目称为空闲分页框架的数目。当空闲分页框架的数目达到某个较低的值时,AIX 内核就必须清空实际内存中的某些位置,以便重用新的分页。这个过程也称为分页替换。
AIX VMM 提供了一些后台守护进程,专门负责进行分页替换。其中一个分页替换守护进程称为 lrud(显示为 ps -k 的输出中的 lrud)。lrud 守护进程负责在内存分页中进行扫描,并回收某些分页以便为实际内存腾出空间。 当分页替换守护进程确定它希望回收某个特定的分页时,这个分页替换守护进程将执行下面两项操作中的一项:
如果该分页经过了修改,那么分页替换守护进程将该分页写入到辅助存储位置(例如,分页空间或者文件系统磁盘)。将包含该分页的物理内存块标记为空闲,并为其它的分页做好重用的准备。
如果该分页没有经过修改,那么分页替换守护进程可以简单地将物理内存块标记为空闲,这样一来,就可以将该物理内存块重用于另一个分页。在这种情况下,分页替换守护进程不需要将该分页写入到磁盘,因为该分页在内存中的版本并没有经过修改,因此与位于磁盘中(在分页空间中、或者在磁盘文件系统中)的分页副本完全相同。
分页替换守护进程可以根据系统内存的使用情况和可调参数,选择不同类型的分页进行回收。

空闲列表
VMM 维护一个空闲页面帧的逻辑列表,它用于解决缺页故障。在绝大多数环境中,VMM 偶尔必须通过重新指定由运行进程占有的一些页面帧来添加到空闲列表中。需要重新指定页面帧的虚拟内存页由 VMM 的页面替换算法进行选择。VMM 阈值决定了重新指定的帧的数量。
当进程退出时,它的工作存储器立刻释放并且它的关联内存帧也放回到空闲列表中。然而由该进程打开的任何文件可保留在内存中。
分页类型
从本质上看,AIX 中一共有两种分页类型:
    工作段分页(Working storage pages)
    永久段分页(Permanent storage pages)
工作段
工作段分页是一些包含易变数据(换句话说,即重新启动后将不复存在的数据)的分页。在其他的平台中,工作段内存有时也称为匿名内存。下面提供了一些由工作存储分页组成的虚拟内存区域的示例:进程数据,堆栈,共享内存,内核数据。
当需要将经过修改的工作段分页替换出(从内存移动到磁盘)时,它们将被写入到分页空间。不会将工作段分页写入到文件系统。
当进程退出时,系统将释放其所有的私有工作段分页。
因此,当进程退出时,系统将释放进程数据和堆栈的工作段分页。 也就是说, 工作段是暂时的,它们仅在由进程使用时才存在,且没有永久的磁盘存储位置。
永久段
永久段分页是一些包含永久数据(也就是说,重新启动后仍然存在的数据)的分页。这种永久数据就是文件数据。因此,永久段分页就是缓存在内存中的部分文件。
当经过修改的永久段分页需要换出(从内存移动到磁盘)的时候,会将它写入到文件系统中。如前所述,可以直接释放没有经过修改的永久段分页,无需将其写入到文件系统中,因为文件系统包含该数据的原始副本。
例如,如果一个应用程序正在读取某个文件,那么该文件数据将缓存于永久段分页的内存中。这些永久段分页没有经过修改,这意味着并没有在内存中对这些分页进行修改。因此,内存中的永久段分页与磁盘中的文件数据完全相同。当 AIX 需要清空内存的时候,它只需要“释放”这些分页即可,而不将任何内容写入到磁盘。如果应用程序对某个文件进行写操作(而不是读操作),那么永久段分页将是“经过修改的”,并且 AIX 必须在释放这些分页之前将其刷新到磁盘。
永久段分页划分为两种子类型:客户端分页和非客户端分页。
非客户端分页是一些包含缓存的日志文件系统 (JFS) 文件数据的分页。非客户端分页有时也称为持久性分页。客户端分页是一些包含所有其他文件系统(例如,JFS2 和网络文件系统 (NFS))的缓存数据的分页。

下图显示了执行可执行文件时,某些类型的段和它们的页面在磁盘上的位置之间的关系


分页分类
为了帮助分页替换守护进程更好地选择用来进行替换的分页,AIX 将分页分为下面两种类型:计算性分页和非计算性分页
计算性分页是一些用于文本、数据、堆栈和进程的共享内存的分页。非计算性分页是一些包含正在进行读取和写入的文件的文件数据的分页。

分页原理

当空闲列表中可用的实际内存帧数量减少时就会调用一个页面替换器(stealer)。页面替换器在整个页面帧表(PFT)中移动,寻找可替换(steal)的页面。
PFT 中包含一些标志用来表示哪些页已经被引用,哪些页已经被修改。如果页面替换器遇到一个已经引用的页,它不会替换这个页而是为该页重新设置引用标志。在下一次钟针(页面替换器)经过该页且引用位仍未启用时,它便被替换。初次通过时未被引用的页面会立即得到替换。
修改标志表示该页进入内存后上面的数据已经改变。当页面要被替换时,如果设置了修改标志,那么在替换该页之前进行页面调出调用。属于工作段的页面写入调页空间;而持久段中的页面写到磁盘上。

当 CPU 需要另一个页面时,它会到 RAM 中查找。如果无法在 RAM 中找到这个页面,则出现一次缺页,然后向内核发出信号以便从磁盘中加载更多的页面到 RAM。请求分页的一个优点是,分页空间不需要非常大,因为数据总是在分页空间和 RAM 之间不断地交换。在较早的 UNIX® 系统中,将分页预先分配到磁盘,无论使用还是不使用它们。这使得所分配的磁盘空间可能永远不会被使用。从本质上说,请求分页可以避免盲目地分配磁盘空间。应该使得进程的交换最少,因为许多任务可能存储在 RAM 中。的确如此,因为进程(页面)只有一部分存储在 RAM 中。

除了页面替换以外, VMM 维护一个重新调页历史记录缓冲区 来判断缺页故障是新页故障(第一次引用)还是重新调页故障(引用已经调出的页)。 为了分清一个缺页故障是新页故障还是重新调页故障, 历史记录缓冲区 包含 N 个最近缺页故障的页面标识,其中 N 是内存可保留的帧数。例如,512 MB 内存需要一个 128 KB 的重新调页历史记录缓冲区。在页面调进时,如果它的标识可在重新调页历史记录缓冲区中找到,则将它计为一个重新调页。VMM 还可以分别评估计算内存重新调页率和文件内存重新调页率,只需为每种类型的内存维护重新调页故障计数即可。每次页面替换算法运行时都将重新调页率乘以 0.9,这样可比历史重新调页活动更有力地反映最近的重新调页活动。
理想的页面替换策略通过总是替换那些不会再次引用的页面帧而完全减少重新调页故障(假设有足够的实际内存)。因而重新调页故障数是页面替换算法有效性的一个相反评测标准,算法将频繁被重用的页面保存在内存中,从而降低了总体 I/O 需求并潜在地改善了系统性能。

交换概述

尽管分页和交换通常可以互换使用,但它们之间存在细微的区别。如前所述,在进行分页时,进程的部分内容将在磁盘和 RAM 之间来回移动。当发生交换时,会将整个进程来回移动。为了支持这种情况,在将进程移动到分页空间之前,AIX 会挂起整个进程。只有在将进程交换回 RAM 之后,才能够继续执行它。出现这样的情况并不是很好,您应该尽量防止交换的发生,交换可能会导致另一种称为颠簸的情况发生。

VMM 阈值
几个数字阈值定义了 VMM 的目标。当超出这些阈值中的一个时,VMM 会采取适当的操作将内存状态恢复到限定范围内。

minfree
空闲列表中可接受的实际内存页面帧的最小数量。当空闲列表的大小低于这个数时,VMM 开始替换页面。它将一直替换页面直到空闲列表的大小达到 maxfree。
maxfree
通过 VMM 页面替换空闲列表可达到的最大大小。当进程终止并释放它们的工作段页面或删除其页面在内存中的文件时,结果是空闲列表的大小可能会超过这个数。
VMM 试图保持空闲列表的大小大于或等于 minfree。当缺页故障或系统需求导致空闲列表大小低于 minfree 时,页面替换算法就开始运行。由于几个原因,空闲列表的大小必须保持在某个级别之上(缺省值是 minfree)。例如,操作系统的顺序预取算法每次需要几个帧用于每个正在进行顺序读取的进程。而且 VMM 必须避免在操作系统自身内部产生死锁,如果没有足够的空间读取需要释放页面帧的页就可能出现这种情况。

minperm
如果由文件页面占有的实际内存的百分比低于这个级别,则页面替换算法既替换文件页面也替换计算页面,而不管重新调页率。
maxperm

如果由文件页面占有的实际内存的百分比高于这个级别,则页面替换算法仅替换文件页面。在缺省情况下,maxperm 是一个“非严格的”限制,这意味着在某些情况下可以超出这个限制。将 maxperm 设定为非严格的限制,这允许在具有可用空闲内存的时候,可以在内存中缓存更多的非计算性文件。通过将 strict_maxperm 可调参数设置为 1,就可以使 maxperm 限制成为“严格”的限制。当 maxperm 是严格限制的时候,即使有可供使用的空闲内存,内核也不允许非计算性分页的数目超出 maxperm 的限制。因此,将 maxperm 作为严格限制的缺点是,非计算性分页的数目不能超出 maxperm 的限制,并且在系统中具有空闲内存的时候,也不能使用更多的内存。

maxclient
如果由文件页面占有的实际内存的百分比高于这个级别,则页面替换算法仅替换客户机页面。

下图给出了有关这些可调参数在不同的系统条件下的工作概况


当非计算性分页的数目(numperm)在 minperm 和 maxperm 之间的时候,lru_file_repage 可调参数将控制 AIX 分页替换守护进程替换的分页类型,请参见下图。

当 numperm 在 minperm 和 maxperm 之间的时候,如果 lru_file_repage 可调参数设置为 1,那么 AIX 分页替换守护进程将根据其内部重新分页表来确定选择何种类型的分页进行操作。
AIX 内核维护了一个重新分页表,以便确定哪些分页在换出后将很快地换入。当内核将一个分页换出、然后再将其换入的时候,通常表示这个分页经常会被使用,并且该分页应该保留在内存中。内核记录了对计算性分页重新分页的次数,以及对非计算性分页重新分页的次数。然后,AIX 内核可以使用这个信息来确定哪一类分页的重新分页工作更加频繁(因而,表示这一类分页正在频繁地使用)。当 lru_file_repage 可调参数设置为 1 时,AIX 内核使用这个重新分页信息来确定是否仅选择非计算性的分页进行操作、或者选择计算性的和非计算性的分页进行操作。如果计算性分页的重新分页速度比非计算性分页的重新分页速度高,那么 AIX 内核将仅选择非计算性的分页进行操作(因为计算性分页的使用更为频繁)。如果非计算性分页的重新分页速度比计算性分页的重新分页速度高,那么 AIX 内核将选择计算性的分页和非计算性的分页进行操作。
在大多数的客户环境中,最理想的方式是始终让内核只选择非计算性的分页进行操作,因为与对非计算性的分页(即数据文件缓存)进行分页相比,对计算性的分页(例如,进程的堆栈、数据等等)进行分页通常会对进程产生更大的性能开销。因此,可以将 lru_file_repage 可调参数设置为 0。在这种情况下,当 numperm 在 minperm 和 maxperm 之间的时候,AIX 内核始终选择非计算性的分页进行操作。

maxclient

maxclient 可调参数指定应该用于缓存非计算性客户端分页的最大内存量的限制。因为所有非计算性客户端分页是非计算性永久存储分页总数的子集,所以 maxclient 限制必须始终小于或者等于 maxperm 限制。
非计算性客户端分页的数目称为 numclient。vmstat –v 命令可以显示系统的 numclient 值占系统实际内存的百分比。
在缺省情况下,maxclient 限制是严格的限制。这意味着,AIX 内核不允许非计算性的客户端文件缓存超出 maxclient 限制的范围(也就是说,AIX 内核不允许 numclient 超出 maxclient)。当 numclient 达到 maxclient 限制时,AIX 内核将采用特殊的、仅客户端的模式开始分页替换。在这种仅客户端的模式中,AIX 分页替换守护进程将严格地选择客户端分页进行操作。

系统颠簸
进程需要实际内存页面才可以运行。当某进程引用磁盘上的虚拟内存页面时,由于该页要么已经调出要么从未读取过,所以必须调进所引用的页面,而且一般来说,由于必须调出一个或多个页面(如果被替换的页已经做过修改),从而引起 I/O 流量并延迟了进程的进度。
操作系统通过页面替换算法试图从那些最近不可能引用的页面中窃取实际内存。一个成功的页面替换算法允许操作系统在内存中保持足够的进程是活动的,从而保持 CPU 的繁忙。但是在内存竞争的某些级别上,没有较好的候选页面可调出到磁盘上,因为不久之后它们都会由一组活动的进程重用。这种情况取决于下列因素:
系统中的内存总量
处理器数量
每个处理器随时间变化的内存需求
页面替换算法
出现这种情况时,会出现持续的页面调进和调出。这种情况叫系统颠簸。系统颠簸导致对调页的磁盘进行不断的 I/O 操作,从而导致每个进程几乎一被分派就遇到一个缺页故障,结果是没有一个进程有任何重要的进展。
系统颠簸最具破坏力的方面是,虽然可能是工作负荷中一个短暂而随机的高峰(比如某个系统中所有的用户碰巧在同一秒按下 Enter 键)触发了系统颠簸,但系统可能会持续颠簸不知多长时间。

AIX的页空间分配
从 AIX 4.3.2 开始 缺省的空间分配方式为延迟页面空间分配DPSA。它延迟调页空间的分配直到必须调出该页,这样的结果是不会分配无用的调页空间。这种方法能节省大量的调页空间,也意味着磁盘空间的节约。
在一些系统中,即使所有页面的访问都已经发生,但仍有可能不需要调页空间。这种情况在具有超大量 RAM 的系统上很常见。然而,如果访问得较多的是虚拟内存而不是可用的 RAM,这可能导致调页空间的过量使用。
要禁用这个策略,您需要将参数defps设置为 0,启用则设置则将该参数设为1。
通常,DPSA 可以改善系统性能,因为在缺页故障后避免了分配页面空间的开销。如果使用 DPSA,调页空间设备需要的磁盘空间较少

晚分配算法
在具有后分配算法的 AIX 4.3.2 以前的版本中,晚分页空间分配策略会在 RAM 中相应的页面被修改时才分配分页磁盘块。这种方法通常用于那些性能比可靠性更加重要的环境。

许多程序使用后分配的目的是为最大的结构分配虚拟内存地址范围然后仅使用和实际情况所需数量一样多的结构。

早分配算法

如果您希望确保进程不会因为较低的分页情况而终止,通常可以使用这种策略。早页面空间分配策略可以预先分配分页空间。这是与晚分页空间分配策略截然相反的。对于可靠性要求很高的环境,可以使用这种策略。启用这种策略的方法是将 PSALLOC 环境变量设置为 early (PSALLOC=early )。

系统中断

“中断”是一个计算机术语,意思跟我们的请求差不多,鼠标、键盘、板卡或者是一些系统内核组件,要想为你服务,都要向系统提出申请,然后等待操作系统的分 配。如果没有这个过程,你什么也干不了。CPU占用高的原因就是,系统要保持“随时”能为你提供服务,就必须保证它的优先权力。系统中断 一般是硬件中断和软件中断的综合, 中断系统中的中断发生后,系统停止响应,并执行中断响应,这个过程就叫系统中断。

 

参考至:http://marvelyu.blog.51cto.com/471030/538055

 

 

          http://www.ibm.com/developerworks/cn/aix/library/au-aixoptimization-memtun3/index.html

          http://www.ibm.com/developerworks/cn/aix/library/au-aixoptimization-memtun1/index.html

          http://www.ibm.com/developerworks/cn/aix/library/au-vmm/

          http://baike.baidu.com/view/494469.htm

本文原创,转载请注明出处、作者

如有错误,欢迎指正

邮箱:czmcj@163.com

 

4
6
分享到:
评论
1 楼 avalonzst 2016-06-16  
大写的赞..

相关推荐

Global site tag (gtag.js) - Google Analytics