设置DB2和AIX与条带技术匹配以提高I/O性能
2010-05-14 15:02:00 来源:WEB开发网条带化的设置
当使用 LVM 或者硬件条带化时,决定条带化效果的因素是条带深度(stripe depth)和条带宽度(stripe width):
条带深度指的是条带块的大小,也叫条带单元;
条带宽度指的是条带深度的产量或者一个条带分布的驱动数;
需要根据系统的 I/O 要求来合理的选择这些设置。对于数据库系统来说,比较合理的条带深度是从 256K 到 1M 。下面分析一下条带深度和条带宽度的影响因素。
条带深度
为了提高 I/O 效率,一次逻辑 I/O 请求转化成物理 I/O 请求后,应该让这些物理 I/O 分布到最多的物理磁盘上去,也就是每个物理磁盘处理的物理 I/O 最少,最好只有一次 , 因而影响条带的一个重要因素就是一次逻辑 I/O 请求的大小。
此外,系统中 I/O 的并发度不同我们对条带的配置要求也不同。例如,在高并发度且逻辑 I/O 请求的大小都比较小的情况下,我们希望一块磁盘能同时响应多个 I/O 请求;而在那些存在大的逻辑 I/O 请求的低并发度系统中,我们可能就需要多块磁盘同时响应一个 I/O 请求。无论是一个磁盘还是多个磁盘响应 I/O 请求,我们的一个原则是让一次逻辑 I/O 能被物理设备一次处理完成。
条带宽度
正如我们前面所述,无论是一个还是多个磁盘响应一个逻辑 I/O,我们都希望物理设备只处理一次 I/O 。因而在确定了条带深度的基础上,我们需要保证条带宽度 >= I/O 请求的大小 / 条带深度。这样就能最大程度的保证 I/O 请求的并发处理能力了。
此外,考虑到以后系统容量的扩充,我们也需要规划好条带宽度。
在 DB2 中合理规划和设置条带相关参数
下面先看下影响 I/O 性能 DB2 数据库的相关参数:
页大小(page size):DB2 中的数据页大小,也决定了 DB2 一次单个 I/O 请求中的数据块的大小;
预读大小(prefetch size):在预取读时,一次读取数据块的数量不能大于操作系统的最大 I/O 大小(oracle 中是参数 block size);
排序堆(sortheap)和排序堆阈值(sheapthres) :内存中 sort 区域的大小,也决定了并发排序操作时的 I/O 大小;
其中,前面两个是最关键的两个参数。
DB2 的数据页大小是在创建数据库的时候指定的,并且不能被动态的修改。它决定了在 DB2 中所有的表空间默认的页大小。但是我们在创建每个表空间的时候还可以根据数据存储的需要单独指定页的大小。
在 OLTP 系统中,会存在大量小的并发的 I/O 请求。这时就需要考虑选择比较大的条带深度。使条带深度大于 I/O 大小就称为粗粒度条带(Coarse Grain Striping)。在高并行度系统中,条带深度为(n * page size),其中 n 为大于 1 的整数。通过粗粒度条带能实现最大的 I/O 吞吐量(一次物理 I/O 可以同时响应多个并发的逻辑 I/O)。大的条带深度能够使像全表扫描那样的预取读操作由一个磁盘驱动来响应,并提高预取读操作的性能。在 OLTP 系统中,为了避免一个逻辑 I/O 请求被多个物理 I/O 操作完成,条带深度就需要设置为两倍或者两倍以上于 DB2 页大小。例如,如果条带深度是物理 I/O 大小的 N 倍,对于大量并发 I/O 请求,我们可以保证最少有(N-1)/ N 的请求是由一块磁盘来完成。
在低并发度的 DSS 系统中,由于 I/O 请求一般是序列化的,为了避免出现 I/O 集中的热点磁盘,我们需要避免逻辑 I/O 只有一块磁盘处理。这时粗粒度条带就不适合了。我们应该选择小的条带深度,使一个逻辑 I/O 分布到多个磁盘上,从而实现 I/O 的负载均衡。这就叫细粒度条带。条带深度的大小必须为(n * page size),其中 n 为小于预取参数(prefetch size)大小的整数。
预取大小也是对条带化有影响的一个重要参数,它决定了 DB2 异步 I/O 的基本单位。首先我们要知道 DB2 的预取(prefetching)I/O 机制,在数据库普遍存在着大量、连续的 I/O 时候,预取可以极大的提高数据库数据读取的 I/O 性能(例如 DSS 系统)。
图 4 展示了 DB2 数据库的预取处理流程。
图 4.DB2 预取处理
更多精彩
赞助商链接