了解有关 AIX® 虚拟内存管理器 (AIX VMM) 如何工作,以及如何利用可调参数来调整 AIX VMM 操作的详细信息。AIX VMM 负责管理系统中所有的内存。AIX VMM 的操作对于系统性能来说是至关重要的,并且它还提供了几个可调参数,对于不同的工作负载,您可以使用这些参数对其操作进行优化。

David Hepkin (dhepkin@us.ibm.com), AIX 内核架构师, IBM

David 是一位 AIX 内核架构师。他的职责包括设计和开发用于 AIX 操作系统的新技术。他具有内核开发方面的背景。您可以通过 dhepkin@us.ibm.com 与他联系。



2008 年 3 月 03 日

引言

AIX® 虚拟内存管理器 (AIX VMM) 是一种基于分页的虚拟内存管理器。一个分页就是一个固定大小的数据块。分页既可以位于内存中(也就是说,映射到物理内存中的某个位置)、也可以位于磁盘中(也就是说,从物理内存中替换到分页空间或者文件系统)。

AIX VMM 有一个非常独特的方面,即缓存的文件数据的管理。AIX VMM 将缓存的文件数据与对其它类型虚拟内存(例如,进程数据、进程堆栈等等)的管理集成到了一起。它将文件数据缓存为分页,就如同进程的虚拟内存一样。

AIX 根据需要将分页映射到实际内存。如果应用程序引用了某个分页,而该分页并没有映射到实际内存中,那么系统将产生一个缺页。为了解决缺页,AIX 内核会将所引用的分页加载到实际内存中的某个位置。如果所引用的分页是一个新的分页(也就是说,位于先前从未引用过的进程数据堆中的分页),那么“加载”所引用的分页只需要用零来填充一个实际内存位置(也就是说,提供一个填满零的分页)。如果所引用的分页是一个预先存在的分页(也就是说,文件中的某个分页、或者先前换出的某个分页),那么加载所引用的分页需要从磁盘(分页空间或者磁盘文件系统)中将该分页读入到实际内存中的某个位置。

在将分页加载到实际内存中之后,它将被标记为未经修改的。如果某个进程或者内核修改了该分页,那么该分页的状态将更改为已修改的。这允许 AIX 跟踪在将某个分页加载到内存之后是否对其进行过修改。

随着系统将更多的分页添加到实际内存中,实际内存中空闲位置(可以包含分页)的数目将会减少。也可以将空闲位置的数目称为空闲分页框架的数目。当空闲分页框架的数目达到某个较低的值时,AIX 内核就必须清空实际内存中的某些位置,以便重用新的分页。这个过程也称为分页替换。

AIX VMM 提供了一些后台守护进程,专门负责进行分页替换。其中一个分页替换守护进程称为 lrud(显示为 ps -k 的输出中的 lrud)。lrud 守护进程负责在内存分页中进行扫描,并回收某些分页以便为实际内存腾出空间。当分页替换守护进程确定它希望回收某个特定的分页时,这个分页替换守护进程将执行下面两项操作中的一项:

  • 如果该分页经过了修改,那么分页替换守护进程将该分页写入到辅助存储位置(例如,分页空间或者文件系统磁盘)。将包含该分页的物理内存块标记为空闲,并为其它的分页做好重用的准备。
  • 如果该分页没有经过修改,那么分页替换守护进程可以简单地将物理内存块标记为空闲,这样一来,就可以将该物理内存块重用于另一个分页。在这种情况下,分页替换守护进程不需要将该分页写入到磁盘,因为该分页在内存中的版本并没有经过修改,因此与位于磁盘中(在分页空间中、或者在磁盘文件系统中)的分页副本完全相同。

分页替换守护进程可以根据系统内存的使用情况和可调参数,选择不同类型的分页进行回收。本文剩下的部分将详细地介绍分页替换守护进程如何选择要进行回收的分页。

分页类型

从本质上看,AIX 中一共有两种分页类型:

  • 工作存储分页(Working storage pages)
  • 永久存储分页(Permanent storage pages)

工作存储

工作存储分页是一些包含易变 数据(换句话说,即重新启动后将不复存在的数据)的分页。在其他的平台中,工作存储内存有时也称为匿名 内存。下面提供了一些由工作存储分页组成的虚拟内存区域的示例:

  • 进程数据
  • 堆栈
  • 共享内存
  • 内核数据

