Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3335933
  • 博文数量: 631
  • 博客积分: 10716
  • 博客等级: 上将
  • 技术积分: 8397
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 22:35
文章分类

全部博文(631)

文章存档

2020年(2)

2019年(22)

2018年(4)

2017年(37)

2016年(22)

2015年(1)

2013年(12)

2012年(20)

2011年(19)

2010年(20)

2009年(282)

2008年(190)

分类:

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 时 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_minPageReadAheadJ2_maxPageReadAhead 参数,它们可以在碰到顺序 I/O 的情况下用于提高性能。

本系列共有三篇关于 I/O 的文章,在您学习本系列期间,也许比在任何其他子系统中学习到了更多的内容,您必须在对系统进行压力测试之前开始进行优化。与使用优化 I/O 参数进行各种工作相比,正确地设计系统体系结构,可以更好地提高性能。这包括策略性磁盘位置,并确保您拥有足够多的适配器以处理磁盘的吞吐量。而且,尽管本系列文章重点关注于 I/O,但也说明了 VMM 与 I/O 性能紧密相连,并且必须对其进行相应的优化,以实现最佳的 I/O 性能。

阅读(1375) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~