分类:
2008-05-11 11:05:53
了解有关 AIX® 虚拟内存管理器 (AIX VMM) 如何工作,以及如何利用可调参数来调整 AIX VMM 操作的详细信息。AIX VMM 负责管理系统中所有的内存。AIX VMM 的操作对于系统性能来说是至关重要的,并且它还提供了几个可调参数,对于不同的工作负载,您可以使用这些参数对其操作进行优化。
AIX® 虚拟内存管理器 (AIX VMM) 是一种基于分页的虚拟内存管理器。一个分页就是一个固定大小的数据块。分页既可以位于内存中(也就是说,映射到物理内存中的某个位置)、也可以位于磁盘中(也就是说,从物理内存中替换到分页空间或者文件系统)。
AIX VMM 有一个非常独特的方面,即缓存的文件数据的管理。AIX VMM 将缓存的文件数据与对其它类型虚拟内存(例如,进程数据、进程堆栈等等)的管理集成到了一起。它将文件数据缓存为分页,就如同进程的虚拟内存一样。
AIX 根据需要将分页映射到实际内存。如果应用程序引用了某个分页,而该分页并没有映射到实际内存中,那么系统将产生一个缺页。为了解决缺页,AIX 内核会将所引用的分页加载到实际内存中的某个位置。如果所引用的分页是一个新的分页(也就是说,位于先前从未引用过的进程数据堆中的分页),那么“加载”所引用的分页只需要用零来填充一个实际内存位置(也就是说,提供一个填满零的分页)。如果所引用的分页是一个预先存在的分页(也就是说,文件中的某个分页、或者先前换出的某个分页),那么加载所引用的分页需要从磁盘(分页空间或者磁盘文件系统)中将该分页读入到实际内存中的某个位置。
在将分页加载到实际内存中之后,它将被标记为未经修改的。如果某个进程或者内核修改了该分页,那么该分页的状态将更改为已修改的。这允许 AIX 跟踪在将某个分页加载到内存之后是否对其进行过修改。
随着系统将更多的分页添加到实际内存中,实际内存中空闲位置(可以包含分页)的数目将会减少。也可以将空闲位置的数目称为空闲分页框架的数目。当空闲分页框架的数目达到某个较低的值时,AIX 内核就必须清空实际内存中的某些位置,以便重用新的分页。这个过程也称为分页替换。
AIX VMM 提供了一些后台守护进程,专门负责进行分页替换。其中一个分页替换守护进程称为 lrud
(显示为 ps -k
的输出中的 lrud
)。lrud
守护进程负责在内存分页中进行扫描,并回收某些分页以便为实际内存腾出空间。当分页替换守护进程确定它希望回收某个特定的分页时,这个分页替换守护进程将执行下面两项操作中的一项:
分页替换守护进程可以根据系统内存的使用情况和可调参数,选择不同类型的分页进行回收。本文剩下的部分将详细地介绍分页替换守护进程如何选择要进行回收的分页。
从本质上看,AIX 中一共有两种分页类型:
工作存储分页是一些包含易变 数据(换句话说,即重新启动后将不复存在的数据)的分页。在其他的平台中,工作存储内存有时也称为匿名 内存。下面提供了一些由工作存储分页组成的虚拟内存区域的示例:
当需要将经过修改的工作存储分页替换出(从内存移动到磁盘)时,它们将被写入到分页空间。不会将工作存储分页写入到文件系统。
当进程退出时,系统将释放其所有的私有工作存储分页。因此,当进程退出时,系统将释放进程数据和堆栈的工作存储分页。对于共享内存区域,直到删除共享内存区域之后,才会释放其工作存储分页。
永久存储分页是一些包含永久数据(也就是说,重新启动后仍然存在的数据)的分页。这种永久数据就是文件数据。因此,永久存储分页就是缓存在内存中的部分文件。
当经过修改的永久存储分页需要换出(从内存移动到磁盘)的时候,会将它写入到文件系统中。如前所述,可以直接释放没有经过修改的永久存储分页,无需将其写入到文件系统中,因为文件系统包含该数据的原始副本。
例如,如果一个应用程序正在读取某个文件,那么该文件数据将缓存于永久存储分页的内存中。这些永久存储分页没有经过修改,这意味着并没有在内存中对这些分页进行修改。因此,内存中的永久存储分页与磁盘中的文件数据完全相同。当 AIX 需要清空内存的时候,它只需要“释放”这些分页即可,而不将任何内容写入到磁盘。如果应用程序对某个文件进行写操作(而不是读操作),那么永久存储分页将是“经过修改的”,并且 AIX 必须在释放这些分页之前将其刷新到磁盘。
您可以将永久存储分页划分为两种子类型:
为了帮助分页替换守护进程更好地选择用来进行替换的分页,AIX 将分页分为下面两种类型:
计算性分页是一些用于文本、数据、堆栈和进程的共享内存的分页。非计算性分页是一些包含正在进行读取和写入的文件的文件数据的分页。
所有的工作存储分页都是计算性的。不会将工作存储分页标记为非计算性的。
永久存储分页既可以是计算性的、也可以是非计算性的,这取决于您使用这些分页的方式。如果一个文件包含某个进程的可执行文本,那么系统会将该文件视为计算性的,并且将该文件中的所有永久存储分页都标记为计算性的。如果该文件不包含可执行文本,那么系统会将该文件视为非计算性的,并且将该文件中的所有永久存储分页都标记为非计算性的。
当您第一次打开一个文件的时候,AIX 内核将创建一个内部 VMM 对象以代表该文件。并且将其标记为非计算性的,这意味着所有的文件在一开始都是非计算性的。
随着程序对该文件进行读写操作,AIX 内核将该文件的数据作为非计算性的永久存储分页在内存中进行缓存。
如果关闭该文件,那么 AIX 内核将继续在内存中(在永久存储分页中)缓存该文件的数据。内核继续缓存该文件是为了提高性能;例如,如果稍后出现了另一个进程,并且它也使用了相同的文件,那么该文件数据仍然位于内存中,并且 AIX 内核不需要从磁盘读入该文件的数据。
如果某个文件因为指令取出发生了缺页,那么会将非计算性文件转换为计算性状态。当对某个文件出现进程缺页(意味着该进程引用了文件的部分内容,而这部分内容当前没有缓存在永久存储分页的内存中)的时候,该进程将产生一个缺页。如果是由于指令取出而导致的缺页(意味着该进程正在尝试加载来自该分页的指令,以便进行相关操作),那么内核会将该文件标记为计算性的。这涉及到将该文件中的所有分页都标记为计算性的。一个文件要么完全是计算性的,要么完全是非计算性的。
在将文件标记为计算性文件之后,它将一直保持为计算性文件,直到删除该文件(或者重新启动系统)。因此,即使移动了该文件、或者对它进行了重命名,该文件仍然标记为计算性的文件。
AIX 分页替换守护进程一次扫描内存的一个分页,找出要回收的分页以释放内存。分页替换守护进程必须仔细地选择分页,以便将分页对系统的性能影响降到最低,并且分页替换守护进程将根据可调参数设置和系统情况来选择不同类型的分页。
您可以使用大量的可调参数来控制 AIX 选择分页进行替换的方式。
minperm
和 maxperm
是两个最基本的分页替换可调参数。这两个可调参数用于指出 AIX 内核应该使用多少内存来缓存非计算性的分页。maxperm 可调参数指出应该用于缓存非计算性分页的最大内存量。
在缺省情况下,maxperm
是一个“非严格的”限制,这意味着在某些情况下可以超出这个限制。将 maxperm
设定为非严格的限制,这允许在具有可用空闲内存的时候,可以在内存中缓存更多的非计算性文件。通过将 strict_maxperm
可调参数设置为 1,就可以使 maxperm
限制成为“严格”的限制。当 maxperm
是严格限制的时候,即使有可供使用的空闲内存,内核也不允许非计算性分页的数目超出 maxperm
的限制。因此,将 maxperm
作为严格限制的缺点是,非计算性分页的数目不能超出 maxperm
的限制,并且在系统中具有空闲内存的时候,也不能使用更多的内存。
minperm
限制指出应该用于非计算性分页的最低内存量。
非计算性分页的数目称为 numperm
:vmstat –v
命令可以显示系统的 numperm
值所占系统实际内存的百分比。
下面的图 1 给出了有关这些可调参数在不同的系统条件下如何进行工作的概况:
当非计算性分页的数目(numperm
)大于或者等于 maxperm
的时候,AIX 分页替换守护进程严格地选择非计算性分页(例如,缓存的非可执行文件)进行操作。
当非计算性分页的数目(numperm
)小于或者等于 minperm
的时候,AIX 分页替换守护进程将选择计算性分页和非计算性分页进行操作。在这种情况下,AIX 将扫描两类分页,并且回收近来较少使用的分页。
当非计算性分页的数目(numperm
)在 minperm
和 maxperm
之间的时候,lru_file_repage
可调参数将控制 AIX 分页替换守护进程替换的分页类型(请参见图 2)。
当 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 内核始终选择非计算性的分页进行操作。
除了 minperm
和 maxperm
可调参数之外,还有一个 maxclient
可调参数。maxclient
可调参数指定应该用于缓存非计算性客户端分页的最大内存量的限制。因为所有非计算性客户端分页是非计算性永久存储分页总数的子集,所以 maxclient
限制必须始终小于或者等于 maxperm
限制。
非计算性客户端分页的数目称为 numclient
。vmstat –v
命令可以显示系统的 numclient
值占系统实际内存的百分比。
在缺省情况下,maxclient
限制是严格的限制。这意味着,AIX 内核不允许非计算性的客户端文件缓存超出 maxclient
限制的范围(也就是说,AIX 内核不允许 numclient
超出 maxclient
)。当 numclient
达到 maxclient
限制时,AIX 内核将采用特殊的、仅客户端的模式开始分页替换。在这种仅客户端的模式中,AIX 分页替换守护进程将严格地选择客户端分页进行操作。
AIX 提供了几种工具,可用于提供系统中不同分页的计数信息。
vmstat
命令可以报告关于系统的内存使用信息,以及诸如分页替换这样的 VMM 操作的统计信息。
使用带 -v
选项的 vmstat
命令可以显示不同分页类型所使用的实际内存百分比(请参见清单 1):
# 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
命令的 -G
选项可以显示不同类型分页所使用的内存量的信息(请参见清单 2):
# 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):
# 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% |
列 | 描述 |
---|---|
CUR | 这个列用于列出可调参数的当前值。 |
DEF | 这个列用于列出缺省值。 |
BOOT | 这个列用于列出可调参数在系统启动时的值。 |
MIN | 这个列用于列出可调参数的最小值。 |
MAX | 这个列用于列出可调参数的最大值。 |
UNIT | 这个列用于说明可调参数的单位。 |
vmo
命令支持即时更改可调参数的值、或者将更改可调参数值的操作延迟到重新启动系统之后进行。要更改上面的可调参数,使这些更改立即生效,并且在以后重新启动时能够生效,可以指定 -p
选项。下面提供了一个示例(请参见清单 4):
# 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):
lru_file_repage = 0 maxperm = 90% maxclient = 90% minperm = 3% strict_maxclient = 1 (default) strict_maxperm = 0 (default) |
可以使用 vmo
命令设置这些可调参数(请参见清单 6):
# 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 进行优化,可以使得各种工作负载获得明显的性能改善。
|
David 是一位 AIX 内核架构师。他的职责包括设计和开发用于 AIX 操作系统的新技术。他具有内核开发方面的背景。您可以通过 与他联系。 |