分类:
2009-09-06 19:33:22
了解更多关于直接 I/O、并发 I/O、异步 I/O 的内容,以及每种 I/O 实现方法的最佳实践。本系列教程共有三篇文章,介绍了关于 AIX® 磁盘和 I/O 子系统的内容,重点关注于在优化磁盘 I/O 性能时的各种挑战。尽管磁盘优化很可能没有 CPU 或者内存优化那么激动人心,但它是优化服务器性能的关键部分。事实上,其中部分原因是因为磁盘 I/O 是最薄弱的子系统环节,与任何其他子系统相比,您可以执行更多的操作以提高磁盘 I/O 性能。
磁盘 I/O 优化的关键部分涉及到在构建您的系统之前实现相关的最佳实践。因为当您已经启动并处于运行状态时,很难再对数据进行移动,所以在规划您的磁盘和 I/O 子系统环境时,需要在第一次就正确地完成这项任务,这一点是非常重要的。这包括物理体系结构、逻辑磁盘排列,以及逻辑卷和文件系统配置。
当系统管理员听到可能出现了磁盘争用的问题时,他或她首先将会求助 iostat。iostat 等同于使用 vmstat 提供有关内存的报告,它是获得有关您的 I/O 子系统的当前运行情况概述的一种快速而原始的方法。尽管运行 iostat 并不是一种完全不合理的“膝跳反应”,但是很早就应该着手考虑磁盘 I/O 的问题,而不是等到必须进行优化工作的时候。如果从一开始就没有正确地为您的环境配置磁盘,那么任何优化工作都无法提供帮助。而且,有一点非常重要,需要了解磁盘 I/O 的详细信息,以及它与 AIX® 及您的 System p™ 硬件之间的关系。
就磁盘 I/O 优化而言,特定的 AIX 工具和实用工具比通用的 UNIX® 命令和工具能够提供更多的帮助,因为它们的任务就是帮助您优化本机 AIX 磁盘 I/O 子系统。本文定义和介绍了 AIX I/O 栈,并将其与磁盘性能的物理和逻辑方面关联起来。本文介绍了直接、并发和异步 I/O:它们是什么,如何启用它们,以及如何监视和优化它们。本文还介绍了一些长期监视工具,您应该使用它们来帮助优化您的系统。听到 iostat 并不是一种推荐的、帮助您长期收集统计数据的工具,您可能会感到奇怪。
最后,本文继续强调一点,无论您希望优化哪个子系统,始终应该将系统优化看作一个持续的过程。开始对系统进行监视的最佳时间是当您首次将系统应用到生产环境中并且正常运行时,而不是等到用户抱怨系统的性能非常糟糕的时候。您需要在系统正常运行的时候建立系统运行状态的基准,以便在可能不正常运行的情况下对数据进行分析。在对您的 I/O 子系统进行更改时,一次仅进行一项更改,以便能够准确地评估这项更改所带来的影响。为了评估其影响,您将使用本文中推荐的一种长期监视工具来捕获数据。
这个部分提供了磁盘 I/O 与 AIX 之间的关系的概述。本部分介绍了 I/O(设备驱动器和适配器)的物理方面、AIX I/O 栈,以及一些相关概念(如直接、并发和异步 I/O)。还介绍了 I/O 处理速率调整的概念,以及 iostat 的一些最新改进,以便帮助您监视 AIX 服务器。
您应该很清楚,对于运行任何程序来说,最慢的操作实际上是花费在检索磁盘中数据上的时间。这种情况主要是因为 I/O 的物理组件。实际的磁臂必须找到正确的柱面,控制部分需要访问正确的块,并且磁头必须等到这些块旋转到磁头下面。在对系统进行任何优化活动之前,首先应该了解您的 I/O 系统的物理体系结构,因为如果您所设计的 I/O 子系统非常糟糕,并且其中包含慢速磁盘,或者适配器的使用非常低效,那么任何优化工作都无法提供帮助。
图 1 清楚地阐释了物理 I/O 组件与逻辑磁盘及其应用程序 I/O 之间非常紧密地关联在一起。这正是通常将其称为 AIX I/O 栈的原因。
在进行优化工作时,您需要了解所有的层次,因为它们分别以不同的方式对性能产生影响。在第一次设置您的系统时,对于磁盘的配置,可以从底层(物理层)开始,然后是设备层、逻辑卷、文件系统、文件和应用程序。规划您的物理存储环境是非常重要的,这一点无论怎样强调都不为过。这涉及到确定磁盘的数量、类型(速度)、大小和吞吐量。关于存储技术需要注意的一项重要挑战是,尽管磁盘存储功能得到了极大的改进,但是磁盘的旋转速度却没有太大的提高。您必须清楚这样的一个事实,RAM 访问仅需要 540 个 CPU 周期,而磁盘访问则需要花费 20,000,000 个 CPU 周期。很明显,系统中最薄弱的环节就是磁盘 I/O 存储系统,并且作为系统管理员,您的任务是确保它不会成为更严重的瓶颈。如前所述,与任何可调整的 I/O 参数相比,糟糕的数据布局将会给 I/O 性能带来更大的影响。查看 I/O 栈可以帮助您理解这一点,因为逻辑卷管理器(Logical Volume Manager,LVM)和磁盘布置要比优化参数(ioo 和 vmo)更接近于底层。
现在,让我们来介绍数据布局的一些最佳实践。一个重要的概念是,请确保您的数据均匀地分布在整个物理磁盘中。如果您的数据仅位于几个轴,那么使用多个逻辑单元号 (LUN) 或者物理磁盘又有什么实际意义呢?如果您使用了 SAN 或者其他类型的存储阵列,那么您应该尝试在创建阵列时使它们具有相同的大小和类型。您还应该在创建它们时,为每个阵列使用一个 LUN,然后将所有的逻辑卷分散到您的卷组中所有的物理卷。如前所述,应该在首次配置您的系统时完成这项工作,因为修复 I/O 问题要比内存或者 CPU 问题更加困难,特别是当它涉及到在生产环境中对数据进行移动时。您还应该确保镜像位于不同的磁盘和适配器。数据库提出了不同的、独特的要求,如果可能,您的索引和重做日志也应该位于不同的物理磁盘。对于经常用于执行排序操作的临时表空间,也应该这样。再回到物理设备方面。使用高速适配器连接磁盘驱动器,这一点是非常重要的,但是您必须确保该总线本身不会成为一个瓶颈。要防止这种情况发生,请确保将适配器分散到多个总线。同时,不要将过多的物理磁盘或者 LUN 连接到任何一个适配器,因为这样做也会对性能产生极大的影响。您配置的适配器越多越好,特别是在大量磁盘的利用率都很高的情况下。您还应该确保设备驱动程序支持多路径 I/O (MPIO),它支持 I/O 子系统的负载平衡和可用性。
让我们回到前面提到的一些概念,如直接 I/O。那么,什么是直接 I/O?它在 AIX Version 4.3 中首次引入,这种 I/O 方法不经过虚拟内存管理器(Virtual Memory Manager,VMM),从用户缓冲区直接与磁盘进行数据传输。根据您的应用程序的类型,在实现这种技术时可以提高性能。例如,那些具有糟糕的缓存使用率的文件,是使用直接 I/O 的很好的候选对象。直接 I/O 还可以提高那些使用同步写入操作的应用程序的效率,因为这些写入操作的对象是磁盘。直接 I/O 降低了CPU 使用率,这是因为消除了双重数据副本。将磁盘的数据复制到缓冲区缓存,然后再复制文件数据时会出现多余的副本。直接 I/O 的一个主要性能开销是,尽管它可以降低 CPU 使用率,但是它可能导致进程长时间等待较小请求的完成。请注意,这种方式适用于在磁盘上具有持久存储位置的持久段文件。当使用 IBM Enhanced Journaled File System for AIX 5L™ (JFS2) 不通过直接 I/O 访问文件时,文件作为本地页面缓存,并且将数据复制到 RAM 中。直接 I/O 可以在许多方面为您提供与使用原始逻辑卷类似的性能,同时还保留了使用 JFS 文件系统的优点(例如,易于管理)。在使用直接 I/O 装入文件系统时,您应该避免使用支持大文件的 JFS 文件系统。
并发 I/O 又如何呢?它在 AIX Version 5.2 中首次引入,这个特性调用了直接 I/O,所以它具有与直接 I/O 相关联的所有其他性能注意事项。使用标准的直接 I/O,会对索引节点(与文件相关联的数据结构)加锁,以防止出现多个线程试图同时更改一个文件的内容的情况。并发 I/O 绕过了索引节点锁,这样可以允许多个线程并发地读写相同文件的数据。这是因为 JFS2 在实现时使用了写独占 (write-exclusive) 索引节点锁,允许多个用户同时读取相同的文件。可以想象,直接 I/O 可能使得不断地从相同文件读取数据的数据库产生很大的问题。并发 I/O 则解决了这一问题,这正是该特性主要用于关系数据库的原因。与直接 I/O 类似,您可以通过 open 系统调用或者通过装入文件系统来实现这种方式,如下所示:
# mount -o cio /u |
当您使用这个命令装入文件系统时,其中所有的文件都使用并发 I/O。与使用直接 I/O 相比,并发 I/O 几乎可以提供使用原始逻辑卷的所有优点,同时保持文件系统的易管理性。请注意,您不能对 JFS(只能对 JFS2)使用并发 I/O。而且,对于那些受益于文件系统预读功能或者较高缓冲区缓存命中率的应用程序,可能会出现性能的降低。
异步 I/O 是什么情况呢?同步和异步 I/O 指的是,应用程序是否等待 I/O 的完成以开始进行处理。正确地使用异步 I/O 可以极大地提高 I/O 子系统写入操作的性能。其工作方式是,它本质上允许应用程序在后台等待 I/O 完成的同时,继续进行处理。这种方式能够提高性能是因为它允许 I/O 和应用程序处理同时运行。对于数据库环境,启用异步 I/O 的确可以起到帮助作用。您如何监视异步 I/O 服务器的使用率呢?iostat(仅适用于 AIX Version 5.3)和 nmon 都可以监视异步 I/O 服务器的使用率。在 AIX Version 5.3 之前,确定该信息的唯一方法是使用 nmon
命令。确定您的系统中所配置的异步 I/O(遗留)服务器数量的标准命令是:
pstat -a | egrep ' aioserver' | wc -l |
iostat -A
命令可以报告异步 I/O 统计数据(请参见清单 1)。
# iostat -A System configuration: lcpu=2 drives=3 ent=0.60 paths=4 vdisks=4 aio: avgc avfc maxgc maxfc maxreqs avg-cpu: % user % sys % idle % iowait physc % entc 0 0 32 0 4096 6.4 8.0 85.4 0.2 0.1 16.0 Disks: % tm_ act Kbps tps Kb_read Kb_wrtn hdisk0 0.5 2.0 0.5 0 4 hdisk1 1.0 5.9 1.5 8 4 hdisk2 0.0 0.0 0.0 0 0 |
所有这些内容究竟表示什么呢?
您究竟应该配置多大呢?根据经验,可以将服务器的最大数目设置为磁盘数量的十倍或者处理器数量的十倍。可以将 MinServers
设置为这个数量的一半。除了使得更多的、几乎不怎么使用的(使用少量的内核内存)内核进程挂起之外,将 MaxServers
设置得过大,实际上并没有什么风险,所以不用担心提高这个值。如何完成这项任务呢?您可以使用 chdev
命令或者 smit fastpath
命令:
# smit aio (or smit posixaio) |
这也是您在系统中启用异步 I/O 的方法。
要从命令行将 maxservers 设置为 100,可以使用这个命令:
# chdev -l aio0 -a maxservers=100 |
请注意,在这项更改生效之前,您必须重新启动。有时候,我会被问及 aio
和 posixaio
之间的区别。这两者之间的主要区别是传递不同的参数,所以您的确需要同时配置它们。
最后一个概念是 I/O 处理速率调整。这是一项 AIX 的特性,它可以防止使用大量磁盘 I/O 的应用程序使得 CPU 和磁盘超载。正确地使用磁盘 I/O 处理速率调整,可以帮助防止生成大量输出的程序使系统的 I/O 饱和,并导致系统性能降低。优化 maxpout 和 minpout 可以帮助防止对文件执行顺序写入操作的线程占用过多的系统资源。
通过显式地将 minput 和 maxpout 设置为 0 并装入文件系统,您还可以限制设置全局参数的效果:
# mount -o minpout=0,maxpout=0 /u |
这个部分对可用于监视磁盘 I/O 活动的 AIX 特定工具(sar、topas 和 nmon)提供了概述。这些工具都允许您快速地进行故障排除,并获取相关的数据以便进行历史趋势研究和分析。
别期望在这一部分中看到 iostat,因为 iostat 是一种允许您快速确定物理磁盘和适配器之间是否存在不平衡的 I/O 负载的 UNIX 实用工具。除非您决定使用 iostat 编写自己的脚本工具,否则它无法帮助您分析长期的趋势和捕获数据。
sar 是较早的通用 UNIX 工具之一,而这些工具已经经过了多年的改进。尽管我通常喜欢使用更特定的 AIX 工具,如 topas 或者 nmon,但是 sar 提供了关于磁盘 I/O 的详细信息。让我们运行一个典型的 sar
命令以检查 I/O 活动(请参见 清单 2)。
# sar -d 1 2 AIX newdev 3 5 06/04/07 System Configuration: lcpu=4 disk=5 07:11:16 device %busy avque r+w/s blks/s avwait avserv 07:11:17 hdisk1 0 0.0 0 0 0.0 0.0 hdisk0 29 0.0 129 85 0.0 0.0 hdisk3 0 0.0 0 0 0.0 0.0 hdisk2 0 0.0 0 0 0.0 0.0 cd0 0 0.0 0 0 0.0 0.0 07:11:18 hdisk1 0 0.0 0 0 0.0 0.0 hdisk0 35 0.0 216 130 0.0 0.0 hdisk3 0 0.0 0 0 0.0 0.0 hdisk2 0 0.0 0 0 0.0 0.0 cd0 0 0.0 0 0 0.0 0.0 Average hdisk1 0 0.0 0 0 0.0 0.0 hdisk0 32 0.0 177 94 0.0 0.0 hdisk3 0 0.0 0 0 0.0 0.0 hdisk2 0 0.0 0 0 0.0 0.0 cd0 0 0.0 0 0 0.0 0.0 |
让我们来仔细研究清单 2 中的列标题。
您需要谨防出现任何磁盘的使用率接近百分之百,或者大量的队列请求等待磁盘的情况。尽管 sar 的输出表示存在某种活动,但实际上并没有什么 I/O 问题,因为不存在等待 I/O 的情况。您需要继续监视该系统以确保同时使用了 hdisk0 之外的其他磁盘。sar 不同于 iostat 的地方在于,它能够通过它的系统活动数据收集 (sadc) 实用工具,捕获数据以便进行长期的分析和趋势研究。通常在 cron 中并没有开启这种实用工具,而它允许您捕获数据进行历史趋势研究和分析。下面介绍一下它的工作方式。在 AIX 系统中,缺省情况下通常有两个 Shell 脚本被注释掉了(/usr/lib/sa/sa1 和 /usr/lib/sa/sa2),它们提供了有关系统活动的每天的报告。sar
命令实际上调用了 sadc 例程以访问系统数据(请参见清单 3)。
# crontab -l | grep sa1 0 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 & 0 * * * 0,6 /usr/lib/sa/sa1 & 0 18-7 * * 1-5 /usr/lib/sa/sa1 & |
有没有对用户来说更加友好的工具呢?您指的是 topas 吧!topas 是一种非常优秀的性能监视工具,您可以将其用于各种不同的目的,包括(但是不限于)您的磁盘 I/O 子系统。
下面从磁盘的角度来研究 topas 的输出。其中并没有发生什么 I/O 活动。除了物理磁盘之外,请仔细观察“Wait”(在 CPU 部分的上部),它也可以帮助确定系统是不是 I/O 绑定的。如果您在此处看到较高的数值,那么您可以使用其他工具,如 filemon、fileplace、lsof 或 lslv,以帮助您确定究竟是哪个进程、适配器或者文件系统导致了瓶颈。当您希望获得比使用 iostat 更多的信息时,那么可以使用 topas,它适合于对一个问题进行快速故障诊断。从某种意义而言,topas 是 iostat 和 vmstat 的图形混合版,经过最近的改进,它现在支持捕获数据以进行历史分析。这些改进是在 AIX Version 5.3 中完成的,毫无疑问,因为 IBM 的开发人员也创建了一种类似的、非常流行的工具,所以 IBM 并没有为这个工具提供正式的支持。
这就是 nmon(我最喜欢的 AIX 性能工具)。尽管 nmon 提供了类似于 topas 的前端,但是它更适合于长期趋势研究和分析。而且,它使得系统管理员能够将数据输出到包含非常漂亮的图表(为高级管理和职能团队进行了修改)的 Excel 电子表格,其中清楚地说明了您的瓶颈所在。这些工作可以通过一个称为 nmon 分析程序的工具来完成,它提供了到 nmon 的挂钩。关于磁盘 I/O,nmon 可以报告下面的数据:磁盘 I/O 速度、数据传输、读/写比例,以及磁盘适配器统计信息。
下面提供了一个小的示例,其中 nmon 确实发挥了它的作用。假设您希望了解哪些进程占用了大多数磁盘 I/O,并且您希望能够将其与实际磁盘关联起来,以便清楚地显示每个进程的 I/O。可以使用 nmon 获得详细信息,然后使用任何其他工具。要使用 nmon 完成这项任务,可以使用 -t
选项;设置时间,然后按 I/O 通道进行排序。您如何使用 nmon 来捕获数据,并将其导入到该分析程序呢?
使用 sudo
命令,并让 nmon 运行 3 个小时,每 30 秒钟进行一次快照:
# sudo nmon -f -t -r test1 -s 30 -c 180 |
然后,对所创建的输出文件进行排序:
# sort -A testsystem_yymmdd.nmon > testsystem_yymmdd.csv |
在完成了该任务之后,将这个 .csv 文件通过 ftp 上传到您的 PC,启动 nmon 分析程序电子表格(启用宏),并且单击 analyze nmon data。您可以从这里下载 nmon 分析程序。
图 3 是从一个 AIX 5.3 系统中获取的屏幕截图,它为每个磁盘的读写提供了磁盘汇总信息,单位是千字节每秒。
nmon 还可以帮助跟踪异步 I/O 服务器的配置,如清单 4 中的输出所示。
lsattr -El aio0 lsattr -El aio0 autoconfig available STATE to be configured at system restart True lsattr -El aio0 fastpath enable State of fast path True lsattr -El aio0 kprocprio 39 Server PRIORITY True lsattr -El aio0 maxreqs 16384 Maximum number of REQUESTS True lsattr -El aio0 maxservers 100 MAXIMUM number of servers per cpu True lsattr -El aio0 minservers 50 MINIMUM number of servers True |
在 AIX Version 5.3 之前,nmon 是唯一用于显示所配置的异步 I/O 服务器的数量,以及实际使用量的工具。正如前面的部分所述,最近对 iostat 进行了增强,使它也提供了这种功能。
本文介绍了磁盘 I/O 子系统的相对重要性。本文定义并介绍了 AIX I/O 栈,以及它与物理和逻辑磁盘 I/O 之间的关系。本文还介绍了在数据库环境中进行磁盘配置的一些最佳实践,研究了直接和并发 I/O 之间的区别,还介绍了异步 I/O 和 I/O 处理速率调整。您优化了异步 I/O 服务器,并配置了 I/O 处理速率调整。您从并发 I/O 模式的文件系统开始,研究了何时最适合实现并发 I/O。而且,您了解了关于 iostat,以及使用 sar、topas 和 nmonn 捕获数据的所有内容。您还研究了输出的不同类型,了解了许多在 sar 和 iostat 中使用的标志。本系列文章的第 2 部分将深入研究 AIX I/O 栈中的逻辑卷管理器层,并介绍一些快照类型的工具,它们可以帮助您快速地访问磁盘 I/O 子系统的状态。第 3 部分主要关注于使用各种工具跟踪 I/O 使用情况,如 filemon 和 fileplace,以及如何提高文件系统性能整体