数据库(DB2)
Jul 30
分享如何设置 DB2 和AIX与条带技术匹配以提高系统 I/O 性能
--being 由itlife365.com收集整理于IBM developerworks
条带化技术是一种广泛使用的 I/O 负载均衡技术,可以在不增加额外硬件投入的情况下极大的提高 I/O 性能。但是在使用了这种技术的环境中,只有对数据库和操作系统的 I/O 处理有良好的规划和设置,使其与条带化技术相匹配,才能使 I/O 的性能达到最好。本文针对这个主题,以 DB2 数据库和 AIX 操作系统为例,介绍了如何规划和设置好相关的内容。
下面我们分如下几个方面来介绍:
条带化技术介绍
在 DB2 中合理规划和设置条带有关参数
在 AIX 中合理规划和设置条带有关参数
总结

条带化技术介绍
条带技术简介及应用
当多个进程同时访问一个磁盘时,可能会出现磁盘冲突。大多数磁盘系统都对访问次数(每秒的 I/O 操作,IOPS)和数据传输率(每秒传输的数据量,TPS)有限制。当达到这些限制时,后面需要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。
避免磁盘冲突是优化 I/O 性能的一个重要目标,而 I/O 性能的优化与其他资源(如 CPU 和内存)的优化有着很大的区别 ,I/O 优化最有效的手段是将 I/O 最大限度的进行平衡。这就需要将一个热点磁盘上的 I/O 访问负载分担到其他相对空闲的磁盘上,也就是 I/O 负载均衡。在一些成熟的磁盘负载均衡技术出现之前,DBA 需要了解、预测各系统的 I/O 负载量,通过手工配置每个数据到不同存放位置以分担 I/O 负载来达到负载均衡的目的。
条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。很多操作系统、磁盘设备供应商、各种第三方软件都能做到条带化。通过条带化,DBA 可以很轻松的做到 I/O 负载均衡而无需去手工配置。
图 1 描述的是一个未经条带化处理的连续数据的分布,图 2 描述的是一个已经被条带化处理的连续数据的分布,从中比较,我们可以发现图 2 中对连续数据的读写都有最大的并发能力。
图 1. 未经条带化处理的连续数据


图2.已经被条带化处理的连续数据

由于条带化在 I/O 性能问题上的优越表现,以致于在应用系统所在的计算环境中的多个层次或平台都涉及到了条带化的技术,如操作系统和存储系统这两个层次中都可能使用条带化技术。下图展示了这两个层次的 I/O 结构。
图 3.操作系统和存储系统两个层次的 I/O 结构

在操作系统的层次中,我们可以使用软件条带(如 LVM 中 LV 的条带来实现条带化技术)或硬件条带(如各种 RAID)。在存储系统层次中,目前市场上绝大部分产品都提供了各种各样的条带技术(如各种 RAID)。

条带化的设置
当使用 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 数据库的预取处理流程。

上图中,我们发现,用户在获得 DB2 中的数据时有一个比较复杂的 I/O 处理过程:用户向数据库发出请求; DB2 异步的处理 I/O ;将请求提交给 I/O Server ;以预取大小为单位从存储中读取数据;在内存中处理数据;最后将请求的结果返回给用户。在这么多步骤的处理中,我们很明显的发现,访问物理存储的工作是由 I/O Server 以预取大小为单位实现的。所以在上述的过程中,在 DB2 数据库级别影响单次物理 I/O 最重要的因素就是预取大小。为了提高 I/O 的性能,就需要在设置 DB2 预取大小时必须与条带深度和条带宽度有较好的匹配。
首选要保证的就是预取的大小必须是条带深度的整数倍,其次预取大小最好是条带深度与条带宽度乘积的整数倍(当然预取大小还与 DB2 的其他参数有关,如 page size、extent size、容器数量等等,这里不一一讨论)。这样就可以使预取时候所执行的物理 I/O 被均衡的分布所有的物理存储中。
另外,I/O 过程中,你无法保证 DB2 数据库的页的边界能与条带单元的大小对齐。如果条带深度大小和 DB2 的页大小完全相同,而它们的边界没有对齐的话,那么就会存在大量的一个单独的小的 I/O 请求在两块磁盘上完成。
如今大多数 LVM 都支持在线动态增加磁盘。也就是在磁盘容量不足时,我们可以随时将新磁盘加入到一个已经使用的逻辑卷中。这样的话,我们在设置逻辑卷时就可以简单地将所有磁盘都归入到一个卷中去。
如果你的条带宽度设置得比较小,就需要估算出你的各个数据库表空间容器的 I/O 负载,并根据负载量不同将他们分别部署到不同卷上一分担 I/O 负载。