当需要将经过修改的工作存储分页替换出(从内存移动到磁盘)时,它们将被写入到分页空间。不会将工作存储分页写入到文件系统。

当进程退出时,系统将释放其所有的私有工作存储分页。因此,当进程退出时,系统将释放进程数据和堆栈的工作存储分页。对于共享内存区域,直到删除共享内存区域之后,才会释放其工作存储分页。

永久存储

永久存储分页是一些包含永久数据(也就是说,重新启动后仍然存在的数据)的分页。这种永久数据就是文件数据。因此,永久存储分页就是缓存在内存中的部分文件。

当经过修改的永久存储分页需要换出(从内存移动到磁盘)的时候,会将它写入到文件系统中。如前所述,可以直接释放没有经过修改的永久存储分页,无需将其写入到文件系统中,因为文件系统包含该数据的原始副本。

例如,如果一个应用程序正在读取某个文件,那么该文件数据将缓存于永久存储分页的内存中。这些永久存储分页没有经过修改,这意味着并没有在内存中对这些分页进行修改。因此,内存中的永久存储分页与磁盘中的文件数据完全相同。当 AIX 需要清空内存的时候,它只需要“释放”这些分页即可,而不将任何内容写入到磁盘。如果应用程序对某个文件进行写操作(而不是读操作),那么永久存储分页将是“经过修改的”,并且 AIX 必须在释放这些分页之前将其刷新到磁盘。

您可以将永久存储分页划分为两种子类型:

  • 客户端分页
  • 非客户端分页

非客户端分页是一些包含缓存的日志文件系统 (JFS) 文件数据的分页。非客户端分页有时也称为持久性分页。客户端分页是一些包含所有其他文件系统(例如,JFS2 和网络文件系统 (NFS))的缓存数据的分页。

分页分类

为了帮助分页替换守护进程更好地选择用来进行替换的分页,AIX 将分页分为下面两种类型:

  • 计算性分页
  • 非计算性分页

计算性分页是一些用于文本、数据、堆栈和进程的共享内存的分页。非计算性分页是一些包含正在进行读取和写入的文件的文件数据的分页。

如何对分页进行分类

所有的工作存储分页都是计算性的。不会将工作存储分页标记为非计算性的。

永久存储分页既可以是计算性的、也可以是非计算性的,这取决于您使用这些分页的方式。如果一个文件包含某个进程的可执行文本,那么系统会将该文件视为计算性的,并且将该文件中的所有永久存储分页都标记为计算性的。如果该文件不包含可执行文本,那么系统会将该文件视为非计算性的,并且将该文件中的所有永久存储分页都标记为非计算性的。

当您第一次打开一个文件的时候,AIX 内核将创建一个内部 VMM 对象以代表该文件。并且将其标记为非计算性的,这意味着所有的文件在一开始都是非计算性的。

随着程序对该文件进行读写操作,AIX 内核将该文件的数据作为非计算性的永久存储分页在内存中进行缓存。

如果关闭该文件,那么 AIX 内核将继续在内存中(在永久存储分页中)缓存该文件的数据。内核继续缓存该文件是为了提高性能;例如,如果稍后出现了另一个进程,并且它也使用了相同的文件,那么该文件数据仍然位于内存中,并且 AIX 内核不需要从磁盘读入该文件的数据。

如果某个文件因为指令取出发生了缺页,那么会将非计算性文件转换为计算性状态。当对某个文件出现进程缺页(意味着该进程引用了文件的部分内容,而这部分内容当前没有缓存在永久存储分页的内存中)的时候,该进程将产生一个缺页。如果是由于指令取出而导致的缺页(意味着该进程正在尝试加载来自该分页的指令,以便进行相关操作),那么内核会将该文件标记为计算性的。这涉及到将该文件中的所有分页都标记为计算性的。一个文件要么完全是计算性的,要么完全是非计算性的。

在将文件标记为计算性文件之后,它将一直保持为计算性文件,直到删除该文件(或者重新启动系统)。因此,即使移动了该文件、或者对它进行了重命名,该文件仍然标记为计算性的文件。

