优化 AIX 7 内存性能: 第 3 部分,交换空间设置调优

了解交换(分页)空间,学习如何配置和管理它、捕捉统计数据以及优化虚拟内存管理器 (VMM) 设置,以便提供最优的交换(分页)空间配置和性能。对于 AIX 7 和 POWER7 架构,让内存系统产生最佳性能非常重要。因为内存容量更大而且 CPU 核数更多,必须更好地了解 VMM 和自己的配置,这有助于更改参数以满足需求。


关于本系列

这个由三部分组成的系列重点关注在运行 AIX 7 的 IBM System p 服务器上进行内存管理和调优的各个方面。第 1 部分 概述了 AIX 中的内存,包括对虚拟内存和虚拟内存管理器 (VMM) 的讨论。它还深入地分析了用于虚拟和物理内存的分页和组织的调优参数。第 2 部分 重点关注内存子系统监视的详细内容,讨论了如何分析所得到的结果。第 3 部分主要介绍交换空间,以及如何最好地优化 VMM 设置,以提供最优的交换空间配置和性能。

简介

什么是交换(分页)空间?它与 VMM 有关。VMM 使用交换(分页)空间存储没有使用活动 RAM 的进程。由于它的用途,交换空间是系统整体性能的关键因素。作为管理员,您需要了解如何监视和调优分页参数。分页空间本身是一个特殊的逻辑卷,它存储当前不访问的信息。必须确保系统拥有足够的分页空间。如果分页空间太小,整个进程可能会丢失,当所有的空间都占满后,系统可能会崩溃。尽管必须重申分页空间是 VMM 的一部分,但是更重要的是真正地理解内核如何将进程调入到 RAM 中,过多的分页肯定会损害性能。AIX 7 通过将内核与 VMM 紧密集成在一起,实现了一种称为请求分页的方法。实际上,内核本身的大部分都驻留在虚拟内存中,这样可以帮助释放内存段以供其他进程使用。我们将更深入地介绍它的工作方式,并讨论在管理和调优分页空间时需要使用的一些工具。

您会发现调优工作必须根据系统的类型来进行。例如,对于使用 Oracle 联机事务处理 (OLTP) 型数据库的系统,在配置多大的交换空间以及如何优化分页参数方面,通常有一些专门的建议。正如本系列前几期文章中所介绍的(见 参考资料),如果不能真正地了解系统的运行状况,就无法对分页设置进行真正地调优。需要了解所使用的工具、如何最好地分析将要捕捉的数据,并熟悉实现分页空间的最佳实践。根据我们的经验,导致系统崩溃的首要原因是耗尽分页空间。如果仔细地阅读本文并遵循其中的建议,那么应该不会出现这种情况。显然,您绝不希望系统发生崩溃,但如果的确出现了这种情况,那么不希望这是由于系统管理员的疏忽造成的。

请求分页

在本节中,我们概述 AIX 如何处理分页,定义交换和分页,并深入地研究分页空间分配的不同模式。这些概念可以帮助理解后面有关监视、配置和调优的小节。

大多数管理员都认为分页是一件很麻烦的事情。实际上,分页是 AIX 7 所完成的任务中非常普通的部分,这是由于 AIX 内核与 VMM 及其请求分页的实现紧密地集成。请求分页的工作原理是,内核一次仅装载少量页面到实际内存中。当 CPU 需要另一个页面时,它会到 RAM 中查找。如果无法在 RAM 中找到这个页面,则出现一次缺页,这指示内核从磁盘中装载更多的页面到 RAM 中。

请求分页的一个优点是,分页空间不需要非常大,因为数据总是在分页空间和 RAM 之间不断地交换。在较早的 UNIX 系统中,将分页预先分配到磁盘,无论使用还是不使用它们。这使得所分配的磁盘空间可能永远不会被使用。从本质上说,请求分页可以避免盲目地分配磁盘空间。进程的交换的数量减至最小,因为许多作业可以存储在 RAM 中。这是因为进程(页面)只有一部分存储在 RAM 中。

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

