本文是讲述有关Oracle数据库磁盘输入输出性能和优化的各个不同方面的一系列文章中的一篇。每篇技巧性的文章都摘自即将由Rampant科技出版社出版的图书《Oracle磁盘输入输出性能调优》,作者是Mike Ault。从该系列文章的主页上能看到其他即将发布的部分。
AIX系统下的小型计算机系统接口(SCSI)性能调优
AIX是SCO UNIX的衍生物,如同HP-UX(而Solaris是SRV4 UNIX的衍生物)。尽管如此,AIX早已针对标准SCO发布的UNIX做了很多修改,这点又与HP-UX几乎完全遵照最原始的SCO不同。AIX系统中的小型计算机系统接口(SCSI)有一些可以调整的参数。一般来说,SCSI可以读IBM磁盘,并且针对它进行自动调整。类似的其他磁盘驱动器(即,由非IBM生产商提供的),可能需要手工设置其正确参数。接下来让我们看一下AIX系统下可获得的设置。
设置AIX SCSI适配器和磁盘驱动器队列界限
AIX操作系统和Linux,Windows,HP-UX一样,都能对SCSI适配器和某个给定的SCSI总线或磁盘驱动器之间的输入输出请求的数量进行限制。进行这些限制的目的是充分利用硬件的能力来处理多个请求,同时确保磁盘驱动器的最优化搜索算法能够有效运行。
对于非IBM设备而言,有时需要修改AIX的默认队列界限值,从而获取最高性能,而不是使用那些被选择处理最坏可能情况的默认值。让我们看一下默认值应该改变的某些情况,以及这些情况下IBM推荐的新值。
针对非IBM磁盘驱动器的AIX SCSI设置
在任何特定时间,AIX系统答应IBM磁盘的未完成的请求数量的设置值是3(对于SSA,其值是8)。对于这个值,没有直接的接口可以更改它。对于非IBM磁盘驱动器,默认的硬件队列深度值是个非常低效的设置。假如这些磁盘能够接受多个命令(大部分现代磁盘都可以),你改变对于非IBM磁盘驱动器的设置值是非常合适的,从而可以使得这些磁盘驱动器的性能最大化。例如,使用lsattr命令可以显示某个非IBM磁盘驱动器的默认特性:
# lsattr -D -c disk -s scsi -t osdisk
pvid none Physical volume identifier False
clr_q no Device CLEARS its Queue on error
q_err yes Use QERR bit
q_type simple Queuing TYPE
queue_depth 3 Queue DEPTH
reassign_to 120 REASSIGN time out value
rw_timeout 30 READ/WRITE time out value
start_timeout 60 START unit time out value
你应该使用AIX提供的接口SMIT来按照要求改变这些磁盘参数。SMIT答应从命令行以最快速的路径到达SMIT接口中的特定点。得到SMIT磁盘接口扇区的快速命令是smitty chgdsk。最为另外一种方式,你也可以使用chdev命令行名来来改变这些参数。
让我们看一个使用chdev的例子,假如你的系统包含一个非IBM SCSI磁盘驱动器,名为hdisk7,下面这个命令能激活对这个设备的队列功能并设置其队列深度为3:
# chdev -l hdisk7 -a q_type=simple -a queue_depth=3
这对单个磁盘而言非常不错,但当你对整个非IBM磁盘阵列进行操作时又是怎么样一回事呢?让我们往下看。
针对整个非IBM磁盘阵列设置SCSI参数值
任何磁盘阵列对AIX系统而言都是单个磁盘驱动器,尽管这个磁盘驱动器比较大。某个非IBM磁盘阵列,像单个非IBM磁盘驱动器一样,看起来是磁盘、子类SCSI磁盘或osdisk(是其他SCSI磁盘驱动器的缩写)磁盘。尽管如此,我们知道一个磁盘阵列实际上包含很多物理磁盘驱动器。每个物理磁盘都能处理多个请求,因此,整个磁盘阵列的队列深度应该被设置成某个非常大的值,从而高效地使用所有这些物理磁盘。例如,假如hdisk8是一个含有8个磁盘的IBM磁盘阵列,而且每个磁盘都支持队列深度为3,使用chdev来改变这个磁盘阵列到某个合适值的命令如下:
# chdev -l hdisk8 -a q_type=simple -a queue_depth=24
假如磁盘阵列通过一个SCSI-2快速/高带宽SCSI适配器总线来连接,对这样的总线它或许需要改变未完成请求的界限值。让我们接着往下看。
改变AIX磁盘适配器的未完成请求的界限值
AIX SCSI-2快速/高带宽适配器支持两条SCSI总线,一条供内部设备使用,另外一条供外部设备使用。针对每条总线的未完成请求的界限值都有一个限制。这个限制的默认值是40,最大可能值是128。当某个IBM磁盘阵列连接到一个SCSI-2快速/高带宽适配器总线时,这个总线的未完成请求的界限值就会自动增加来容纳这个磁盘阵列的队列深度值。尽管如此,对于一个非IBM磁盘阵列,这个改变必须手动改变。例如,使用chdev命令设置scsi2适配器的未完成请求的界限值为80的方法如下:
# chdev -l scsi2 -a num_cmd_elems=80
注重,假如你使用SCSI-2高性能控制器,这个队列请求的最大值是30,而且这个限制不能被改变。为此,你应该确保连接到SCSI-2高性能控制器的所有设备的队列深度不超过30。
同时你应该注重到最原始的RS/6000 SCSI适配器不支持队列。将一个磁盘阵列设备连接到这样的适配器是不合适的。
控制AIX的系统pbufs的数量
在AIX系统中,逻辑卷治理器(LVM)使用一个称为pbuf的结构来控制针对磁盘的输入输出操作。在AIX版本3中,对每个正在读或写的页都需要一个pbuf。对于那些进行大量顺序输入输出的系统而言,这将过度损耗pbufs缓冲池。为了补偿这种损耗,使用命令vmtune来增加pbufs的数量。
在AIX版本4中,对于每个顺序输入输出请求只只用单个pbuf,而不管涉及的页的数量。这就显著减少了用完pbufs的可能性,因而在版本4中,一般不推荐调整pbufs。
在AIX版本5中,不再需要调整这个参数。