在 AIX 中合理规划和设置条带相关参数
操作系统最大 I/O 大小:决定了一次单个的 I/O 请求的大小上限,不同的操作系统有不同的参数,AIX 系统是卷组的 LTG(Logical Track Group)参数(HP-UX 是参数 max_I/O_size);
操作系统级别条带化的设置;
操作系统最大的 I/O 大小对条带化深度的设置也产生着重要的影响。当逻辑 I/O 请求达到操作系统之后,如果逻辑 I/O 的大小超过了操作系统能处理最大的 I/O 大小,操作系统会根据自己能够处理的最大的 I/O 大小来分割逻辑 I/O 请求。在 AIX 中,这个参数就是 LTG,也就是当逻辑 I/O 的大小超过了所在卷组的 LTG 的设置之后,AIX 会将逻辑 I/O 以 LTG 为单位进行分割之后,才会将分割好的 I/O 请求分发到物理存储中去。所以 LTG 的大小应该与条带深度大小相同或者是条带深度大小的整数倍。
在 AIX V5.3 后,卷组的 LTG 参数是在 varyonvg 的时候指定的,语法如下:

varyonvg – M 512K vgname

上面的语句将卷组“ vgname ”的 LTG 参数设置为 512K,每次在 varyonvg 卷组的时候可以设置不同的 LTG(在 AIX5.3 之前,LTG 是在创建卷组的时候设置,并且不能修改)。目前 LTG 的取值范围为:4K、8K、16K、32K、64K、128K、1M、2M、4M、8M、16M、32M 和 128M 。而且如果卷组中 PV 不能支持 LTG 的设置 varyonvg 命令将会失败。
很多操作系统支持操作系统级别的条带化(而不是存储系统提供的条带化),这个条带技术原理与之前介绍的无异。操作系统级别的条带化又分为逻辑条带化和物理条带化两种技术。逻辑条带化通常是通过 LVM 在 LV 级别实现的,而物理条带化通常是通过操作系统机器上的硬件实现的。在这里介绍一下 AIX 操作系统中 LVM 实现的逻辑条带化技术。
AIX 系统中 LVM 的基本结构如下图所示。
图5.AIX 中的 LVM 结构

首先在 AIX 系统创建 PV,再由一个或多个 PV 创建 VG,在 VG 之上再创建 LV,所以 LV 中的逻辑存储最终会映射到 PV 上的物理存储中。在不使用条带技术的情况下,LV 上连续的数据块会以图 1 方式分布在 PV 之上。
在使用条带技术之后,LV 上连续的数据块就会以图 2 的方式分散的分布在这些 PV 之上了。
这样在对 LV 上连续的数据进行读和写的时候,就可以实现同时在多个 PV 上并行的处理 I/O 请求了,从而可以极大的提高 I/O 的性能。
上面已经提到的关于条带深度和条带宽度的特点在 LV 上同样适用。只是条带化处理的 I/O 不是发送到物理磁盘上,而是发送到了 PV 上。在操作系统最简单的存储方案中,一个 PV 对应的就是一个物理磁盘,而现在普遍使用了单独的存储系统之后,一个 PV 通常只是一个逻辑磁盘,而这个逻辑磁盘通常又是以某种条带化技术映射到了存储系统中的多个物理磁盘上。所以在操作系统中使用了 LV 级别的条带化之后,一定要保证操作系统中条带的设置与存储系统中的条带设置相匹配,否则性能将无法得到保证。
那么我们是否需要在使用了存储系统条带技术的同时再使用操作系统级别的条带技术呢?答案是:不一定。条带化技术的目的就是为了最大限度的将 I/O 负载均衡,实现最大化的 I/O 并行处理。只要有利于这个目标,我们就可以同时这两个不同层次的条带化,而相反的,如果同时使用了这两个层次的条带化后并没有实现更好的 I/O 性能,那么就没有必要了,因为这更增加了 I/O 结构的复杂性,更不利于存储空间的管理。
在使用了单独的存储系统之后,操作系统级别的条带化带给我们最大的性能优势就是 LV 上的 I/O 可以在多个 PV 上并行执行,而每个 PV 又映射到不同的一组的物理磁盘上,这样就可以将 LV 上的 I/O 分布在更多的物理磁盘上,这样对提高 I/O 的性能有极大的帮助。如果 LV 分布的多个 PV 都映射到同一组的物理磁盘上,则对 I/O 性能的提高帮助不大。
在使用了操作系统级别的条带化之后,还需要重点考虑的就是条带深度,操作系统级别条带深度的大小决定了在向 PV 发送 I/O 的大小,为了获得最好的性能,就要进一步的分析 Pv 在映射到存储系统时条带深度的设置,最好的结果就是:操作系统条带深度 = 存储系统条带深度×存储系统条带宽度,这样就能最大限度的保证两个层次条带深度的匹配,从而有最好的 I/O 性能。

在操作系统中设置条带化的时候,注意下面的原则
操作系统的条带块的大小设置的大些,应该是硬件条带块大小的整数倍。
操作系统的条带的范围减小。
必须和应用的特点相结合(例如:应用是随机读还是连续读),条带技术对大量的顺序读 / 写有最好的 I/O 性能。

总结
条带化技术到目前为止依然是提高 I/O 性能最好的一种技术,它通过最大化的 I/O 并行特性发挥了所有可以利用的硬件的能力。所以条带化技术各种环境中都得到了广泛的应用。我们在考虑性能问题的时候不可错过对条带化技术的关注。
Tags: , , ,
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]