分类:
2009-09-06 19:34:31
本系列文章的第 1 部分(请参见参考资料)介绍了 iostat
,但其中仅介绍了使用该工具来查看异步 I/O 服务器。第 2 部分使用 iostat 来监视您的磁盘,并向您介绍了它能够完成哪些工作以帮助您快速地确定 I/O 瓶颈。尽管 iostat
是通用的 UNIX® 实用工具之一,并且它不是专门为 AIX 而开发的,但实际上,对于快速地确定系统的运行情况,它是非常有用的。更特定的 AIX 逻辑卷命令可以帮助您更深入地研究逻辑卷,以帮助您真正地分析实际问题(如果存在任何问题)。在使用这些工具之前,您必须清楚地了解您需要哪些信息,这一点是很重要的。本文描述了相关的工具,并向您介绍了如何分析它们的输出,这将帮助您分析磁盘 I/O 子系统。
这个部分定义了逻辑卷管理器(Logical Volume Manager,LVM),并介绍了它的一些特性。让我们深入地研究逻辑卷的概念,分析它们与提高磁盘 I/O 使用率之间的关系,并通过定义和讨论 intra-policy 和 inter-policy 磁盘实践,从物理磁盘的角度介绍有关逻辑卷的布置。
从概念上讲,逻辑卷层位于应用程序和物理层之间。在磁盘 I/O 的上下文中,应用程序层是文件系统或者原始逻辑卷。物理层由实际的磁盘组成。LVM 是一种 AIX 磁盘管理系统,它可以在逻辑和物理存储之间映射数据。这允许数据保存在多个物理盘片上,并使用专门的 LVM 命令对其进行管理和分析。实际上,LVM 控制系统中所有的物理磁盘资源,并帮助提供存储子系统的逻辑视图。了解它位于应用程序层和物理层之间,应该可以帮助您理解它为什么很可能是所有层中最重要的一层。甚至您的物理卷本身就是逻辑层的一部分,因为物理层仅包含实际的磁盘、设备驱动程序和任何您可能已经配置的阵列。图 1 阐释了这个概念,并显示了逻辑 I/O 组件与物理磁盘及其应用程序层非常紧密地结合在一起。
现在,让我们简要地、自底向上地介绍 LVM 中的各个元素。每个驱动器作为一个物理卷进行命名。多个物理卷组成一个卷组。在卷组中,定义了逻辑卷。LVM 允许数据位于多个物理驱动器,尽管可能将它们配置为属于单个卷组。这些逻辑卷可以是一个或者多个逻辑分区。每个逻辑分区具有一个与其相关联的物理分区。在其中,您可以拥有物理部分的多个副本,以用于各种目的,如磁盘镜像。
让我们简要地介绍一下逻辑卷的创建与物理卷之间的关系。图 2 描述了物理磁盘盘片上的实际存储位置。
作为一般规则,靠近中央的数据要比靠近外边缘的数据具有更快的寻道时间。这与数据的密度有关。因为越靠近中央,密度越大,实际上磁头只需移动更短的距离。内部边缘(inner edge)通常具有最短的寻道时间。作为最佳实践,应用程序使用 I/O 越多,就应该使其位于越靠近物理卷中央的位置。请注意,对于这个最佳实践,有一些例外的情况。磁盘边缘的每个磁道比靠近中央的磁道能够保存更多的数据。虽然这样说,但是实际上应该顺序地访问位于边缘的逻辑卷,以获得更高的性能。对于开启了镜像写一致性检查(Mirror Write Consistency Check,MWCC)的逻辑卷来说也一样。这是因为,MWCC 扇区位于磁盘边缘而不是中央,这与逻辑卷的 intra-disk 策略有关。
让我们来讨论另一个重要的、称为逻辑卷 inter-disk 策略的概念。inter-disk 策略定义了一个逻辑卷的物理分区实际驻留的磁盘的数目。一般规则是,最小的 (minimum) 策略可以提供最大的可靠性和可用性,而最大的 (maximum) 策略可以提高性能。简单地说,数据所分散到的驱动器越多,性能就越好。一些其他的最佳实践包括:分配密集的逻辑卷以分隔物理卷,定义所需的逻辑卷的最大大小,并将经常使用的逻辑卷布置在一起。这正是为什么在配置系统之前您必须了解具体的数据,以便您从一开始就可以创建有意义的策略的原因。
在创建逻辑卷时,您可以使用下面命令或者 smit 快速路径定义自己的策略:# mklv
或 # smitty mklv
。
这个部分提供了有关如何监视您的逻辑卷并分析结果的介绍。介绍了各种各样的命令以及它们的用途,并且您还将检查输出内容。
刚刚接到了有关某个数据库服务器性能迟缓的报告。您怀疑可能出现了 I/O 问题,所以您使用 iostat
开始进行分析。如果您还记得,在本系列文章的第 1 部分中曾介绍过这个命令(请参见参考资料),尽管只是用作查看异步 I/O 服务器的目的。现在,让我们仔细地研究 iostat
。iostat
,相当于用于虚拟内存的 vmstat
,很可能是概略了解 I/O 子系统运行情况的最有效方式。
# iostat 1 System configuration: lcpu=4 disk=4 tty: tin tout avg-cpu: % user % sys % idle % iowait 0.0 392.0 5.2 5.5 88.3 1.1 Disks: % tm_act Kbps tps Kb_read Kb_wrtn hdisk1 0.5 19.5 1.4 53437739 21482563 hdisk0 0.7 29.7 3.0 93086751 21482563 hdisk4 1.7 278.2 6.2 238584732 832883320 hdisk3 2.1 294.3 8.0 300653060 832883320 |
这个示例中显示了哪些内容,而所有这些内容又是什么含义呢?
您需要非常小心地监视 % tm_act,因为当它的使用率超过大概百分之六十到七十时,这通常表示进程开始等待 I/O。这可能是即将发生的 I/O 问题的第一个征兆。将数据移动到更空闲的驱动器可以显著地帮助缓解这个负担。通常来说,您的数据位于越多的驱动器,性能就越好。与其他的事物一样,物极必反,因为您必须确保不会有太多的驱动器连接到任何一个适配器。有一种方法可以确定一个适配器是否满负荷,将连接到该适配器的所有磁盘的 Kbps 量累加起来。其总数应该小于磁盘适配器吞吐量速率,通常小于百分之七十。
使用 -a
标志(请参见清单 2)可以帮助您更深入地检查适配器的使用率。
# iostat -a Adapter: Kbps tps Kb_read Kb_wrtn scsi0 0.0 0.0 0 0 Paths/Disk: % tm_act Kbps tps Kb_read Kb_wrtn hdisk1_Path0 37.0 89.0 0.0 0 0 hdisk0_Path0 67.0 47.0 0.0 0 0 hdisk4_Path0 0.0 0.0 0.0 0 0 hdisk3_Path0 0.0 0.0 0.0 0 0 Adapter: Kbps tps Kb_read Kb_wrtn ide0 0.0 0.0 0 0 Paths/Disk: % tm_act Kbps tps Kb_read Kb_wrtn cd0 0.0 0.0 0.0 0 0 |
显然,其中不存在任何瓶颈。使用 -d
标志允许您深入地研究一个特定的磁盘(请参见清单 3)。
# iostat -d hdisk1 1 System configuration: lcpu=4 disk=5 Disks: % tm_act Kbps tps Kb_read Kb_wrtn hdisk1 0.5 19.4 1.4 53437743 21490480 hdisk1 5.0 78.0 23.6 3633 3564 hdisk1 0.0 0.0 0.0 0 0 hdisk1 0.0 0.0 0.0 0 0 hdisk1 0.0 0.0 0.0 0 0 hdisk1 0.0 0.0 0.0 0 0 |
让我们来研究一些特定的 AIX LVM 命令。您已经了解了有关磁盘布置的内容,以及从一开始就正确地设计系统体系结构的重要性。不幸的是,您并不总是能够使用这种方法。作为系统管理员,您有时可能会接手一些必须进行修复的系统。让我们研究一下磁盘上逻辑卷的布局,以确定您是否需要更改定义或者重新组织您的数据。
让我们首先了解一下卷组,并查找作为其中的一部分的逻辑卷。lsvg
命令可以提供卷组信息(请参见清单 4)。
# lsvg -l data2vg Data2vg: LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT data2lv jfs 128 256 2 open/syncd /data2 loglv00 jfslog 1 2 2 open/syncd N/A appdatalv jfs 128 256 2 open/syncd /appdata |
现在,让我们使用 lslv
,它可以提供关于逻辑卷的特定数据(请参见清单 5)。
# lslv data2lv LOGICAL VOLUME: data2lv VOLUME GROUP: data2vg LV IDENTIFIER: 0003a0ec00004c00000000fb076f3f41.1 PERMISSION: read/write VG STATE: active/complete LV STATE: opened/syncd TYPE: jfs WRITE VERIFY: off MAX LPs: 512 PP SIZE: 64 megabyte(s) COPIES: 2 SCHED POLICY: parallel LPs: 128 PPs: 256 STALE PPs: 0 BB POLICY: relocatable INTER-POLICY: minimum RELOCATABLE: yes INTRA-POLICY: center UPPER BOUND: 32 MOUNT POINT: /data LABEL: /data MIRROR WRITE CONSISTENCY: on/ACTIVE EACH LP COPY ON A SEPARATE PV ?: yes Serialize IO ?: NO |
这个视图为您的逻辑卷属性提供了详细的描述。这些数据表示了什么含义呢?intra-policy 是 center,它通常是面向使用大量 I/O 的逻辑卷的最佳策略。正如前面的讨论中所介绍的,对于这个规则,有一些例外的情况。不幸的是,您碰到了这些情况之一。因为已经开启了镜像写一致性检查 (MWC),所以如果卷位于边缘,那么应该能够更好地为其提供服务。让我们来研究一下 inter-policy。inter-policy 是 minimum,它通常是面向可用性高于性能的情况的最佳策略。而且,其中逻辑分区的数目是物理分区的两倍,这表示您正在对系统进行镜像。在这个示例中,对于您来说,原始性能是最重要的目标,所以逻辑卷的配置没有采用与如何使用卷的实际情况相关的方式。而且,如果您正在对系统进行镜像,并且使用了外部存储阵列,这种情况可能变得更糟,因为您已经在硬件层提供了镜像,而实际上,这比使用 AIX 镜像的效率更高。
让我们更深入地研究清单 6 中的内容。
# lslv -l data2lv data2lv:/data2 PV COPIES IN BAND DISTRIBUTION hdisk2 128:000:000 100% 000:108:020:000:000 hdisk3 128:000:000 100% 000:108:020:000:000 |
lslv
的 -l
标志列举了与逻辑卷和每个逻辑卷的分布(distribution)相关的所有物理卷。然后,您可以确定已经将磁盘上百分之百的物理分区都分配给了这个逻辑卷。其中的分布(distribution)部分显示了每个物理卷中的实际物理分区数目。从中,您可以详细地了解其 intra-disk 策略。这些字段的顺序如下所示:
该报告显示了,大多数数据位于中间,有些数据位于中央。
让我们继续研究,并找出与一个物理卷相关联的逻辑卷。可以使用 lspv
命令来完成这项任务(请参见清单 7)。
# lspv -l hdisk2 hdisk2: LV NAME LPs PPs DISTRIBUTION MOUNT POINT loglv01 1 1 01..00..00..00..00 N/A data2lv 128 128 00..108..20..00..00 /data2 appdatalv 128 128 00..00..88..40..00 /appdata |
现在,您可以实际地确定这个磁盘上的哪些逻辑卷实现了最大的性能。
您可以进行更深入地研究,以获取更具体的信息(请参见清单 8)。
# lspv -p hdisk2 hdisk2: PP RANGE STATE REGION LV ID TYPE MOUNT POINT 1-108 free outer edge 109-109 used outer edge loglv00 jfslog N/A 110-217 used outer middle data2lv jfs /data2 218-237 used center appdatalv jfs /appdata 238-325 used center testdatalv jfs /testdata 326-365 used inner middle stagingdatalv jfs /staging 366-433 free inner middle 434-542 free inner edge |
这个视图告诉您,该物理卷中哪些是空闲的、哪些已经被使用,以及在什么地方使用了哪些分区。这是一个非常好的视图。
最好的工具之一是,使用 lvmstat
查看 LVM 的使用情况(请参见清单 9)。
# lvmstat -v data2vg 0516-1309 lvmstat: Statistics collection is not enabled for this logical device. Use -e option to enable. |
正如您可以从这个示例的输出中看到的,缺省情况下并没有启用它,所以在使用这个工具之前使用 # lvmstat -v data2vg -e
来启动这个功能。下面的命令可以在 10 个时间间隔内,每秒钟对 LVM 信息进行一次快照:
# lvmstat -v data2vg 1 10 |
这个视图显示了从启动该数据收集工具以来,您的系统中利用率最高的逻辑卷。在优化系统时需要深入地研究逻辑卷层,这时候该视图是非常有价值的(请参见清单 10)。
# lvmstat -v data2vg Logical Volume iocnt Kb_read Kb_wrtn Kbps appdatalv 306653 47493022 383822 103.2 loglv00 34 0 3340 2.8 data2lv 453 234543 234343 89.3 |
您需要在其中查找什么信息呢?
在您将其添加到您的指令库中之前,请查看所有这些命令的 man 页面。
这个部分介绍了使用特定的逻辑卷优化命令。lvmo
用于设置和显示您的 pbuf 优化参数。它还可以用于阻塞 I/O 统计信息。
lvmo
是在 AIX Version 5.3 中首次引入的新的命令之一。请务必注意,使用 lvmo
命令只允许更改那些专门用于特定卷组的 LVM pbuf 可调参数。ioo 实用工具仍然是在系统范围内管理 pbufs 的唯一方法。这是因为,在 AIX Version 5.3 之前,pbuf 池参数是一种系统范围的资源。随着 AIX Version 5.3 的出现,LVM 可以为每个卷组管理一个 pbuf 池。什么是 pbuf?最准确地说,pbuf 是一个固定的内存缓冲区。LVM 使用这些 pbuf 来控制挂起的磁盘 I/O 操作。
让我们显示一下 data2vg 卷组的 lvmo
可调参数(请参见清单 11)。
# lvmo -v data2vg -a vgname = data2vg pv_pbuf_count = 1024 total_vg_pbubs = 1024 mag_vg_pbuf_count = 8192 perv_blocked_io_count = 7455 global_pbuf_count = 1024 global_blocked_io_count = 7455 |
其中哪些是可调参数?
让我们为这个卷组增加 pbuf 计数:
# lvmo -v redvg -o pv_pbuf_count=2048 |
老实说,我通常并不使用 lvmo
,而是使用 ioo
。我更习惯优化全局参数。请务必注意,如果您将这个 pbuf 值设置得太大,将会导致性能降低。
本文重点关注于逻辑卷以及它们与磁盘 I/O 子系统的关系。本文概略地定义了逻辑卷,并说明了它与应用程序和物理层的关系。本文还定义和介绍了 inter-disk 和 intra-disk 策略的一些最佳实践,因为它们与创建和维护逻辑卷有关。您了解了为您的逻辑卷监视 I/O 使用情况的各种方法,并且分析了从用于帮助确定问题的各种命令所捕获的数据。最后,您通过确定和增加特定卷组所使用的 pbufs 量,对您的逻辑卷进行了优化。本系列文章的第 3 部分将在您继续研究文件系统的同时,重点关注于应用程序层,并使用各种命令以监视和优化您的文件系统和磁盘 I/O 子系统。