磁盘I/O性能对数据库的影响之分析(2)

时间:2009-03-31   来源:   网友评论:0   人气: 1206 作者:

      通用的经验法则:确保将尽可能多的磁盘条带化以便达到稳定的磁盘 I/O 性能。Performance Monitor 将显示某个 RAID 阵列上是否出现磁盘 I/O 瓶颈现象。作好必要的时候添加磁盘并在 RAID 阵列和/或小型计算机系统接口中重新分配数据的准备,以平衡磁盘 I/O,获取最佳性能。

  硬件 RAID 控制器的插件高速缓存的效果

      许多硬件 RAID 控制器有某些形式的读和/写高速缓存。通过 SQL Server 利用这些高速缓存,因为它可大大增强磁盘子系统的有效的 I/O 处理能力。这些基于控制器的高速缓存机制的原理是,在几个毫秒内聚集从托管服务器(即 SQL Server)发来的较小的和潜在的不连续的 I/O 请求,然后试图将它们与其它 I/O 请求组织在一起,从而使这些经过批处理的 I/O 形成更大的 (32-128 KB) 甚至连续的 I/O 请求以发送到硬盘。通过遵守连续的和大规模的 I/O 有利于提高性能的原则,使在硬盘为 RAID 控制器提供固定数量 I/O 的情况下,帮助提高磁盘 I/O 吞吐量。这并不是说 RAID 控制器可以无限地使硬盘每秒钟处理更多的 I/O,RAID 控制器高速缓存只是使用一些组织来排列输入的 I/O 请求,从而尽可能好地使用基础的硬盘定量 I/O 处理能力。

      这些 RAID 控制器通常使用某种形式的备份功能来保护它们的高速缓存机制。备份功能有助于将写在高速缓存中的数据保留一段时间(可能是数天),以防止停电。并且在生产环境中,通过为服务器提供充足的不间断电源 (UPS) 保护,使 RAID 控制器具有更多的保护和电源备用时间,以便当服务器出现断电的时候,可用它来将数据刷新到磁盘中,从而加强了数据库服务器的保护。

  RAID 级别

  RAID 1 和 RAID 0+1 提供最有效的数据保护和最好的 RAID 级别性能,但它需要更多的磁盘。当不限制硬盘的成本时,RAID 1 或 RAID 0+1 是性能和容错力均最佳的 RAID 选择。

  RAID 5 用最低的成本来实现容错,但是只有 RAID 1 和 0+1 一半的写性能,这是因为 RAID 5 必须读奇偶信息,并将奇偶信息写入磁盘,从而需要额外的 I/O。RAID 5 的容错能力不及 RAID 1 和 0+1。

  RAID 0 可实现最好的磁盘 I/O 性能(没有容错保护的磁盘条带化),但是因为 RAID 0 没有容错能力,所以这种 RAID 级别通常只能用于开发数据库服务器或其它测试环境。

     许多 RAID 阵列控制器在物理硬盘上提供 RAID 0+1 选项(也称为 RAID 1/0 和 RAID 10)。RAID 0+1 是混合 RAID 解决方案。在较低的层次,它像普通 RAID 1 一样镜像所有的数据;在较高的层次,控制器在所有驱动器中将数据条带化(像 RAID 0 一样)。因此,RAID 0+1 在提供最高性能(条带化)的同时提供最大程度的保护(镜像)。条带化和镜像操作对于 Windows 和 SQL Server 是透明的,因为它们由 RAID 控制器管理。RAID 1 和 RAID 0+1 之间的不同在于硬件控制器的级别。对于s相同的存储量,RAID 1 和 RAID 0+1 要求同样多的驱动器。有关如何在特定的 RAID 控制器上实施 RAID 0+1 的细节,请与生产控制器的硬件厂商联系。

  图 1 说明了 RAID 0、RAID 1、RAID 5 和 RAID 0+1 之间的不同。请注意要容纳四个磁盘量的数据,RAID 1(和 RAID 0+1)需要八个磁盘,而 RAID 5 则需要五个磁盘。确保找到正确的硬件厂商,以了解在运行数据库服务器的特定硬件上实施 RAID 的细节。

  联机 RAID 扩充

  这是一种十分方便的功能,它使得我们可以在 SQL Server 联机的时候,将磁盘动态地添加到有热插拔插槽的物理 RAID 阵列。许多硬件厂商都提供具有这种功能的硬件 RAID 控制器。它自动将所有驱动器(包括新添加的驱动器)中的数据重新平均地条带化,而没有必要关闭 SQL Server 或 Windows。一个好主意是空出磁盘阵列箱中的热插拔驱动器插槽以便使用此功能。因此,如果 SQL Server 通常由于过多的 I/O 请求导致 RAID 阵列负担过重(这可由与 RAID 阵列相关的 Windows 逻辑驱动器号的磁盘队列长度显示出来),可以在 SQL Server 运行期间在热插拔插槽中安装一个或多个新硬盘。RAID 控制器将一些已有的 SQL 数据重新分配到这些新硬盘,以便在 RAID 阵列的所有硬盘中平均分配 SQL 数据。于是,新硬盘的 I/O 处理容量(每个驱动器每秒 75 个非连续 I/O 或 150 个连续 I/O)就添加到 RAID 阵列的总的 I/O 处理容量中。

  Performance Monitor 和 RAID

  在 Performance Monitor 中,逻辑磁盘对象和物理磁盘对象有效地提供相同的信息。所不同的是 Performance Monitor 中的逻辑磁盘与 Windows 视为逻辑驱动器号的磁盘相关。Performance Monitor 中的物理磁盘与 Windows 视为单个物理硬盘的磁盘相关。

  要启用 Performance Monitor 计数器,在 Windows 命令提示窗口的命令行运行 diskperf.exe 命令。运行“diskperf -y”以便 Performance Monitor 报告逻辑和物理磁盘的数量。它可以在使用硬盘或硬盘组以及 RAID 控制器时有效,而无需使用 Windows NT 软件 RAID。

  当运用 Windows NT 软件 RAID 时,应使用“diskperf -ye”以便 Performance Monitor 正确报告 Windows NT 条带集中的物理计数器。当“diskperf -ye”与 Windows 条带集结合起来使用时,逻辑计数器无法报告正确的信息,需将其忽略。如果要求将逻辑磁盘计数信息与 Windows NT 条带集结合起来使用,应使用“diskperf -y”命令。将“diskperf -y”和 Windows NT 条带集结合起来使用,可以正确报告逻辑磁盘的数量,但是物理磁盘计数器将无法报告正确信息,需将其忽略。

  请注意只有在 Windows NT 重新启动之后,diskperf 命令才有效。

  还请注意硬件 RAID 控制器将组成单个 RAID 镜像集或条带集的多个物理硬盘作为一个物理磁盘呈现给 Windows。磁盘管理器用于使逻辑驱动器号与单个物理磁盘相关联,而无需考虑实际有多少个硬盘与 RAID 控制器呈现给它的单个物理硬盘相关联。

  但是从性能优化的角度来看,了解与 RAID 阵列相关联的物理硬盘的数量是十分重要的,因为在确定 Windows 和 SQL Server 发送给每个物理硬盘的磁盘 I/O 请求的数量时需要这一信息。将 Performance Monitor 所报告的与某个硬盘相关联的磁盘 I/O 请求的数量除以该 RAID 阵列中已知的实际物理硬盘的数量。

  要粗略估算 RAID 阵列中每个硬盘的 I/O 活动,还有很重要的一点是将 Performance Monitor 所报告的磁盘写 I/O 的数量乘以 2(RAID 1 和 0+1)或 4 (RAID 5)。这样将对发送到物理硬盘的实际 I/O 请求给出一个更准确的数量估计,因为硬盘所应用的 I/O 容量数(每个驱动器 75 个不连续 I/O 和 150 个连续 I/O)处于这个物理级别。但是如果硬件 RAID 控制器使用高速缓存,便不要指望用这种方法可以准确计算出硬盘中的 I/O 数,因为高速缓存可以大大改变硬盘中实际的 I/O 数,其原因已在前面讲述过。

