关于本系列
这个由三篇文章组成的系列重点关注于在运行 AIX® 的 IBM System p™ 服务器上进行内存管理和优化的各个方面。第 1 部分提供了 AIX 中内存的概述,包括对虚拟内存和虚拟内存管理器 (VMM) 的介绍。它还深入地分析了各种优化参数,并对 AIX Version 5.3 中内存管理方面的改进内容进行了介绍。第 2 部分重点关注于内存子系统监视的详细内容,并介绍了如何分析所得到的结果。第 3 部分主要介绍交换空间,以及如何最好地优化 VMM 设置,以提供最优的交换空间配置和性能。
引言
什么是交换(分页)空间?它是与 VMM 有关的。VMM 使用交换(分页)空间存储没有使用活动 RAM 的进程。正是因为这个目的,交换空间是系统整体性能的关键组件。作为一名管理员,您需要了解如何监视和优化您的分页参数。分页空间本身是一个特殊的逻辑卷,它存储了当前不访问的信息。您必须确保您的系统拥有足够的分页空间。如果分页空间过小,整个进程可能会丢失,并且当所有的空间都占满后,系统可能会崩溃。尽管值得再次说明,分页空间是 VMM 中的一部分,但是更重要的是真正地理解内核如何将进程调入到 RAM 中,过多的分页肯定会对性能造成影响。AIX 通过将内核与 VMM 紧密集成在一起,实现了一种称为请求分页的方法。事实上,内核本身的大部分都驻留在虚拟内存中,这样可以帮助释放它的片段空间以用于其他进程。我将更深入地介绍它的工作方式,并介绍在管理和优化分页空间时需要使用的一些工具。
您将了解到,优化工作必须根据系统的类型来进行。例如,对于使用 Oracle 联机事务处理 (OLTP) 类型数据库的系统,在配置多大的交换空间以及如何优化分页参数方面,通常有一些特定的推荐方案。正如本系列前几期文章中所介绍的(请参见参考资料部分),如果不能真正地了解系统的运行状况,您就无法对分页设置进行真正地优化。您需要了解所使用的工具、如何最好地分析将要捕获的数据,并熟悉实现分页空间的最佳实践。根据我的经验,导致系统崩溃的首要原因就是耗尽了分页空间。如果您仔细地阅读本文,并且遵循其中的建议方案,那么应该不会出现这种情况。很显然,您并不希望系统发生崩溃,但如果的确出现了这种情况,那么您将希望这是由于硬件故障造成的、而与您的操作无关,或者由于系统管理员的疏忽造成。
请求分页
在这个部分中,我介绍了 AIX 如何处理分页,给出了交换和分页的定义,并深入地研究了分页空间分配的几种不同模式。这些概念可以帮助您理解后续有关监视、配置和优化的部分。
大多数管理员都认为分页是一件很麻烦的事情。实际上,分页是 AIX 所完成的任务中非常必要的一部分,这是由于 AIX 内核与 VMM 及其请求分页的实现进行了紧密的集成。请求分页的工作原理是,内核一次仅加载部分页面到实际内存中。当 CPU 需要另一个页面时,它会到 RAM 中查找。如果无法在 RAM 中找到这个页面,则出现一次缺页,然后向内核发出信号以便从磁盘中加载更多的页面到 RAM。请求分页的一个优点是,分页空间不需要非常大,因为数据总是在分页空间和 RAM 之间不断地交换。在较早的 UNIX® 系统中,将分页预先分配到磁盘,无论使用还是不使用它们。这使得所分配的磁盘空间可能永远不会被使用。从本质上说,请求分页可以避免盲目地分配磁盘空间。应该使得进程的交换最少,因为许多任务可能存储在 RAM 中。的确如此,因为进程(页面)只有一部分存储在 RAM 中。
交换指的是什么呢?尽管分页和交换通常可以互换使用,但它们之间存在细微的区别。如前所述,在进行分页时,进程的部分内容将在磁盘和 RAM 之间来回移动。当发生交换时,会将整个进程来回移动。为了支持这种情况,在将进程移动到分页空间之前,AIX 会挂起整个进程。只有在将进程交换回 RAM 之后,才能够继续执行它。出现这样的情况并不是很好,您应该尽量防止交换的发生,交换可能会导致另一种称为颠簸的情况(稍后将介绍这个内容)发生。
作为一名 UNIX 管理员,您可能对分页和交换的一些概念已经非常熟悉。AIX 提供了三种不同模式的分页空间分配策略:延迟的页面空间分配(deferred page space allocation)、晚页面空间分配(late page space allocation)、早页面空间分配(early page space allocation)。AIX 的缺省策略是延迟的页面空间分配。这样可以确保将分页空间的分配延迟到必须调出页面的时候进行,从而确保不会浪费分页空间。事实上,当您拥有很大的 RAM 时,您甚至不需要使用任何分页空间(请参见清单 1)。
清单 1. 确保没有浪费的分页空间
# lsps -a Page Space Physical Volume Volume Group Size %Used Active Auto Type hd6 hdisk0 rootvg 4096MB 1 yes yes lv
清单 1 中仅使用了百分之一的分页空间。
让我们来看看 AIX 是如何处理分页空间分配的(请参见清单 2)。
清单 2. 检查 AIX 如何处理分页空间分配
# vmo -a | grep def defps = 1
清单 2 说明使用了这种缺省的方法(延迟的页面空间分配)。要禁用这个策略,您需要将参数设置为 0。这将使得系统使用晚分页空间分配策略。晚分页空间分配策略会在 RAM 中相应的页面被修改时才分配分页磁盘块。这种方法通常用于那些性能比可靠性更加重要的环境。在本文所介绍的场景中,程序可能会因为缺少内存而运行失败。那么早页面空间分配又如何呢?如果您希望确保进程不会因为较低的分页情况而终止,通常可以使用这种策略。早页面空间分配策略可以预先分配分页空间。这是与晚分页空间分配策略截然相反的。对于可靠性要求很高的环境,可以使用这种策略。启用这种策略的方法是将 PSALLOC 环境变量设置为 early (PSALLOC=early
)。
您还应该了解在 AIX Version 5.3 中首次引入的垃圾回收特性。这个特性允许您释放分页空间磁盘块,从而允许您配置比通常所需要的更少的分页空间。这种特性只能用于缺省的延迟页面空间分配策略。
监视和配置分页空间
在这个部分中,我将向您介绍如何监视系统中的分页空间。我还将介绍用于配置分页空间的各种命令,以及帮助系统管理员使用分页空间的其他工具。
要确定系统中分页空间的使用量,最简单的方法是运行 lsps
命令(请参见清单 3)。
清单 3. 运行 lsps 命令
# lsps -s Total Paging Space Percent Used 4096MB 1%
您已经在前面看到了 -a
标志。我喜欢使用 -s
标志,因为 -a
标志仅仅显示所使用的分页空间,而 -s
标志则可以提供所有分配的分页空间的汇总信息,包括使用早页面空间分配策略分配的空间。当然,这个标志仅适用于禁用了分页分配缺省方法的情况。
接下来再研究 vmstat
。本系列文章的第 2 部分非常详细地介绍了 vmstat
,这是我最喜欢的 VMM 监视工具之一。我发现,要确定系统的运行情况,使用这个命令是最简单的方法。您可以从中发现是否存在许多分页以及是否发生了颠簸。
让我们来看看清单 4 中显示的一些输出。
清单 4. 使用 vmstat
# vmstat 1 5 System Configuration: lcpu=2 mem=4096MB kthr memory page faults cpu ----- ----------- ------------------------ ------------ ----------- r b avm fre re pi po fr sr cy in sy cs us sy id wa 1 0 166512 627 0 0 1 0 92 0 277 3260 278 3 1 96 0 1 0 166512 623 0 0 1 0 40 0 253 2260 108 2 1 96 1 1 0 166512 627 0 0 0 0 0 0 248 3343 91 0 1 96 2 1 0 166512 627 0 0 0 0 2 0 247 3164 84 0 1 99 0 1 0 166512 627 0 1 0 0 0 0 277 3260 83 2 1 97 0
其中,最重要的列包括:
- avm——这一列表示您所使用的活动虚拟内存量(单位为 4k 大小的页面),不包括文件页面。
- fre ——这一列表示内存空闲列表的大小。在大多数情况下,我并不担心这个值什么时候变得很小,因为 AIX 总是会充分地使用内存,并且不会像您希望的那样尽早地释放内存。这个设置由
vmo
命令的 minfree 参数来确定。归根结底,分页的信息更加重要。 - pi——这一列表示从分页空间调入的页面数。
- po——这一列表示调出到分页空间的页面数。
正如您在清单 4 中所看到的,该系统中几乎没有进行分页。
清单 5 显示了一个可能出现了颠簸的系统的示例。
清单 5. 可能存在颠簸的系统
# vmstat 2 3 System Configuration: lcpu=4 mem=4096MB kthr memory page faults cpu ----- ----------- ------------------------ ------------ ----------- r b avm fre re pi po fr sr cy in sy cs us sy id wa 1 2 166512 7 0 57 127 0 929 0 2779 3260 1278 3 30 50 0 20 1 5 166512 12 0 39 129 0 409 0 2538 2260 1108 2 10 30 10 50 1 6 166512 110 0 8 212 0 480 0 2487 3343 991 0 27 33 20 30
凭什么能够得出这个结论呢?首先,请看 po 列。该列的值表示页面不断地在磁盘和 RAM 之间来回移动。您还应该发现系统中存在瓶颈,因为阻塞进程和等待时间都高得离谱。而且空闲列表的值也比正常情况要低一些。您可以使用 vmo
命令来查看空闲列表,其值为 120。这意味着,空闲列表的值不应该低于 120。一般情况下,我认为空闲列表的值较低并不能说明问题,但是在这个示例中,它比正常值还要低。当出现这种情况时,通常表示系统中发生了颠簸现象。颠簸现象的典型标志是,当操作系统试图释放资源时,首先警告进程以释放分页空间,然后终止整个进程。在优化 vmo
参数的过程中,您可以帮助设置颠簸开始时的阈值。您还可以使用 topas 或者 nmon 来查看内存的使用情况。这两种实用工具可以以图形的方式、更加友好的格式显示分页信息(请参见清单 6)。
清单 6. 使用 topas 以图形化的方式显示分页信息
Topas Monitor for host: testbox EVENTS/QUEUES FILE/TTY
Sun May 20 11:48:42 2007 Interval: 2 Cswitch 86 Readch 90043
Syscall 1173 Writech 1336
Kernel 0.5 |# | Reads 103 Rawin 1
User 0.0 | | Writes 91 Ttyout 157
Wait 0.0 | | Forks 0 Igets 0
Idle 99.5 |############################| Execs 0 Namei 147
Runqueue 0.0 Dirblk 0
Network KBPS I-Pack O-Pack KB-In KB-Out Waitqueue 0.0
en1 1.6 4.0 4.0 0.2 1.4
en2 0.0 0.0 0.0 0.0 0.0 PAGING MEMORY
lo0 0.0 0.0 0.0 0.0 0.0 Faults 0 Real,MB 4095
Steals 0 % Comp 16.6
Disk Busy% KBPS TPS KB-Read KB-Writ PgspIn 0 % Noncomp 84.3
hdisk0 0.0 0.0 0.0 0.0 0.0 PgspOut 0 % Client 0.5
hdisk1 0.0 0.0 0.0 0.0 0.0 PageIn 0
hdisk3 0.0 0.0 0.0 0.0 0.0 PageOut 0 PAGING SPACE
Sios 0 Size,MB 4096
Name PID CPU% PgSp Owner % Used 0.5
topas 156220 0.2 2.5 root NFS (calls/sec) % Free 99.4
sldf 96772 0.2 0.2 rds ServerV2 0
syncd 12458 0.0 0.6 root ClientV2 0 Press:
lrud 9030 0.0 0.0 root ServerV3 0 "h" for help
gil 10320 0.0 0.1 root ClientV3 0 "q" to quit
PAGING 列(如清单 6 中以粗体显示的内容)显示根本不存在分页。
那么如何维护分页空间的大小呢?在 AIX 中,您可以使用 swap
命令(请参见 清单 7)来完成这项任务。
清单 7. 使用 swap 命令
# swap -l device maj,min total free /dev/hd6 10, 2 4096MB 4093MB
其结果说明,系统中定义了一个交换分区。您还将注意到,其中只使用了 3MB 的空间。清单 8 显示了当分页空间利用率过高时会发生什么样的情况。
清单 8. 耗尽了分页空间
# lsps -a Page Space Physical Volume Volume Group Size %Used Active Auto Type hd6 hdisk0 rootvg 4096MB 78 yes yes lv
在这个示例中,您的分页空间变得很低,以至于可能出现危险。您的系统从启动到现在可能已经很长时间了。如果您运行数据库(如 Oracle),那么直到您清空数据库缓存,才会释放虚拟内存。让我们来查看一下您的系统启动了多长时间了(请参见清单 9)。
清单 9. 使用 uptime 命令
# uptime 11:58AM up 9 days, 15:50, 23 users, load average: 0.00, 0.03, 0.04
如清单 9 中所示,这个系统才启动了 9 天。如果在这么短的时间内,分页空间利用率就增加到百分之七十八,那么您应该考虑添加更多的分页空间。如果您的系统中还有足够的空间,可以添加另一个分区。
一个最佳实践是,请记住保持分页空间的大小相同。在这个示例中,我会添加另一个 4GB 的分页空间到 rootvg 卷。您可以使用系统管理工具 (SMIT) 来完成这项任务,并使用 smit mkps
和 smit swapon
命令以激活分页空间。或者,您可以从命令行使用 swapon
(包括 swapoff
)命令。如果可以,请使用最少被分页区域所使用的磁盘。另外,可以尝试不要为每个物理磁盘分配多个分页逻辑卷。尽管有些管理员并不介意将分页空间放到外部存储中,但是我个人并不推崇这种做法。如果您采取了这种方式,并且外部存储直到重新启动之后才可用,那么您的系统可能会出现崩溃(这取决于所分配的分页空间的大小)。如果可以,请将它们分散到多个磁盘,并且使用 lsps
-a
命令确保它们是联机的。
您的系统究竟需要多大的分页空间呢?其基本原则是什么呢?首先,从提供应用程序的组织开始。DB2® 或者 Oracle 团队应该可以告诉您,从数据库的角度来看,系统究竟需要分配多大的分页空间。如果是一家小型的公司,您就不得不自己研究确定。请多加小心。数据库管理员通常会提出最大的需求,并且告诉您将分页空间的大小设置为您的 RAM 的两倍(以前的基本原则)。通常来说,如果我的系统拥有超过 4GB 的内存,我会按照 RAM 的大小来创建分页空间。在投入运行后,要经常监视您的系统。如果您看到分页空间的利用率从来都没有接近过百分之五十,那么就不需要添加额外的空间。您可以查看最近 Oracle 为 AIX 提供的文档(请参见参考资料部分),以证实这个基本原则。其中说明了,分页空间的推荐初始设置为 RAM 大小的一半加上 4GB,但是上限为 32GB。它推荐使用 lsps -a
命令监视系统中空间使用率超过百分之二十五的情况。添加根本不会用到的额外空间,是毫无意义的。
经常有人问我,如何判断某个进程是否正在使用分页空间?可以查看一下 svmon
的输出,如清单 10 中所示。
清单 10. 使用 svmon
# svmon -P | grep -p 17602 ------------------------------------------------------------------------------- Pid Command Inuse Pin Pgsp Virtual 64-bit Mthrd LPage 17602 sendmail 11877 3211 0 11691 N N N
在确定了 PID 数值之后,可以使用 svmon
进一步深入研究。这样可以帮助您确定是否需要对您的应用程序进行优化,从而帮助停止分页或者优化您的操作系统。对 svmon
执行 man 命令,因为这个 AIX 内存特定的实用工具还有许多其他的用途。
使用 vmo 进行优化
在这个部分中,我使用 vmo
来优化分页参数,这可以极大地降低系统中的分页次数。我还介绍了一些需要更改的阈值和参数,它们会影响您的整体扫描开销。
您可以对 VMM 进行哪些优化工作来减少分页呢?在本系列的第一期文章中(请参见参考资料部分),我曾详细地介绍了 minperm
和 maxperm
参数,在本文中,我将对一些最重要的概念进行总结。在优化 vmo
设置的过程中,可以偏重于工作存储或者持久存储。通常,您希望偏重于工作存储。防止 AIX 调出工作存储并充分利用数据库缓存的方法是,将 maxperm
设置为一个较高的值(大于 80),并确保 lru_file_repage=0
参数表示是否应该考虑 VMM 重分页计数,以及它应该替换何种类型的内存。其缺省设置为 1,所以您需要将其更改为 0。可以使用 vmo
命令来完成这项工作。当您将该参数设置为 0 时,它会告诉 VMM,您希望仅替换文件页面,而不是计算页面。这正是您所希望的。您还需要设置minperm
、maxperm
和 maxclient
参数,如下面的清单 11 所示。
清单 11. 设置 minperm
、maxperm
和 maxclient
参数
vmo -p -o minperm%=5 vmo -p -o maxperm%=90 vmo -p -o maxclient%=90
在以前的 AIX 版本中,您可以对 strict_maxperm
和 strict_maxclient
的缺省值进行优化。在 AIX Version 5.3 中,更改 lru_file_repage
参数是一种更加有效的优化方法,因为您希望不要使用 AIX 文件缓存。现在,让我们简要地总结一下 minfree
和 maxfree
。如果空闲列表中的页面数低于 minfree
参数,VMM 开始替换页面,直到空闲列表至少包含 maxfree 参数中指定的页面数。AIX Version 5.3 中的缺省设置通常可以正常工作(请参见清单 12)。
清单 12. maxfree
和 minfree
的缺省设置
# vmo -a | grep free maxfree = 1088 minfree = 960
让我们来介绍一些优化页面空间的阈值。如前所述,当您的分页空间开始变得很低时,系统将会警告破坏性的进程,然后终止它们。更改哪些阈值可以影响这项活动呢?这些阈值分别是 npsware
、npskill
和 nokilluid
。Npswarn
是当空间变得较低时用于通知进程的阈值。Npskill
是 AIX 开始终止进程的阈值。如果您的策略是早页面空间分配策略,它将不会终止进程。如果您还记得,我曾提到过,这是最可靠的分页方法。Nokillid
是一个非常重要的阈值,因为如果它设置为 1,那么它将确保不会终止 root 所拥有的进程,即使达到了 npskill
阈值。
而且,当因为分页空间的问题使得进程不能通过 fork 系统调用来创建子进程时,调度程序将重新尝试为其创建子进程,共重试五次,每次重试之间延迟十个时钟周期。您可以更改 schedo
参数以增加或者减少尝试的次数。用于这项任务的参数是 pacefork
值。您可以查看的另一个重要参数是 lrubucket
。对这个参数进行优化,可以降低扫描开销。在对拥有大量内存的系统进行扫描时,因为页面置换算法始终查找空闲帧,所以需要扫描的页帧的数目是非常重要的。增加这个值可以减少需要扫描的桶数。这样做可以帮助提高性能。清单 13 使用了带 -a
选项的 vmo
命令,以显示 lrubucket
的值。
清单 13. 显示 lrubucket
的值
# vmo -a | grep lru lru_file_repage = 1 lru_poll_interval = 0 lrubucket = 131072 (this is in 4 KB frames)
要将其缺省值从 512MB 增加到 1GB,可以使用 # vmo -o lrubucket=262144
。
您可以通过这种方式使用 vmo
来降低 AIX 系统中的分页。
总结
本系列文章的第 3 部分介绍了一些用于捕获数据进行交换分析的工具。您使用了一些系统管理命令来显示和配置系统中的交换参数,并且了解了有关分页和交换的概念、以及 AIX 中可用于分页的各种方法。您还看到了一些对系统的分页空间进行配置的最佳实践。最后,您学习了优化 VMM 以处理分页和交换的特定方法。本系列文章的第 1 部分和第 2 部分详细地介绍了 VMM 以及如何对内存瓶颈进行故障诊断。您使用了各种工具帮助监视系统,以便进行短期和长期的分析。您还了解了通用优化方法的所有内容,以及在出现瓶颈前对系统进行监视的重要性。这使得您能够在系统正常运行时建立基准数据,以便可以使用本系列文章中所介绍的方法,包括优化您的内存子系统。请确保在将更改部署到生产环境之前,在开发或测试环境中对它们进行测试。
参考资料
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- AIX 5L™ 内存性能优化::查看本系列中的其他部分。
- AIX 5L CPU性能优化::查看本系列中的其他部分。
- “系统管理员工具包: 交换空间管理和技巧”:了解如何监视您的系统以确定有效的交换空间设置。
- 从 Unix Workstation Support Group of Indiana University 发布的 UNIX for Advanced Users Notes 页面中获取关于分页与交换的信息。
- 阅读 IBM AIX 5L Wiki 中的 Paging space 条目。
- Administering Oracle Database on AIX:从 Oracle Database Administrator's Reference 的 Administering Oracle Database on AIX 部分中获得有关内存和分页的详细信息。
- AIX memory affinity support:访问 IBM System p and AIX 信息中心,以了解有关 AIX 内存关联支持的详细内容。
- Tuning IBM AIX5L for an Oracle Database:这篇文章介绍了 Oracle 不同类型工作负载的性能分析和优化,以及 AIX 5L 的配置设置。
- IBM 红皮书:Database Performance Tuning on AIX 用于帮助系统设计人员、系统管理员和数据库管理员,以设计、确定大小、实现、维护、监视和优化关系数据库管理系统 (RDMBS),从而在 AIX 上实现最优的性能。
- Test 234:AIX 5L Performance and Systems Tuning:这项考试是 IBM 认证计划中的一部分。
- Power Architecture:High-Performance Architecture with a History:阅读这本白皮书。
- “Power to the People; A history of chip making at IBM:这篇文章介绍了 IBM power 体系结构。
- “AIX 中的处理器关联:使用进程关联设置来绑定线程或者取消线程的绑定,这样做可以帮助您找出产生棘手的挂起或死锁问题的根源。阅读这篇文章,以了解如何使用处理器关联来限制进程,并仅在指定的中央处理单元 (CPU) 上运行该进程。
- “CPU 监视和优化”:了解标准的 AIX 工具如何帮助您确定 CPU 瓶颈。
- IBM 红皮书:AIX 5L Practical Performance Tools and Tuning Guide 对 AIX 5L Version 5.3 中提供的性能监视和优化工具进行了全面的介绍。
- “AIX 5L Version 5.3:为您提供了哪些新的特性”:了解 AIX 5L Version 5.3 中的哪些特性能够使您获益。
- 操作系统与设备管理:IBM 的这个文档为用户和系统管理员提供了全面的信息,以便在执行诸如备份和还原系统、管理物理和逻辑存储、以及确定合适的分页空间之类的任务时,帮助您选择合适的选项。
- IBM 红皮书:AIX 5L Differences Guide Version 5.3 Edition 关注于与 AIX 5L Version 5.2 相比,AIX 5L Version 5.3 中所引入的差异。
- 查看 Ken Milberg 撰写的其他文章和教程:
- 在 developerWorks 和 IBM 中
- 受欢迎的内容:查看您的同事所感兴趣的 AIX 和 UNIX 文章。
- AIX and UNIX 专区:developerWorks 的 “AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
- AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
- AIX 5L Wiki:发现 AIX 相关技术信息的协作环境。
- 按主题搜索“AIX and UNIX”库:
- 系统管理
- 应用程序开发
- 性能
- 移植
- 安全性
- 提示
- 工具和实用程序
- Java™ 技术
- Linux®
- 开放源代码
- Safari 书店:访问此电子参考资料库可查找特定的技术资源。
- developerWorks 技术事件和网络广播:了解最新的 developerWorks 技术事件和网络广播。
- Podcast:收听 Podcast 并与 IBM 技术专家保持同步。
- Future Tech:访问 Future Tech 网站以了解有关其最新产品的详细信息。
获得产品和技术
- IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。
讨论
- 参与 developerWorks Blog,从而加入到 developerWorks 社区中来。
- 参与“AIX and UNIX”论坛:
- AIX 5L——技术论坛
- AIX for Developers 论坛
- 集群系统管理
- IBM Support Assistant
- 性能工具——技术
- 虚拟化——技术
- 更多“AIX and UNIX”论坛