分页替换

AIX 分页替换守护进程一次扫描内存的一个分页,找出要回收的分页以释放内存。分页替换守护进程必须仔细地选择分页,以便将分页对系统的性能影响降到最低,并且分页替换守护进程将根据可调参数设置和系统情况来选择不同类型的分页。

您可以使用大量的可调参数来控制 AIX 选择分页进行替换的方式。

minpermmaxperm

minpermmaxperm 是两个最基本的分页替换可调参数。这两个可调参数用于指出 AIX 内核应该使用多少内存来缓存非计算性的分页。maxperm 可调参数指出应该用于缓存非计算性分页的最大内存量。

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

minperm 限制指出应该用于非计算性分页的最低内存量。

非计算性分页的数目称为 numpermvmstat –v 命令可以显示系统的 numperm 值所占系统实际内存的百分比。

下面的图 1 给出了有关这些可调参数在不同的系统条件下如何进行工作的概况:

图 1. minpermmaxperm 限制
minperm 和 maxperm 限制

当非计算性分页的数目(numperm)大于或者等于 maxperm 的时候,AIX 分页替换守护进程严格地选择非计算性分页(例如,缓存的非可执行文件)进行操作。

当非计算性分页的数目(numperm)小于或者等于 minperm 的时候,AIX 分页替换守护进程将选择计算性分页和非计算性分页进行操作。在这种情况下,AIX 将扫描两类分页,并且回收近来较少使用的分页。

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

lru_file_repage

图 2. lru_file_repage 可调参数
lru_file_repage 可调参数

numpermminpermmaxperm 之间的时候,如果 lru_file_repage 可调参数设置为 1,那么 AIX 分页替换守护进程将根据其内部重新分页表来确定选择何种类型的分页进行操作。

AIX 内核维护了一个重新分页表,以便确定哪些分页在换出后将很快地换入。当内核将一个分页换出、然后再将其换入的时候,通常表示这个分页经常会被使用,并且该分页应该保留在内存中。内核记录了对计算性分页重新分页的次数,以及对非计算性分页重新分页的次数。然后,AIX 内核可以使用这个信息来确定哪一类分页的重新分页工作更加频繁(因而,表示这一类分页正在频繁地使用)。当 lru_file_repage 可调参数设置为 1 时,AIX 内核使用这个重新分页信息来确定是否仅选择非计算性的分页进行操作、或者选择计算性的和非计算性的分页进行操作。如果计算性分页的重新分页速度比非计算性分页的重新分页速度高,那么 AIX 内核将仅选择非计算性的分页进行操作(因为计算性分页的使用更为频繁)。如果非计算性分页的重新分页速度比计算性分页的重新分页速度高,那么 AIX 内核将选择计算性的分页和非计算性的分页进行操作。

在大多数的客户环境中,最理想的方式是始终让内核只选择非计算性的分页进行操作,因为与对非计算性的分页(即数据文件缓存)进行分页相比,对计算性的分页(例如,进程的堆栈、数据等等)进行分页通常会对进程产生更大的性能开销。因此,可以将 lru_file_repage 可调参数设置为 0。在这种情况下,当 numpermminpermmaxperm 之间的时候,AIX 内核始终选择非计算性的分页进行操作。

maxclient

除了 minpermmaxperm 可调参数之外,还有一个 maxclient 可调参数。maxclient 可调参数指定应该用于缓存非计算性客户端分页的最大内存量的限制。因为所有非计算性客户端分页是非计算性永久存储分页总数的子集,所以 maxclient 限制必须始终小于或者等于 maxperm 限制。

非计算性客户端分页的数目称为 numclientvmstat –v 命令可以显示系统的 numclient 值占系统实际内存的百分比。

在缺省情况下,maxclient 限制是严格的限制。这意味着,AIX 内核不允许非计算性的客户端文件缓存超出 maxclient 限制的范围(也就是说,AIX 内核不允许 numclient 超出 maxclient)。当 numclient 达到 maxclient 限制时,AIX 内核将采用特殊的、仅客户端的模式开始分页替换。在这种仅客户端的模式中,AIX 分页替换守护进程将严格地选择客户端分页进行操作。

监视系统的内存使用情况

AIX 提供了几种工具,可用于提供系统中不同分页的计数信息。

