【IT168 技术文章】
1、顺序读性能调优
VMM 的顺序预读功能能够改进需要顺序访问大文件的程序的性能。
下面的插图展示了典型的预读的情况。
顺序预读的例子. 插图显示了用一行块模拟一分段磁道的文件页号。这些块段按 0,1 到 3,4 到 7,8 到 15 以及 16 到 23 编号。顺序预读的步骤可以在紧接着插图后的文本中找到。
在这个例子中,minpgahead 的值为 2,maxpgahead 的值为 8 (缺省值)。程序顺序处理文件。图中只显示了对预读机制有重要作用的数据引用(按从 A 到 F 的顺序标出)。这些步骤是:
A
第一次文件访问读取文件的第一页(第 0 页)。在这个时候,VMM 并不知道这次访问是随机还是顺序访问。
B
当程序访问下一页(第 1 页)的首字节而不存在对文件其它页的插入访问时,VMM 推断出该程序正在进行顺序访问。于是将页提前量设为 minpgahead (2) 并且调度读取额外的页(第二、三页)。这样步骤 B 总共读取了 3 页。
C
当程序访问预读的第一页(第 2 页)的首字节时,VMM 将页提前量加倍到 4 并且调度读取第 4 到 7 页。
D
当程序访问前次预读的第一页(第 4 页)的首字节时,VMM 将页提前量加倍到 8 并且调度读取第 8 到 15 页。
E
当程序访问前次预读的第一页(第 8 页)的首字节时,VMM 决定将页提前量设为 maxpgahead 并且调度读取第 16 到 23 页。
F
VMM 在程序访问前一组预读页的首字节的情况下继续预读 maxpgahead 页直到文件结尾。
一旦程序偏离了顺序访问模式并且不按次序访问了文件中的一页,顺序预读就会终止。当 VMM 检测到程序恢复顺序访问后,页提前量便会恢复到 minpgahead 页。
可在 ioo 命令中使用 -r 和 -R 选项来更改 minpgahead 和 maxpgahead 的值。如果您打算改变这些值,请记住:
该值必须是集合:0、1、2、4、8、16 等中的一个。使用其它值可能会对性能或功能造成不利影响。
o 由于 VMM 的加倍算法,该值应该是 2 的幂。
o 大于 16 的 maxpgahead 值(预读量大于 64 KB)会超出某些磁盘设备驱动程序的能力。在这种情况下,预读的大小会保持在 64 KB。
o 更大的 maxpgahead 值可用于条带状逻辑卷的顺序性能显得至关重要的系统中。
minpgahead 和 maxpgahead 的值都为 0 能有效消除此机制。这会给性能带来负面影响。但是,在 I/O 随机的一些情况下,这可能也有用处,这时 I/O 的大小会使预读算法生效。
对于非条带状文件系统,当 maxpgahead 值为 8 或 16 时,其顺序 I/O 性能会达到可能的最大值。
预读值从 minpgahead 增加到 maxpgahead 的过程很快,对于大多数文件大小来说增大 minpgahead 值都不会带来任何性能的提高。
可以针对 JFS 和增强型 JFS 分别调优顺序预读功能。JFS 的预读页可以通过改变 minpgahead 和 maxpgahead 的值调优,而增强型 JFS 使用 j2_minPageReadAhead 和 j2_maxPageReadAhead。
2、顺序和随机后写性能调优
后写涉及在达到某个阈值后将内存中修改过的页面异步写到磁盘上,而不是等待 syncd 守护程序将页面清空到磁盘上。这被用于限制内存中的脏页数,减少系统开销和最小化磁盘碎片。后写有两种类型:顺序后写和随机后写。
顺序后写
缺省情况下,一个 JFS 文件划分成 16 KB 大小的分区或 4 页。每一个这样的分区被称为一簇。如果该簇中的 4 页都是脏页,那么一旦修改完下一个分区,系统就会调度该簇中的 4 页并将其写入磁盘。如果不具备这一功能,则直到 syncd 守护程序运行前,该页都会留存于内存,导致可能的 I/O 瓶颈和文件碎片。
VMM 用于充当阈值的簇数是可调优的。缺省值是一簇。使用 ioo -o numclust 命令来增加 numclust 参数可以延迟后写。
对于增强型 JFS,ioo -o j2_nPagesPerWriteBehindCluster 命令用来指定每次调度的页数,而不是簇数。增强型 JFS 簇的缺省页数为 32,意味着增强型 JFS 的缺省大小为 128 KB。
随机后写
可能存在一些应用程序执行大量的随机 I/O,即 I/O 模式不满足后写算法的要求,因而导致所有页面驻留在内存中,直到 syncd 守护程序运行为止。如果应用程序在内存中修改了许多页,就有可能在 syncd 守护程序调用 sync() 时向磁盘写入大量页。
后写功能提供了这样一种机制,即当给定文件在内存中的脏页数超过规定阈值后,则会调度所写的后续页面以写到磁盘上。
通过使用 ioo 命令并带有 JFS maxrandwrt 参数可调整此阈值。缺省值为 0,表示随机后写是禁用的。将该值增加到 128 表示一旦文件驻留于内存的页达到 128 页,随后的任何脏页都将被调度写入磁盘。而这些页将在调用 sync() 后刷新。
对于增强型 JFS,ioo 命令选项 j2_nRandomCluster(-z 标志)和 j2_maxRandomWrite(-J 标志)用来调优随机后写。增强型 JFS 的 j2_maxRandomWrite 选项和 JFS 的 maxrandwrt 选项功能相同。即它限定了每个文件可以留在内存中的脏页数。j2_nRandomCluster 选项指定了可以被视为随机的两次连续写入之间的簇数。
3、异步磁盘 I/O 性能调优
如果应用程序进行同步 I/O 操作,它必须等待 I/O 完成后才能继续执行。相反,异步 I/O 操作在后台运行,不会阻塞用户应用程序。这就改进了性能,因为 I/O 操作和处理中的应用程序可以同时运行。许多应用程序,诸如数据库和文件服务器,利用了重叠处理和重叠 I/O 的能力。
应用程序可以使用 aio_read() 命令、aio_write() 或 lio_listio() 子例程(或它们的副本)来执行异步磁盘 I/O。一旦请求被排队,控制权就从子例程返回应用程序。当磁盘操作被执行时,应用程序可以继续处理。
为了管理异步 I/O,每一个异步 I/O 请求在应用程序地址空间有一个相应的控制块。该控制块包含了请求的控制和状态信息。在 I/O 操作完成后可以被再次使用。
在发出了一个异步 I/O 请求,用户应用程序可以决定何时并以何种方式结束 I/O 操作。这些信息在以下三种方式的任何一种中提供:
应用程序可以轮询 I/O 操作的状态。
当 I/O 操作完成后系统可以异步通知应用程序。
应用程序可以阻塞,直到 I/O 操作完成。
每个 I/O 是由单个 kproc 处理,并且一般来说 kproc 不能处理任何更多的队列中的请求,直到 I/O 已经完成。当异步 I/O 启用时,缺省的配置好的服务器最小数目为 1。这是 minservers 属性。还存在一个可以创建的最大异步 I/O 服务器数,它由 maxservers 属性控制,缺省值为 10(每个 CPU)。服务器的数量限制了可以在系统中同时处理的异步磁盘 I/O 操作的数目。服务器数可用 SMIT 命令(smitty -> 设备 -> 异步 I/O -> 更改/显示异步 I/O 的特征 -> {MINIMUM | MAXIMUM} 服务器数目或 smitty aio)或者使用 chdev 命令来设置。
很少运行应用程序的系统可以使用异步 I/O,缺省值通常可以勉强够用。
如果异步 I/O 请求数目是高的,那么推荐您增加 maxservers 大约至同时 I/O 可能的数目。在大多数情况下,您最好保留 minservers 参数为缺省值,因为如果需要的话,AIO 内核扩展将生成附加的服务器数。
注:
执行在裸逻辑卷上的 AIO 操作并不使用 kproc 服务器进程。有关 maxservers 和 minservers 的设置在这种情况下没有效果。
通过查看 AIO 服务器的 CPU 利用率,如果利用率在它们中间均匀的分配,那就意味着它们都在使用中;在这种情况下,您可能要增加它们的数量。以名称查看 AIO 服务器,运行 pstat -a 命令。运行 ps -k 命令来查看名称为 kproc 的 AIO 服务器。
在异步磁盘 I/O 的性能很重要并且卷请求很高,而你又没有一个适当的同步 I/O 数量的环境下,建议把 maxservers 至少设置为 10(异步存储磁盘的数)。
对系统来说可以通过三个异步存取磁盘获得,如下所示:
# chdev -l aio0 -a maxservers='30'
此外,您可以设置未完成异步 I/O 请求的最大值以及服务器的优先级。如果您的系统拥有大量的异步 I/O 应用程序,那就可以适当地增加请求数以及降低优先级数目。