作为 UNIX 管理员,您可能对分页和交换的一些概念已经非常熟悉了。AIX 7 提供三种不同的分页空间分配模式:延迟的分页空间分配、晚分页空间分配和早分页空间分配。AIX 7 的默认策略是延迟的分页空间分配。这确保将分页空间的分配延迟到必须调出页面的时候,从而确保不会浪费分页空间。实际上,当有很大的 RAM 时,甚至可能不需要使用任何分页空间(见 清单 1)。

清单 1. 确保没有浪费的分页空间
# lsps -a

Page Space      Physical Volume   Volume Group      Size   %Used  Active  Auto  Type
Chksumhd6          hdisk0            rootvg        768MB     3     yes    yes    lv 
0

在清单 1 中,仅使用了百分之三的分页空间。还要注意,在分页空间上禁用了校验和(由 Chksum 下面的 0 表示)。校验和有助于提高分页空间的可靠性。可以使用 chps 命令或者在使用 mkps 命令创建新的分页空间时更改校验和设置。

让我们来看看 AIX 7 当前如何处理分页空间分配(见 清单 2)。

清单 2. 检查 AIX 7 如何处理分页空间分配
# vmo -o defps

清单 2 说明正在使用默认方法(延迟的分页空间分配)。要想禁用这个策略,需要将这个参数设置为 0。这将让系统使用晚分页空间分配策略。晚分页空间分配策略会直到 RAM 中的页面被修改时才分配相应的分页磁盘块。这种方法通常用于那些性能比可靠性更重要的环境。在这里给出的场景中,程序可能会由于缺少内存而运行失败。那么早分页空间分配又如何呢?如果希望确保进程不会因为分页空间太少而终止,通常使用这种策略。早分页空间分配策略预先分配分页空间。这与晚分页空间分配策略正好相反。对于可靠性要求很高的环境,可以使用这种策略。启用这种策略的方法是将 PSALLOC 环境变量设置为 early (PSALLOC=early)。

分页空间的垃圾收集

AIX 7 还支持分页空间的垃圾收集,这意味着当系统耗尽某个工作负载和应用程序集合的分页空间时,可以强制回收作为分页块使用的磁盘空间。垃圾收集有助于从系统中挤出更多内存,有助于提高包含当前正在使用的应用程序的工作负载的性能。

由于允许回收页面,配置的分页空间可以少于可能需要的数量。可以通过延迟的分页空间分配策略以多种可配置的方式执行垃圾收集。默认的方法是,在把页面读回内存中之后执行收集。在这种情况下,页面存储在磁盘上,也存在于内存中,但是并不从磁盘上删除;这样的话,如果不得不再次写出页面(但是没有更改过),就不会影响性能。

有两个关键参数 npsrpgminnpsrpgmax,它们设置开始和应该停止重新页面调入垃圾收集时的块数。另外两个参数 rpgcleanrpgcontrol 指定如何执行垃圾收集。

rpgclean 参数定义垃圾收集是从被修改的页面开始(默认设置,0),还是从分页空间读取的页面开始(1)。设置为后者可以提高垃圾收集的效果,让更多页面可用,但是可能影响性能。

rpgcontrol 支持三个选项,通过引用 npsrpgmin 和 npsrpgmax 选项控制执行垃圾收集的时间。默认值 2 指定垃圾收集的发生不考虑限制。1 值表示处理读访问。0 值禁止释放分页空间磁盘块。

可以使用 vmo 工具配置所有设置。

除了在读入和写出页面时执行垃圾收集,另一种做法是让内核进程 pgsc 清洗(scrub)内存,标识出已经写到磁盘的页面,但是现在出现在内存中,还没有再次写出到磁盘。这会释放分页设备上的分页块,让其他应用程序可以使用它们。

页面清洗比页面调入清洗更密集,但好处是可以释放已经在磁盘上创建但是从没有实际写到分页空间的页面。

与页面调入清洗相似,使用 vmo 配置这种操作。npscrubminnpscrubmax 参数指定开始和停止清洗时的空闲分页空间块数量。

