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

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

如果将 SQL Server 配置成仅包含几个千兆字节 (GB) 的数据,且不承担繁重的读或写活动,便没有太大的必要关注磁盘 I/O 主题,以及在硬盘之间平衡 SQL Server I/O 活动以获取最佳性能。但是要建立包含成百上千 GB 字节的数据且/或承担繁重的读和/或写活动的大型 SQL Server 数据库,就有必要在多个硬盘之间平衡负荷,以配置最佳的 SQL Server 磁盘 I/O 性能。
  标称的磁盘传输率与 SQL Server 的关系

      优化数据库性能最重要的一个方面是调整 I/O 性能。SQL Server 当然也不例外。除非 SQL Server 运行在一台具有足够大的内存可容纳整个数据库的机器上,否则 I/O 性能将由磁盘 I/O 子系统处理 SQL Server 数据读写的速度来决定。

      请记住下面的经验法则:标准的 Wide Ultra SCSI-3 硬盘每秒钟可为 Windows 和 SQL Server 提供 75 个不连续(随机)的 I/O 操作和 150 个连续的 I/O 操作。这种硬盘的标称传输率在 40 MB/秒左右。请记住更有可能限制数据库服务器的传输率是每秒钟 75/150 I/O,而不是 40 MB/秒。具体演算如下:

  (每秒 75 次随机 I/O 操作)X(8 KB 传输)= 每秒 600 KB

     上面的计算表示如果在给定的硬盘上进行严格的随机读或写 SQL Server 操作(单页读和写),有可能该硬盘最高只能达到每秒 600 KB(即每秒 0.6 MB)的处理能力。这比驱动器标定的每秒 40 MB 的 I/O 处理能力要低得多。SQL Server 工作线程、Graphical ShowPlan 和 LazyWrtier 执行 8 KB 传输量的 I/O。

  (每秒 150 个连续 I/O 操作)X(8 KB 传输)= 每秒 1,200 KB

     上面的计算表示如果在给定的硬盘上进行严格的连续读或写 SQL Server 操作(单页读或写),有可能在该硬盘上达到最高每秒 1,200 KB(即每秒 1.2 MB)的处理能力。

  (每秒 75 个随机 I/O 操作)X(64 KB 传输)= 每秒 4,800 KB (4.8 MB)

  上面的计算表示预读的最次方案(假定进行的都是随机 I/O)。请注意即便在完全进行随机 I/O 的情况下,64 KB 传输量仍然可以提供比单页传输率(0.6 和 1.2 MB/s)要好得多的 I/O 磁盘传输率 (4.8 MB/s):

  (每秒 150 个连续 I/O 操作)X(64 KB 传输)= 每秒 9,600 KB (9.6 MB)

      上面的计算表示如果在给定的硬盘上进行严格的连续读或写 SQL Server 操作,有可能在该硬盘上达到最高每秒 9.6 MB 的 I/O 处理能力。这比随机 I/O 的情况要好得多。SQL Server Read-Ahead Manager 以 64 KB 传输率执行磁盘 I/O,并试图安排读操作,以便连续地(通常也称为“按磁盘顺序”)进行预读扫描。因为 Read-Ahead Manager 的目的是连续地执行 I/O 操作,而进行页拆分可能导致扩展盘区的读取不连续,这就是要消除和防止页拆分的原因。

  Log Manager 最大可连续地将 32 KB 字节写入日志文件。

  连续和不连续的磁盘 I/O 操作

       连续和不连续这两个词在硬盘操作中用得非常多。有必要花一些时间来解释一下这两个词对于硬盘的意义。一个硬盘由一组驱动器盘片组成。每个驱动器盘片都通过一组带读/写磁头的取数臂为读/写操作提供服务,这些读/写磁头可以在盘片之间移动,读取驱动器盘片中的信息或者将数据写入盘片。就 SQL Server 而言,应记住硬盘的两个重要特性:

      读/写磁头和相关的磁盘取数臂需要移动才能在 SQL Server 和 Windows 所要求的硬盘盘片的位置上进行查找和操作。如果数据所在的硬盘盘片的位置不连续,硬盘驱动器要花多得多的时间才能将磁盘取数臂和读/写磁头移动到所有需要的硬盘盘片位置。如果所需要的数据全部位于硬盘盘片上的连续物理扇区,情况则相反,磁盘取数臂和读/写磁头只需进行很小的移动就能完成所需磁盘 I/O 操作。连续和不连续的情况下所花的时间有很大的差异,每个不连续的数据查找大约要花 50 毫秒,而连续的数据查找则只需大约 2-3 毫秒。请注意这些值是粗略估计出来的,具体值将取决于不连续的数据在磁盘上分布的疏密、硬盘盘片的旋转速度 (RPM) 以及硬盘的其它物理属性。主要要记住的一点是连续 I/O 有益于 SQL Server 性能。

     本文已提到标准的硬盘支持每秒 75 个不连续的 I/O 和每秒 150 个连续的 I/O。要记住的重要一点是读或写 8KB 的时间与读或写 64 KB的时间几乎相同。在 8 KB 到 64 KB 范围之内,单个磁盘 I/O 传输操作所花的时间主要是磁盘取数臂和读/写磁头运动的时间。因此,从数学上来讲,当需要传输 64 KB 以上的 SQL 数据时,尽可能地执行 64 KB 磁盘传输是有益的,因为 64 KB 传输基本上与 8 KB 传输一样快,而每次传输的 SQL Server 数据是 8 KB 传输的 8 倍。请记住 Read-Ahead Manager 以 64 KB 字节片(也称为 SQL Server 扩展盘区)执行磁盘操作。Log Manager 也以较大的 I/O 传输量来执行连续写操作。要记住的主要事项是充分利用 Read-Ahead Manager,并将 SQL Server 日志文件与其它非连续存取的文件分开,以有效提高 SQL Server 的性能。

        想详细了解物理硬盘的读者可以参考 Compaq 公司的白皮书“Disk Subsystem Performance and Scalability(磁盘子系统性能和可伸缩性)”,其位置将在本文结尾部分的“查找其它资料”中提到。

  磁盘 I/O 传输率/RAID 控制器传输率/PCI 总线带宽

      标准的硬盘提供的最大传输率是每秒 40 MB 或每秒 75 个不连续磁盘传输/150 个连续磁盘传输。 标准 RAID 控制器标称的传输率大约为每秒 40 MB 或(非常接近)每秒 2,000 个磁盘传输。外围元件互连 (PCI) 总线的标定传输率大约为每秒 133 MB 或更高。设备实际的传输率将与标称的传输率不同,但这个问题对于我们此处的讨论并不重要。重要的是了解如何用这些传输率来粗略估算与每个 RAID 控制器相联的硬盘的数量,以及一个 PCI 总线连接多少个驱动器和 RAID 控制器不至于出现 I/O 瓶颈问题。

      在前面的“标称的磁盘传输率和 SQL Server 的关系”部分,已计算出每秒钟最多可以从硬盘读出或写入硬盘的 SQL Server 数据量为 9.6 MB。假定 RAID 控制器每秒钟可处理 40 MB,粗略地计算可与一个 RAID 控制器相联的硬盘数目应为 40 除以 9.6,答案约等于 4。这表示当 SQL Server 只进行 64 KB 的连续 I/O 时,可与一个控制器相联的驱动器最多为 4 个。类似地,前面已计算出对于 64 KB 的全部不连续 I/O,从硬盘到控制器的最大数据传输率为 4.8 MB/秒。40 MB/秒除以 4.8 MB/秒约等于 8。也就是说,在不连续的 64 KB 方案中,与单个控制器相联的硬盘最多为 8 个。随机 8 KB 数据传输方案需要的驱动器最多。40 除以 0.6 约等于 66,这表示需要 66 个驱动器才能使进行 100% 随机 8 KB 读和写的 RAID 控制器饱和。这不是实际可行的方案,因为预读和日志记录所使用的传输量大于 8 KB,并且 SQL Server 不可能执行 100% 的随机 I/O。

      另一种计算可与 RAID 控制器相联的驱动器的数目的方法是从每秒的磁盘传输出发,而不是从每秒的字节数出发。如果某个硬盘每秒可进行 75 个不连续的(随机)I/O,理论上 26 个联在一起的驱动器每秒钟可产生 2,000 个不连续的 I/O,足以达到单个 RAID 控制器的最大 I/O 处理能力。另一方面,只需 13 个硬盘联在一起就能产生每秒 2,000 个连续 I/O,从而使 RAID 控制器以最大吞吐量运行,这是因为单个硬盘每秒可以承受 150 个连续 I/O。

      现在来讨论 PCI 总线。请注意 RAID 控制器和 PCI 总线瓶颈没有与硬盘有关的 I/O 瓶颈常见。但是为便于说明,我们假定与某个 RAID 控制器相联的一组硬盘足够忙,以至于每秒有 40 MB 的吞吐量通过控制器。下一个问题是“PCI 总线上联多少个 RAID 控制器比较安全,不会引发 PCI 总线 I/O 瓶颈问题?”要进行粗略估算,可以用 PCI 总线的 I/O 处理容量除以 RAID 控制器的 I/O 处理容量:133 MB/秒除以 40 MB/秒约等于 3,这表示一个 PCI 总线上可以联大约 3 个 RAID 控制器。请注意多数大型服务器带有多个 PCI 总线,这使得单个服务器上可以安装更多的 RAID 控制器。

       这些计算有助于说明组成磁盘 I/O 子系统的各个组件(硬盘、RAID 控制器和 PCI 总线)的传输率的关系,但不应按字面理解。这是因为这些计算假定全部进行连续数据存取或不连续数据存取,而这在生产数据库服务器环境中几乎是不可能的。实际上,通常既有连续 I/O,也有不连续 I/O,既有 8 KB I/O,也有 64 KB I/O。还有其它因素使得很难准确估算一次通过一组硬盘的 I/O 操作数。RAID 控制器可用的插件读/写高速缓存增加了驱动器组可有效产生的 I/O 数。既然很难准确估算出 SQL Server 环境所需要的 8 KB 和 64 KB I/O 的数,所以同样也很难估算出所增加的 I/O 数。

  但是我们希望能够通过这部分让您了解所标定的传输率对于 SQL Server 的实际意义。

  RAID

      当缩放超过几十亿字节数据的数据库时,对 RAID(廉价冗余磁盘阵列)技术和它与数据库性能的关系有一个基本了解是很重要的。

  RAID 的优点是:

      性能:硬件 RAID 控制器将 Windows 和应用程序(如 SQL Server)的所有数据读/写进行切片(通常为 16-128 KB),这些切片分布在所有参与 RAID 阵列的磁盘中。按类似的方法在物理驱动器之间拆分数据具有在所有参与 RAID 阵列的物理硬盘之间平均分配读/写 I/O 工作负荷的效果。这样可提高磁盘 I/O 的性能,因为作为整体参与 RAID 阵列的硬盘保持同等繁忙程度,而不会使某些磁盘由于 I/O 请求分配的不平均而成为瓶颈。

  容错: RAID 用两种方法保护硬盘不出现故障,并防止由于故障而出现数据丢失:镜像和奇偶信息。

     “镜像”通过将信息写入两组驱动器来实现。镜像的驱动器两侧各有一组信息。如果在使用镜像时一个驱动器出现故障,可以置换出现故障的驱动器,然后从镜像集的另一侧与出现故障的驱动器对应的驱动器中重建数据,从而将出现故障的驱动器中的数据恢复过来。大多数 RAID 控制器可以置换出现故障的驱动器,并在 Windows 和 SQL Server 联机时从镜像驱动器的另一侧重建数据(通常称为可“热插拔”的驱动器)。镜像的一个优点是当要求容错时,它是最佳的 RAID 选项。在使用镜像的情况下,每个 SQL Server 写操作都需要两个磁盘 I/O 操作,即镜像集一边一个。镜像的另一个优点是可提供比奇偶校验 RAID 实施方案更高的容错能力。镜像最少可承受一个出现故障的驱动器,而且即便当镜像集中的驱动器有一半出现故障时,也可以坚持下来,而无须迫使系统管理员关闭服务器,然后从备份文件中恢复数据。镜像的缺点是成本高。镜像的磁盘成本高在要为所有需要一个磁盘的数据准备一个磁盘。RAID 1 和它的混合 RAID 0+1(有时也称为 RAID 10 或 0/1)就是通过镜像来实施的。

     “奇偶校验”的实施方法是,先计算写入磁盘的数据的恢复信息,然后将此奇偶信息写入组成 RAID 阵列的其它驱动器。如果某个驱动器失败,将新的驱动器插入 RAID 阵列,然后取出写在其它驱动器上的恢复信息(奇偶信息),并用此信息重新生成失败的驱动器中的数据,这样就将失败的驱动器中的数据恢复过来。RAID 5 和它的混合就是通过奇偶信息来实施的。奇偶校验的优点是成本低。要在使用 RAID 5 的情况下保护任意多的驱动器,只需增加一个驱动器即可。奇偶信息在 RAID 5 阵列中的所有驱动器之间平均分配。奇偶校验的缺点是性能较差,且容错能力低。由于计算和写奇偶信息这些额外成本,所以 RAID 5 对于每个 Windows NT/SQL Server 写操作都需要四个磁盘 I/O 操作,而镜像则只需要两个磁盘 I/O 操作。镜像和奇偶校验的读 I/O 操作的成本相同。而且,在脱机以及从备份媒体中恢复数据之前,RAID 5 阵列只能允许有一个驱动器失败。


 

文章评论