vmstat 命令

vmstat 命令可以报告关于系统的内存使用信息,以及诸如分页替换这样的 VMM 操作的统计信息。

使用带 -v 选项的 vmstat 命令可以显示不同分页类型所使用的实际内存百分比(请参见清单 1):

清单 1. vmstat -v 命令
# vmstat -v
       4980736 memory pages
        739175 lruable pages
        432957 free pages
             1 memory pools
         84650 pinned pages
          80.0 maxpin percentage
          20.0 minperm percentage  <<- system’s minperm% setting
          80.0 maxperm percentage  <<- system’s maxperm%
setting
           2.2 numperm percentage  << % of memory containing
non-comp. pages
         16529 file pages          <<- # of non-comp. pages
           0.0 compressed percentage
             0 compressed pages
           2.2 numclient percentage <<- % of memory containing
non-comp. client pages
          80.0 maxclient percentage <<- system’s maxclient%
setting
         16503 client pages         <<- # of client pages
             0 remote pageouts scheduled
             0 pending disk I/Os blocked with no pbuf
             0 paging space I/Os blocked with no psbuf
          2484 filesystem I/Os blocked with no fsbuf
             0 client filesystem I/Os blocked with no fsbuf
             0 external pager filesystem I/Os blocked with no fsbuf
             0 Virtualized Partition Memory Page Faults
          0.00 Time resolving virtualized partition memory page faults

因此,在上面的示例中,一共有 16529 个非计算性的文件分页被映射到了内存中。这些非计算性的分页使用了 2.2% 的内存。在这 16529 个非计算性的文件分页中,有 16503 个是客户端分页。

vmstat 输出没有提供关于计算性文件分页的信息。关于计算性文件分页的信息,可以使用 svmon 命令搜集得到。

svmon 命令

还有另一个命令可用于显示关于系统内存使用的信息,即 svmon 命令。svmon 命令支持大量不同的选项,这些选项用于提供有关系统内存使用的详细信息。

svmon 命令的 -G 选项可以显示不同类型分页所使用的内存量的信息(请参见清单 2):

清单 2. svmon 命令的 -G 选项
# svmon -G
               size      inuse       free        pin    virtual
memory       786432     209710     576722     133537     188426
pg space     131072       1121

               work       pers       clnt
pin          133537          0          0
in use       188426          0      21284

PageSize   PoolSize      inuse       pgsp        pin    virtual
s    4 KB         -     103966       1121      68929      82682
m   64 KB         -       6609          0       4038       6609

要了解系统实际内存的使用情况,svmon 显示了下面三列:

  • work——工作存储
  • pers——持久性存储(持久性存储分页都是非客户端分页,即 JFS 分页。)
  • clnt——客户端存储

对于每种分页类型,svmon 将显示下面两行:

  • inuse——映射到内存中的 4K 分页的数目
  • pin ——映射到内存中的、且固定的 4K 分页的数目(pin 是 inuse 的子集)

因此,在上面的示例中,一共有 188426 个工作存储分页映射到内存中。在这 188426 个工作存储分页中,有 133537 个是固定的(也就是说,不能换出的)。

示例中显示没有持久的存储分页(因为系统中没有使用 JFS 文件系统)。一共有 21284 个客户端存储分页,它们中没有一个是固定的。

svmon 命令没有显示永久存储分页的数目,但这个数目可以由 svmon 的输出计算得到。如前所述,永久存储分页的数目是持久性存储分页数目和客户端存储分页数目的总和。因此,在上面的示例中,系统中一共有 21284 个永久存储分页:

0 persistent storage pages + 21284 client storage pages = 21284 permanent storage pages

svmon 所报告的信息类型与 vmstat 有一点不同。svmon 报告不同类型内存分页的数目信息,包括工作的、持久的(即非客户端的)和客户端的。svmon 并没有提供计算性分页和非计算性分页的对比信息。svmon 只报告每种分页类型在内存中分页的总数。

与此相反,vmstat 可以提供非计算性分页和计算性分页的对比信息。