scrub 参数启用或禁用清洗(默认设置是禁用)。scrubclean 参数启用或禁用对已经分配但还没有修改过的页面进行清洗。

对于这两种页面清洗,在分页空间通常很少的系统上,可能应该配置更激进的清洗方案,让需要支持的应用程序和工作负载有更多页面可用。

为了更好地了解分页需求,我们先看看如何监视分页空间。

监视和配置分页空间

在本节中,我们将介绍如何监视系统中的分页空间。我们还将介绍用于配置分页空间的各种命令,以及帮助系统管理员使用分页空间的其他工具。

要想确定系统中分页空间的使用量,最简单的方法是运行 lsps 命令(见 清单 3)。

清单 3. 运行 lsps 命令
# lsps -s
Total Paging Space   Percent Used
      768MB               3%

您已经在前面看到了 -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   pc   ec
1  0 419284 18634   0   0   0   0   0   0  231 20152 529  6  62  32  0  0.92 368.5
1  0 418879 19038   0   0   0   0   0   0  231 18725 500  6  63  32  0  0.89 357.1
1  0 419644 18274   0   0   0   0   0   0  251 19784 526  6  63  31  0  0.91 365.3
1  0 419970 17948   0   0   0   0   0   0  153 19319 514  6  62  32  0  0.91 365.1
1  0 419575 18343   0   0   0   0   0   0  142 19617 535  6  62  32  0  0.95 378.8

其中最有意义的列包括:

  • avm — 这一列表示正在使用的活动虚拟内存量(4k 页面数量),不包括文件页面。

  • fre — 这一列表示内存空闲列表的大小。在大多数情况下,当这个值变得很小时我们并不担心,因为 AIX 7 总是会充分地使用内存,不会像希望的那样尽早地释放内存。这个设置由 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   pc   ecs
1  0 421128 36893   0  57 129  29   43   0 257 19123 581  6 63 32  0  0.94 374.3
1  0 422808 11079   0  49 384  91  199   0 358 18182 496 13 63 24  0  0.95 381.8
1  0 420776 37703   0  45 117   0    0   0 192 19392 550  6 63 31  0  0.95 381.6
1  0 421073 37406   0   0   0   0    0   0 157 20342 502  6 61 33  0  0.94 377.2
1  0 421119 37353   0   0   0   0    0   0 131 18633 507  6 62 32  0  0.88 352.8
1  0 420748 37717   0   0   0   0    0   0 154 19737 534  6 62 32  0  0.92 369.1

凭什么得出这个结论呢?首先,看看 po 列。该列的值表明页面不断地在磁盘和 RAM 之间来回移动。还应该发现系统中存在瓶颈,因为阻塞的进程和等待时间都非常高。空闲列表的值也比正常情况低。使用 vmo 命令查看空闲列表,发现数值为 120。这意味着空闲列表的值不应该低于 120。一般情况下,我们认为空闲列表的值较低并不能说明有问题,但是在这个示例中,它比正常值还要低。当出现这种情况时,通常表明系统中发生了抖动。抖动的典型标志是,当操作系统试图释放资源时,首先警告进程以释放分页空间,然后终止整个进程。通过调优 vmo 参数,可以帮助设置抖动开始时的阈值。还可以使用 topas 或 nmon 查看内存使用情况。

那么如何维护分页空间的大小呢?在 AIX 7 中,可以使用 swap 命令来完成这项任务(见 清单 6),也可以使用单独的 mkpschps 命令创建带有逻辑分区的分页空间。

清单 6. 使用 swap 命令
# swap -l
device              maj,min     total       free
/dev/hd6            10,  2       768MB       751MB

这说明已经定义了一个交换分区。您还会注意到,实际上只使用了 3MB 的空间。清单 7 显示了当分页空间利用率过高时会发生什么情况。

清单 7. 耗尽分页空间
# lsps -a

