|
最好的办法是只关心磁盘队列,而不关心每个磁盘实际的 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 活动:
事务日志文件
Tempdb
数据库文件
与许多查询或写活动相关的表
与许多查询或写活动相关的非聚集索引
可以用硬件 RAID 控制器、RAID 热插拔驱动器和联机 RAID 扩展很容易地实现 SQL Server I/O 活动的物理分割。这种方法提供最高的灵活性,因为它排列 RAID 控制器以便为以上所列出的每个单独的 SQL 活动提供单独的 RAID SCSI 通道。每个 RAID SCSI 通道都应连到单独的 RAID 热插拔柜,以便充分利用联机 RAID 扩展(如果可通过 RAID 控制器获得)。Windows 逻辑驱动器号与每个 RAID 阵列相关联,并且可以根据已知的 I/O 使用模式将 SQL Server 文件分散在各个 RAID 阵列中。
通过这种配置,有可能使磁盘队列重新与不同的 RAID SCSI 通道以及它的驱动器发生关联,因为 Performance Monitor 可以在装载测试以及繁重的生产负荷期间报告队列行为。如果 RAID 控制器和驱动器阵列支持联机 RAID 扩展,并且在该阵列中有可用的热插拔硬盘插槽,那么解决该 RAID 阵列的磁盘队列的方法很简单,只需在该 RAID 阵列中添加更多的驱动器,直到 Performance Monitor 报告该 RAID 阵列的磁盘队列已达到可接受的级别(对于 SQL Server 文件可接受的级别小于 2)。这一过程可以在 SQL Server 联机时进行。
Tempdb 是由 SQL Server 创建的数据库,可用作各种活动共享的工作区域,这些活动包括临时表、排序、子查询、用 GROUP BY 或 ORDER BY 的聚合以及使用 DISTINCT(必须创建临时工作表以删除重复行)的查询、游标和哈希联接。使 tempdb I/O 操作与相关事务的 I/O 操作并行发生是一个不错的主意。因为 tempdb 是一个草稿区域,更新频繁,所以对于它来说,选择 RAID 5 不如选择 RAID 1 或 0+1 更加适合。因为每次重新启动数据库服务器时都要重新创建 tempdb,所以 RAID 0 可用于生产型 SQL Server 机器中的 tempdb。RAID 0 使用的物理驱动器最少,且可为 tempdb 提供最好的 RAID 性能。在生产环境中将 RAID 用于 tempdb 的主要顾虑在于,如果 RAID 0 阵列中有任何物理驱动器出现故障,SQL Server 都需要停止,然后重新启动,如果 tempdb 置于 RAID 1 或 RAID 0+1 阵列中,则不一定这样。
要移动 tempdb 数据库,使用 ALTER DATABASE 命令改变与 tempdb 相关的 SQL Server 日志文件名的物理文件位置。例如,要将 tempdb 及其相关的日志移动到新的文件位置 e:\mssql7 和 c:\temp,可使用以下命令:
alter database tempdb modify file (name='tempdev',filename= 'e:\mssql7\tempnew_location.mDF')
alter database tempdb modify file (name='templog',filename= 'c:\temp\tempnew_loglocation.mDF')
相对于用户数据库,master、msdb 和 model 数据库在生产中用得不很多,因此通常在考虑 I/O 性能优化时没必要考虑它们。master 数据库通常只用来添加新的登录、数据库、设备和其它系统对象。
非聚集索引在 B 树结构中,可以用 ALTER DATABASE 命令将它们与它们相关的数据库表分开。在下例中,第一个 ALTER DATABASE 创建一个文件组。第二个 ALTER DATABASE 创建一个与该文件组相关、但位于单独物理位置的文件。此时,可以在该文件组中创建出如以下代码所示的索引,并将该索引命名为 index1。SP_HELPFILE 报告给定数据库中的文件和文件组。SP_HELP
的输出中有一部分提供表的索引及其文件组关系的信息。有关详细信息,请在 SQL Server Books Online 中搜索字符串“ALTER DATABASE”和“sp_helpfile”。
alter database testdb add filegroup testgroup1
alter database testdb add file (name = 'testfile',
filename = 'e:\mssql7\test1.ndf') to filegroup testgroup1
create table test1(col1 char(8))
create index index1 on test1(col1) on testgroup1
sp_helpfile
sp_help test1
有关详细信息,请在 SQL Server Books Online 中搜索字符串“Files and Filegroups”、“Placing Indexes on Filegroups”、“Monitoring Disk Activity”、“Physical Database Files and Filegroups”和“Adding and Deleting Data and Transaction Log Files”。
共2页: 上一页 [1] 2 下一页
|