分类:
2009-09-06 19:35:35
本系列文章的第 1 部分和第 2 部分讨论了设计系统体系结构的重要性,它对整体系统性能所产生的影响,以及一个新的 I/O 优化工具 lvmo,您可以使用该工具对逻辑卷进行优化。在这个部分中,将研究如何使用 ioo
命令优化您的系统,该命令可以对大多数 I/O 优化参数进行配置,并显示所有 I/O 优化参数当前或者下一次的启动值。同时,还将介绍如何以及何时使用 filemon 和 fileplace 工具(这些特定的 AIX 工具应该是您的技能库中重要的部分)、如何提高您的整体文件系统性能、如何优化您的文件系统,以及增强的日志记录文件系统 (JFS2) 与日志记录文件系统 (JFS) 相比有什么不同。您甚至还将研究一些文件系统属性,如顺序访问和随机访问,它们都可能对性能产生影响。
这个部分将讨论 JFS2、文件系统性能,以及对 JFS 所做的特定性能改进。正如您所知道的,在 AIX 中有两种类型的内核。它们分别是 32 位内核和 64 位内核。尽管它们之间共享了一些常用的库、大多数的命令及实用工具,但了解它们之间的区别以及内核与整体性能优化之间的关系,这一点是非常重要的。JFS2 为 64 位内核进行了优化,而 JFS 则为 32 位内核进行了优化。日记记录的文件系统可以提供更高的安全性,但在以前,往往会带来性能方面的开销。在选择相关的性能规则(以牺牲可用性为代价)时,为了使 JFS 提高性能,您可能会禁用元数据日志记录功能。就 JFS2 而言,这种情况不再可能发生,甚至不再需要,因为已经对它进行了优化,以便更加高效地处理元数据密集型的应用程序。更重要的一点是,JFS2 的关键优势在于其扩展能力。使用 JFS,单个文件最大不能超过 64GB。而使用 JFS2,您可以拥有一个 16TB 的文件。另一个重大变化是目录组织方式的更改。增强的 JFS2 在执行索引节点搜索的时候使用二叉树的表示形式,与 JFS 使用的线性方法相比,这种方法要好得多。而且,在创建文件系统的时候您不再需要分配索引节点,因为现在它们是由 JFS2 动态分配的,这意味着将不会耗尽索引节点。尽管在本系列文章的第 1 部分中已经介绍了并发 I/O(请参见参考资料),但在这里有必要再次提及这个内容。并发 I/O 的实现允许多个线程并发地对同一个文件进行读写数据的操作。这是由于在实现 JFS2 时采用了写操作排它索引节点锁的方式。这种方式允许多个用户同时对同一个文件进行读操作,当多个用户从相同的数据文件中进行读操作时,这种方式能够显著地提高性能。要打开并发 I/O,您只需要使用合适的标志装入 f/s(请参见清单 1)。我建议您在使用数据库(如 Oracle)的时候考虑使用并发 I/O 这个功能。
root@lpar29p682e_pub[/] mount -o cio /test root@lpar29p682e_pub[/] > df -k /test Filesystem 1024-blocks Free %Used Iused %Iused Mounted on /dev/fslv00 131072 130724 1% 4 1% /test |
表 1 说明了 JFS2 的各种增强功能,以及它们与系统性能之间的关系。在优化您的 I/O 系统时,许多可调整的参数自身(稍后将深入研究这个问题)也存在差别,这取决于您正在使用的是 JFS 还是 JFS2,了解这一点同样也非常重要。
功能 | JFS | JFS2 |
---|---|---|
压缩 | 是 | 否 |
配额 | 是 | 是 |
延迟的更新 | 是 | 否 |
直接 I/O 支持 | 是 | 是 |
优化 | 32 位 | 64 位 |
最大文件系统大小 | 1 TB | 4 PB |
最大文件大小 | 64 GB | 4 PB |
索引节点的数目 | 在创建 f/s 时确定 | 动态的 |
大文件支持 | 作为装入选项 | 缺省 |
联机碎片整理 | 是 | 是 |
Namefs | 是 | 是 |
DMAPI | 否 | 是 |
这个部分将介绍两个重要的 I/O 工具,filemon 和 fileplace,并讨论如何在日常系统管理工作中使用它们。
filemon 使用了一种跟踪工具来报告物理和逻辑存储(包括您的实际文件)的 I/O 活动。根据在运行跟踪工具时指定的时间间隔,对 I/O 活动进行监视。它将报告所有文件系统层次的使用率,包括逻辑卷管理器 (LVM)、虚拟内存和物理磁盘层。如果不使用任何标志,那么当要进行监视的应用程序或者系统命令运行时,它将在后台运行。跟踪工作将自动启动,直到停止该命令为止。此时,命令将生成 I/O 活动报告,然后退出。它还可以处理由跟踪工具所记录的跟踪文件。然后,可以由该文件生成报告。因为对标准输出生成的报告通常会在您的屏幕中一滚而过,所以我们建议您使用 -o
选项,以便将该输出写入到一个文件(请参见清单 2)。
root@lpar29p682e_pub[/] > filemon -o dbmon.out -O all Run trcstop command to signal end of trace. Sun Aug 19 17:47:34 2007 System: AIX 5.3 Node: lpar29p682e_pub Machine: 00CED82E4C00 root@lpar29p682e_pub[/] > trcstop [filemon: Reporting started] root@lpar29p682e_pub[/] > [filemon: Reporting completed] [filemon: 73.906 secs in measured interval] root@lpar29p682e_pub[/] > When we look at our file, here is what we see: Sun Aug 19 17:50:45 2007 System: AIX 5.3 Node: lpar29p682e_pub Machine: 00CED82E4C00 Cpu utilization: 68.2% Cpu allocation: 77.1% 130582780 events were lost. Reported data may have inconsistencies or errors. Most Active Files ------------------------------------------------------------------------ #MBs #opns #rds #wrs file volume:inode ------------------------------------------------------------------------ 0.3 1 70 0 unix /dev/hd2:38608 0.0 9 11 0 vfs /dev/hd4:949 0.0 2 4 0 ksh.cat /dev/hd2:58491 Most Active Segments ------------------------------------------------------------------------ #MBs #rpgs #wpgs segid segtype volume:inode ------------------------------------------------------------------------ 0.6 0 162 223b9 client Most Active Logical Volumes ------------------------------------------------------------------------ util #rblk #wblk KB/s volume description ------------------------------------------------------------------------ 0.25 0 120 0.2 /dev/hd8 jfs2log 0.00 0 1304 2.7 /dev/hd4 / ------------------------------------------------------------------------ Detailed File Stats ------------------------------------------------------------------------ FILE: /unix volume: /dev/hd2 inode: 38608 opens: 1 total bytes xfrd: 286720 reads: 70 (0 errs) read sizes (bytes): avg 4096.0 min 4096 max 4096 sdev 0.0 read times (msec): avg 0.003 min 0.002 max 0.005 sdev 0.001 lseeks: 130 ------------------------------------------------------------------------ Detailed VM Segment Stats (4096 byte pages) ------------------------------------------------------------------------ SEGMENT: 223b9 segtype: client segment flags: clnt writes: 162 (0 errs) write times (msec): avg 1.317 min 0.369 max 1.488 sdev 0.219 write sequences: 5 write seq. lengths: avg 32.4 min 1 max 64 sdev 20.8 ------------------------------------------------------------------------ Detailed Logical Volume Stats (512 byte blocks) ------------------------------------------------------------------------ VOLUME: /dev/hd8 description: jfs2log writes: 15 (0 errs) write sizes (blks): avg 8.0 min 8 max 8 sdev 0.0 write times (msec): avg 0.389 min 0.287 max 1.277 sdev 0.250 write sequences: 11 write seq. lengths: avg 10.9 min 8 max 24 sdev 5.1 seeks: 11 (73.3%) Detailed Physical Volume Stats (512 byte blocks) ------------------------------------------------------------------------ VOLUME: /dev/hdisk0 description: Virtual SCSI Disk Drive writes: 33 (0 errs) write sizes (blks): avg 45.3 min 8 max 256 sdev 82.7 write times (msec): avg 0.544 min 0.267 max 1.378 sdev 0.370 write sequences: 26 write seq. lengths: avg 57.5 min 8 max 512 sdev 122.6 seeks: 26 (78.8%) seek dist (blks): init 17091584, avg 913560.3 min 8 max 3940256 sdev 1431025.7 seek dist (%tot blks):init 40.74951, avg 2.17810 min 0.00002 max 9.39430 sdev 3.41183 time to next req(msec): avg 6369.624 min 0.051 max 120046.794 sdev 23589.450 throughput: 3.1 KB/sec utilization: 0.00 |
您可以在输出结果中查找较长的寻道时间,因为它们可能会导致应用程序性能降低。通过仔细地观察读写序列的计数,您可以更深入地确定该访问是顺序访问还是随机访问。当进行 I/O 优化的时候,该信息可以为您提供帮助。该输出清楚地说明了这里不存在任何 I/O 瓶颈。filemon 可以提供大量的信息,事实上,我常常发现它所提供的信息太多了。而且,在使用 filemon 时可能带来很大的性能损失。让我们来看一下,在运行 filemon(请参见图 1)时,topaz 的结果。
在这个示例中,filemon 几乎占据了 96% 的 CPU!通常,我不推荐使用带来如此巨大开销的性能工具,所以我要重申一下,尽管 filemon 的确有其用武之处,但您在使用它的时候仍需非常小心。
fileplace 又如何呢?fileplace 可以报告文件块在文件系统中的位置。它通常用于检查和评估文件在磁盘中的放置位置的效率。为什么要使用它呢?其中一个原因是,它可以帮助您确定对于一些经常使用的文件,是否存在大量的碎片。它还可以帮助您确定最高使用率的物理卷,确定驱动器或者 I/O 适配器是否导致了瓶颈的发生。
让我们来看看清单 3 中的示例,这是一个频繁访问的文件。
root@lpar29p682e_pub[/] > fileplace -pv dbfile File: dbfile Size: 5374622 bytes Vol: /dev/hd4 Blk Size: 4096 Frag Size: 4096 Nfrags: 1313 Inode: 21 Mode: -rw-r--r-- Owner: root Group: system Physical Addresses (mirror copy 1) Logical Extent ---------------------------------- ---------------- 02134816-02134943 hdisk0 128 frags 524288 Bytes, 9.7% 00004352-00004479 02135680-02136864 hdisk0 1185 frags 4853760 Bytes, 90.3% 00005216-00006400 1313 frags over space of 2049 frags: space efficiency = 64.1% 2 extents out of 1313 possible: sequentiality = 99.9% |
此时,您应该关注空间效率 (space efficiency) 和顺序性 (sequentiality)。较高的空间效率意味着文件出现较少的碎片,并且提供更好的顺序文件访问。较高的顺序性意味着文件的分配具有更高的连续性,当然这对于顺序文件访问更加有利。在这个示例中,当顺序性很高的时候,空间效率将会更好。如果空间效率和顺序性都很低,那么您可能会希望重组该文件系统。您可以使用 reorgvg
命令来进行重组,该命令可以提高逻辑卷的使用率和效率。
这个部分将讨论 ioo
命令的使用,该命令适用于几乎所有与 I/O 相关的优化参数。
与 vmo
一样,您在更改 ioo
参数时需要格外小心,因为动态更改参数可能导致严重的性能降低。表 2 详细说明了一些特定的优化参数,通常用于 JFS 文件系统。正如您可以清楚看到的,大部分 I/O 优化命令都利用了 ioo
实用工具。
功能 | JFS 优化参数 | 增强的 JFS 优化参数 |
---|---|---|
设置缓存文件的最大内存容量 | vmo -o maxperm=value |
vmo -o maxclient=value (< 或者 = maxperm) |
设置缓存的最小内存容量 | vmo -o minperm=value |
不适用 |
设置缓存的内存限制(硬限制) | vmo -o strict_maxperm |
vmo -o maxclient (硬限制) |
设置用于提前顺序读取的最大页面数 | ioo -o maxpgahead=value |
ioo -o j2_maxPageReadAhead=value |
设置用于提前顺序读取的最小页面数 | ioo -o minpgahead |
ioo -o j2_minPageReadAhead=value |
设置对一个文件的挂起写 I/O 的最大数目 | chhdev -l sys0 -a maxpout maxpout |
chdev -l sys0 -a maxpout maxpout |
设置对一个文件的挂起写 I/O 的最小数目,在此情况下,由 maxpout 阻塞的程序可以继续 | chdev -l sys0 -a minpout minpout |
chdev -l sys0 -a minpout minpout |
使用随机写操作为文件设置修改数据缓存的容量 | ioo -o maxrandwrt=value |
ioo -o j2_maxRandomWrite ioo -o j2_nRandomCluster |
为延迟的顺序写操作控制 I/O 的收集 | ioo -o numclust=value |
ioo -o j2_nPagesPerWriteBehindCluster=value |
设置 f/s bufstruct 的数目 | ioo -o numfsbufs=value |
ioo -o j2_nBufferPerPagerDevice=value |
让我们深入地讨论下面一些更重要的参数,之前我已经在内存优化系列文章(请参见参考资料)中介绍过所有的 vmo
优化参数。
您可以使用几种不同的方式来确定系统中现有的 ioo
值。ioo
的很长的显示清单,清楚地提供了大部分信息(请参见清单 4)。它列出了当前值、重新启动值、范围、单位、类型和由 ioo
管理的所有可调整参数的依赖关系。
root@lpar29p682e_pub[/] > ioo -L NAME CUR DEF BOOT MIN MAX UNIT TYPE DEPENDENCIES j2_atimeUpdateSymlink 0 0 0 0 1 boolean D j2_dynamicBufferPreallo 16 16 16 0 256 16K slabs D j2_inodeCacheSize 400 400 400 1 1000 D j2_maxPageReadAhead 128 128 128 0 64K 4KB pages D j2_maxRandomWrite 0 0 0 0 64K 4KB pages D j2_maxUsableMaxTransfer 512 512 512 1 4K pages M j2_metadataCacheSize 400 400 400 1 1000 D j2_minPageReadAhead 2 2 2 0 64K 4KB pages D j2_nBufferPerPagerDevice 512 512 512 512 256K M j2_nPagesPerWriteBehindC 32 32 32 0 64K D j2_nRandomCluster 0 0 0 0 64K 16KB clusters D j2_nonFatalCrashesSystem 0 0 0 0 1 boolean D j2_syncModifiedMapped 1 1 1 0 1 boolean D j2_syncdLogSyncInterval 1 1 1 0 4K iterations D jfs_clread_enabled 0 0 0 0 1 boolean D jfs_use_read_lock 1 1 1 0 1 boolean D lvm_bufcnt 9 9 9 1 64 128KB/buffer D maxpgahead minpgahead 8 8 8 0 4K 4KB pages D maxrandwrt 0 0 0 0 512K 4KB pages D memory_frames 512K 512K 4KB pages S Minpgahead maxpgahead 2 2 2 0 4K 4KB pages D numclust 1 1 1 0 2G-1 16KB/cluster D numfsbufs 196 196 196 1 2G-1 M pd_npages 64K 64K 64K 1 512K 4KB pages D pgahd_scale_thresh 0 0 0 0 419430 4KB pages D pv_min_pbuf 512 512 512 512 2G-1 D sync_release_ilock 0 0 0 0 1 boolean D n/a means parameter not supported by the current platform or kernel Parameter types: S = Static: cannot be changed D = Dynamic: can be freely changed B = Bosboot: can only be changed using bosboot and reboot R = Reboot: can only be changed during reboot C = Connect: changes are only effective for future socket connections M = Mount: changes are only effective for future mountings I = Incremental: can only be incremented d = deprecated: deprecated and cannot be changed |
清单 5 向您显示了如何更改一个可调整的参数。
root@lpar29p682e_pub[/] > ioo -o maxpgahead=32 Setting maxpgahead to 32 root@lpar29p682e_pub[/] > |
这个参数仅用于 JFS。接下来的部分将适用于 JFS2。
一些重要的、JFS2 特定的文件系统的性能增强功能包括,提前顺序页面读取和延迟顺序、随机写入。通过观察文件的访问模式,AIX 的虚拟内存管理器(Virtual Memory Manager,VMM)可以预测页面需求。当程序访问一个文件的两个页面时,VMM 假定该程序将采用顺序的方法不断地尝试访问该文件。可以使用 VMM 阈值来配置将要提前读取的页面数目。对于 JFS2,记录下面这两个重要参数:
J2_minPageReadAhead
:这个参数用于确定当 VMM 最初检测到顺序模式时提前读取的页面数目。
J2_maxPageReadAhead
:这个参数用于确定 VMM 可以在一个顺序文件中读取页面的最大数量。 延迟的顺序和随机写操作,与将内存中经过修改的页面写入到磁盘的操作(达到某个阈值之后)相关。采用这种方式,它无需等待 syncd
将页面写入到磁盘。这是因为限制了内存中“脏”页面的数量,从而进一步地降低了 I/O 开销和磁盘碎片。延迟的写操作有两类,顺序写入和随机写入。使用延迟的顺序写操作,页面并不保存在内存中,直到 syncd
守护进程运行,这可能会导致实际的瓶颈。使用延迟的随机写操作,当内存中的页面数量超过指定的数量,则将所有后续的页面写入到磁盘。另一个值得一提的重要领域是大量的顺序 I/O 处理。当对您的文件系统同时进行大量 I/O 操作的时候,可能会在 f/s 级出现 I/O 瓶颈。在这种情况下,您应该增大 j2_nBufferPerPagerDevice
参数(如果是使用 JFS 的话,那就是 numfsbus 参数)。如果您使用的是原始 I/O 而不是文件系统,那么相同类型的瓶颈可能通过 LVM 出现。而这正是您可能希望优化 lvm_bufcnt
参数的地方。
本文重点关注于文件系统的性能。您研究了 JFS2 中的各种增强功能,以及为什么将其作为首选的文件系统。而且,您使用了一些相关的工具,如 filemon 和 fileplace,以收集更多关于实际文件结构、它们与 I/O 性能之间关系的详细信息。最后,您使用 ioo
命令优化了您的 I/O 子系统。您了解了 J2_minPageReadAhead
和 J2_maxPageReadAhead
参数,它们可以在碰到顺序 I/O 的情况下用于提高性能。
本系列共有三篇关于 I/O 的文章,在您学习本系列期间,也许比在任何其他子系统中学习到了更多的内容,您必须在对系统进行压力测试之前开始进行优化。与使用优化 I/O 参数进行各种工作相比,正确地设计系统体系结构,可以更好地提高性能。这包括策略性磁盘位置,并确保您拥有足够多的适配器以处理磁盘的吞吐量。而且,尽管本系列文章重点关注于 I/O,但也说明了 VMM 与 I/O 性能紧密相连,并且必须对其进行相应的优化,以实现最佳的 I/O 性能。