最好的办法是只关心磁盘队列,而不关心每个磁盘实际的 I/O,因为归根到底,如果 I/O 并没有引发问题,那么又何必担心它呢?Windows 无法了解 RAID 阵列中的物理驱动器数量,因此要准确估算每个物理磁盘的磁盘队列,重要的是用磁盘队列长度除以包含所考察的逻辑驱动器的硬件 RAID 磁盘阵列中的物理驱动器数。对于包含 SQL Server 文件的硬盘,这个数字不要超过 2。

  有关 SQL Server 和 RAID 的详细信息,请在 SQL Server Books Online 中搜索字符串“RAID Levels and SQL Server”、“Comparing Different Implementations of RAID Levels”、“Monitoring Disk Activity”、“Performance Monitoring Example:Identifying Bottlenecks”、“About Hardware-based Solutions”和“RAID”。

  Windows NT 软件 RAID

  Windows NT 通过 Windows NT 操作系统(而不是硬件 RAID 控制器)来提供镜像集和条带集(有或没有容错能力),从而为出现故障的硬盘提供容错能力。Windows NT 磁盘管理器用于定义镜像集 (RAID 1) 或带奇偶校验 (RAID 5) 的条带集。Windows NT 磁盘管理器还可以定义没有容错能力 (RAID 0) 的条带集。 

  软件 RAID 将使用更多的 CPU 资源,因为 Windows NT 是管理 RAID 操作而不是硬件 RAID 控制器的组件。因此,如果系统处理器使用率接近 100%,那么在使用相同数量的硬盘的情况下,Windows NT 软件 RAID 的性能可能会比硬件 RAID 解决方案要低几个百分点。但是,如果用一组驱动器来维护 SQL Server I/O,Windows NT 软件 RAID 通常可以帮助它们实现比单独使用这些驱动器所获得的更好的总体性能,减小了出现 I/O 瓶颈的可能性,从而提高了 SQL Server 的 CPU 利用率,并增加了吞吐量。而且因为软件 RAID 可以为硬盘提供容错力,因而是一个成本更低的解决方案。

  有关配置 Windows NT 软件 RAID 的详细信息,请参见 Windows NT 服务器联机帮助中的第 4 章“设计可靠配置”。同时在 SQL Server Books Online 搜索字符串“About Windows NT-based Disk Mirroring and Duplexing”和“About Windows NT-based Disk Striping and Striping with Parity”。

  磁盘 I/O 并行

  当处理放置在几个磁盘驱动器上的小型 SQL Server 数据库时,磁盘 I/O 并行可能不起作用。但是当处理存储在许多磁盘驱动器上的大型 SQL Server 数据库时,使用磁盘 I/O 并行,以便最有效地使用磁盘子系统的 I/O 处理能力,从而达到改善性能的目的。

  创建磁盘 I/O 并行最简单的方法是创建一个“驱动器池”,存储除了事务日志文件之外的所有 SQL Server 数据库文件。该驱动器池可以是在 Windows NT 中作为单个物理驱动器的单个 RAID 阵列,也可以是一个用多个 RAID 阵列和 SQL Server 文件/文件组组成的大型池。SQL Server 文件可以与每个 RAID 阵列发生关联,且这些文件可以组成一个 SQL Server 文件组。然后可以在这个文件组上建立一个数据库,以便数据可以均匀地分布在所有驱动器和 RAID 控制器上。“驱动器池”方法依赖于 RAID 在所有的物理驱动器上分配数据,以确保在数据库服务器运行期间并行存取数据。

  这种池的方法简化了 SQL Server I/O 性能的优化,因为数据库管理员知道只能在一个物理位置上创建数据库对象。可以监视单个驱动器池的磁盘队列,如果有必要,也可以在池中添加更多的硬盘以防止出现磁盘队列。这一技术可以在通常不知道数据库的哪些部分使用率最高的情况下帮助优化性能。最好不要将 I/O 总的可用容量中的一部分隔离到其它磁盘分区上,因为 SQL Server 可能只有 5% 的时间在对它进行 I/O 操作。“单个驱动器池”的方法有助于使所有可用 I/O 容量总能为 SQL Server 操作使用。

  请注意 SQL Server 日志文件应始终在物理上分散到与其它所有的 SQL Server 数据库文件不同的硬盘。对于数据库十分忙碌的 SQL Server,事务日志文件应在物理上相互隔开。事务记录主要是连续的写 I/O。将事务记录活动与其它不连续的磁盘 I/O 活动分开对 I/O 性能有许多好处。这使得包含日志文件的硬盘可以专事连续 I/O。请注意事务日志有时需要作为 SQL Server 操作(如复制、回滚和延迟的更新)的一部分读出。因为需要进行这些读操作,所以尤其应注意参与复制的 SQL Server,确保所有事务日志文件有足够的磁盘 I/O 处理能力。

  通过 SQL Server 文件和文件组,在物理上将 SQL Server 对象与它们相关的数据库的其余部分分开的过程还涉及到其它管理工作。这对于调查非常活跃的表和索引十分有价值。通过将表或索引与其它数据库对象分开,可以准确估算对象的 I/O 需求。如果所有数据库对象都放置在一个大型的驱动器池中,则该工作不容易进行。比较好的办法是在数据库开发和基准测试期间进行这种物理 I/O 分割,这样就可以收集数据库的 I/O 信息并在制定生产数据库服务器环境的容量计划时使用这些信息。

  以下是可以分散在不同的硬盘、RAID 控制器、PCI 通道(或这三者的组合)的 SQL Server 活动:


 

文章评论