Page Space      Physical Volume   Volume Group    Size %Used Active  Auto  Type Chksum
hd6             hdisk0            rootvg         768MB    73   yes   yes    lv     0

在这个示例中,分页空间变得很低,以至于可能有危险。系统可能已经运行很长时间了。如果正在运行数据库(比如 Oracle),那么直到清空数据库缓存,才会释放虚拟内存。让我们来看一下系统运行了多长时间(见 清单 8)。

清单 8. 使用 uptime 命令
# uptime
  11:58AM   up 9 days,  15:50,  23 users,  load average: 0.00, 0.03, 0.04

如清单 8 所示,这个系统只运行了 9 天。如果在这么短的时间内分页空间利用率就增加到了 73%,那么应该考虑添加更多的分页空间。如果系统中还有足够的空间,可以添加另一个分区。

应该记住的一个最佳实践是,要保持分页空间的大小相同。在这个示例中,我们会添加另一个 4GB 的分页空间到 rootvg 卷中。可以使用 System Management Interface Tool (SMIT) 来完成这项任务,并使用 smit mkpssmit swapon 命令激活分页空间。也可以从命令行使用 swapon(包括 swapoff)命令。如果可以,应该使用最少用于分页区域的磁盘。另外,尽量避免为每个物理磁盘分配多个分页逻辑卷。尽管有些管理员并不介意将分页空间放在外部存储上,但是我个人并不喜欢这种做法。如果采用这种方式,而且外部存储直到重新启动之后才可用,那么系统可能会出现崩溃(这取决于所分配的分页空间的大小)。如果可以,应该将它们分散到多个磁盘上,并使用 lsps -a 命令确保它们联机。

系统上究竟需要多大的分页空间呢?基本原则是什么呢?首先,咨询拥有应用程序的团队。DB2 或 Oracle 团队应该可以告诉您,从数据库的角度来看系统究竟需要分配多大的分页空间。如果是小型的组织,就不得不自己研究确定。但是,请多加小心。数据库管理员通常喜欢提出最大的需求,可能要求您将分页空间的大小设置为 RAM 的两倍,尽管对于包含大量 RAM 的现代系统这条规则并不现实。通常,您需要的是在耗尽主 RAM 的情况下使用分页空间,而不是在 RAM 和磁盘上同时保存页面的持久拷贝。在投入运行后,要经常监视系统。如果看到分页空间的利用率从来都没有接近过 50%,那么就不要添加空间。比较合理的规则是,把分页空间配置为 RAM 大小的一半加上 4GB,上限为 32GB。在有超过 32 GB RAM 的系统上,或者在使用 LPAR 和 WPAR 帮助划分工作负载的系统上,可以根据内存需求更有针对性地做出决定。

一般规则是使用 lsps -a 命令监视空间,只要系统上的利用率不超过 25%,就不必担心。添加根本不会用到的额外空间只会浪费磁盘空间,有时候会对性能有消极影响,因为 OS 要处理更大的分页空间。

经常有人问我们如何判断某个进程是否正在使用分页空间。可以看一下 svmon 的输出,见 清单 9

清单 9. 使用 svmon
   # l488pp065_pub[/tmp] > svmon -P 7209170
   ---------------------------------------------------------------------------
  Pid Command             Inuse      Pin     Pgsp  Virtual 64-bit Mthrd  16MB
 7209170 sshd             25978    11972       0    25837     N     N     N

     PageSize                Inuse        Pin       Pgsp    Virtual
     s    4 KB                 234          4          0         93
     m   64 KB                1609        748          0       1609

确定了 PID 数值之后,可以使用 svmon 进一步深入研究。这可以帮助确定是否需要对应用程序进行优化,从而帮助停止分页或者优化操作系统。请阅读 svmon 的手册页,因为这个 AIX 特有的内存实用工具还有许多其他的用途。

用 vmo 进行调优

在本节中,我们使用 vmo 来优化分页参数,这可以极大地减少系统中的分页次数。我们还要介绍一些需要更改的阈值和参数,它们会影响整体扫描开销。