为了说明这个区别,可以考虑上面的 svmon 输出示例。这 21284 个客户端分页中的某些分页将是计算性的,而这 21284 个客户端分页中剩下的那些分页将是非计算性的。要确定这些客户端分页在计算性和非计算性之间的划分,可以使用 vmstat 命令来确定这 21284 个客户端分页中有多少分页是非计算性的。

显示并且设置可调参数

vmo 命令用于与 VMM 可调参数进行交互。vmo 命令可以用于显示关于可调参数的信息,以及设置可调参数的值。

要显示所有 VMM 可调参数的当前值,可以运行带 –L 选项的 vmo 命令:

# vmo -L

要显示所选 VMM 可调参数的当前值,可以使用 –L 选项以列出可调参数的名称。例如,下面的命令快照显示了列出 minperm%maxperm%maxclient%lru_file_repage 可调参数当前值时的输出(请参见清单 3):

清单 3. 可调参数
# vmo -L minperm% -L maxperm% -L maxclient% -L lru_file_repage

NAME                      CUR    DEF    BOOT   MIN    MAX    UNIT           TYPE
     DEPENDENCIES
--------------------------------------------------------------------------------
lru_file_repage           1      1      1      0      1      boolean           D
--------------------------------------------------------------------------------
maxclient%                80     80     80     1      100    % memory          D
     maxperm%
     minperm%
--------------------------------------------------------------------------------
maxperm%                  80     80     80     1      100    % memory          D
     minperm%
     maxclient%
--------------------------------------------------------------------------------
minperm%                  20     20     20     1      100    % memory          D
     maxperm%
     maxclient%
表 1. 可调参数:列描述
描述
CUR这个列用于列出可调参数的当前值。
DEF这个列用于列出缺省值。
BOOT这个列用于列出可调参数在系统启动时的值。
MIN这个列用于列出可调参数的最小值。
MAX这个列用于列出可调参数的最大值。
UNIT这个列用于说明可调参数的单位。

vmo 命令支持即时更改可调参数的值、或者将更改可调参数值的操作延迟到重新启动系统之后进行。要更改上面的可调参数,使这些更改立即生效,并且在以后重新启动时能够生效,可以指定 -p 选项。下面提供了一个示例(请参见清单 4):

清单 4. -p 选项
# vmo -p -o lru_file_repage=0 -o maxclient%=90 -o maxperm%=90 -o minperm%=3

Setting minperm% to 3 in nextboot file
Setting maxperm% to 90 in nextboot file
Setting maxclient% to 90 in nextboot file
Setting lru_file_repage to 0 in nextboot file
Setting minperm% to 3
Setting maxperm% to 90
Setting maxclient% to 90
Setting lru_file_repage to 0

建议的可调参数设置

如果 VMM 分页替换守护进程仅选择非计算性分页进行操作,那么大多数工作负载都将从中获益。因此,下面所推荐的可调参数将为大多数工作负载情况提供最佳的性能(请参见清单 5):

清单 5. 具有最佳性能的可调参数
lru_file_repage = 0
maxperm = 90%
maxclient = 90%
minperm = 3%
strict_maxclient = 1 (default)
strict_maxperm = 0 (default)

可以使用 vmo 命令设置这些可调参数(请参见清单 6):

清单 6. 使用 vmo 命令设置的可调参数
# vmo –p –o lru_file_repage=0 –o maxclient%=90 –o maxperm%=90 –o minperm%=3
# vmo –p –o strict_maxclient=1 –o strict_maxclient=0

可以使用 vmo –L 命令来查看这些设置。

这些可调参数设置适用于 AIX Version 5.2 和 AIX Version 5.3。要在 AIX Version 5.2 中设置这些可调参数,需要使用 AIX Version 5.2 TL6 或者更高版本。要在 AIX Version 5.3 中设置上面的可调参数,需要使用 AIX Version 5.3 TL1 或者更高版本。

上述可调参数设置是 AIX Version 6.1 的缺省设置。

结束语

AIX VMM 根据使用情况对分页进行分类。您可以使用各种系统可调参数来控制 AIX 分页替换守护进程的行为,并控制 AIX 处理不同类型分页的分页替换的方式。对 AIX VMM 进行优化,可以使得各种工作负载获得明显的性能改善。

参考资料

学习

获得产品和技术

  • IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=292786
ArticleTitle=AIX 分页替换技术入门
publish-date=03032008