可以对 VMM 进行哪些调优工作来减少分页呢?在本系列的第一期中(见 参考资料),我们详细地介绍了 minpermmaxperm 参数,在本文中我们对一些最重要的概念进行总结。通过优化 vmo 设置,可以偏重于工作存储或者持久存储。通常,希望偏重于工作存储。防止 AIX 7 进行分页工作存储并充分利用数据库缓存的方法是,将 maxperm 设置为较高的值(大于 80),并通过设置 lru_file_repage=0 参数表示是否应该考虑 VMM 重分页计数,以及应该偷取何种类型的内存。默认设置为 1,所以需要将其更改为 0。可以使用 vmo 命令来完成这项工作。当将此参数设置为 0 时,它会告诉 VMM 希望仅偷取文件页面,而不是计算页面。这正是您所希望的。还需要设置 minpermmaxpermmaxclient 参数,见 清单 10

清单 10. 设置 minpermmaxpermmaxclient 参数
vmo -p -o minperm%=5
vmo -p -o maxperm%=90
vmo -p -o maxclient%=90

在以前的 AIX 版本中,可以对 strict_maxpermstrict_maxclient 的默认值进行调优。在 AIX Version 5.3 中,更改 lru_file_repage 参数是一种更有效的调优方法,因为希望根本不使用 AIX 文件缓存。现在,让我们简要地总结一下 minfreemaxfree。如果空闲列表中的页面数低于 minfree 参数,VMM 就开始偷取页面,直到空闲列表至少包含 maxfree 参数中指定的页面数。AIX Version 5.3 中的默认设置通常可以正常工作(见 清单 11)。

清单 11. maxfreeminfree 的默认设置
# vmo -a | grep free
              maxfree = 1088
              minfree = 960

让我们来讨论分页空间阈值的调优。如前所述,当分页空间开始变得非常低时,系统将会开始警告破坏性的进程,然后终止它们。更改哪些阈值可以影响这种活动呢?这些阈值是 npswarenpskillnokilluidnpswarn 是当空间变得较低时用于通知进程的阈值。npskill 是 AIX 7 开始终止进程的阈值。如果策略是早分页空间分配策略,它将不会终止进程。我们曾提到过,这是最可靠的分页方法。nokillid 是一个非常重要的阈值,因为如果它设置为 1,那么它将确保不会终止 root 拥有的进程,即使达到了 npskill 阈值。

另外,当因为分页空间的问题导致进程不能通过 fork 系统调用来创建子进程时,调度程序将重新尝试为其创建子进程,最多重试五次,每次重试之间延迟 10 个时钟周期。可以更改 schedo 参数以增加或减少尝试的次数。用于这项任务的参数是 pacefork 值。可以查看的另一个重要参数是 lrubucket。对这个参数进行调优可以降低扫描开销。在对有大量内存的系统进行扫描时,因为页面置换算法始终寻找空闲帧,所以需要扫描的页帧数量非常大。增加这个值可以减少需要扫描的桶数。这样做可以帮助提高性能。清单 12 使用带 -a 选项的 vmo 命令以显示 lrubucket 的值。

清单 12. 显示 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 7 系统中的分页。

结束语

本系列的第 3 部分介绍了一些用于捕捉数据以进行交换分析的工具。您使用了一些系统管理命令来显示和配置系统中的交换活动,了解了分页和交换的概念以及 AIX 7 中的各种分页方法。还看到了一些对系统的分页空间进行配置的最佳实践。最后,学习了优化 VMM 以处理分页和交换的特定方法。本系列的 第 1 部分第 2 部分 详细地介绍了 VMM 以及如何对内存瓶颈进行故障排除。您使用了各种工具帮助监视系统,以便进行短期分析和长期趋势分析。还了解了通用优化方法的所有内容,以及在出现瓶颈前对系统进行监视的重要性。这让您能够在系统正常运行时建立基准数据,以便可以使用本系列中所介绍的方法,包括优化内存子系统。要确保在开发或测试环境中对更改进行测试,然后再把它们部署到生产环境中。