八、IO优化(1)磁盘簇

一、硬盘结构

1. 硬盘基本结构

  硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片。

  不同容量硬盘的盘片数不等。每个盘片有两面,每个面都有一个磁头(Head),习惯用磁头号来区分。盘片被分成许多扇形的区域,每个区域叫一个扇区(Sector),每个扇区可存储128×2的N次方(N=0.1.2.3)字节信息。在DOS中每扇区是128×2^2=512字节。盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道(Track)。硬盘中,不同盘片相同半径的磁道所组成的圆柱称为柱面(Cylinder)。

144156300.png

  扇区、磁道(或柱面)和磁头数构成了硬盘结构的基本参数,通过这些参数可以得到硬盘的容量,其计算公式为:存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数


2. 磁盘簇

 “簇”是DOS进行分配的最小单位。当创建一个很小的文件时,如是一个字节,则它在磁盘上并不是只占一个字节的空间,而是占有整个一簇。DOS视不同的存储介质(如软盘,硬盘),不同容量的硬盘,簇的大小也不一样。簇的大小可在称为磁盘参数块(BPB)中获取。簇的概念仅适用于数据区。

  默认的情况下,在格式化的时候如果没有指定磁盘簇的大小,那么系统会根据分区的大小选择默认的簇值。其实在NTFS文件系统中格式化的时候,可以在“Format”命令后面添加“/a:UnitSize ”参数来指定磁盘簇的大小,UnitSize表示簇大小的值,NTFS支持512/1024/2048/4096/8192/16K/32K/64K。比如“format d:/fs:NTFS /a:2048”,表示将D盘用NTFS文件系统格式化,磁盘簇的值为2048B。

  一般情况下,不需要去手工设置磁盘簇的大小,使用默认的设置就可以了。比如在用NTFS文件系统格式化分区的时候,系统会根据分区的大小自动选择默认的簇大小,比如4KB。

  在NTFS文件系统中,簇的大小会影响到磁盘文件的排列,设置适当的簇大小可以减少磁盘空间丢失和分区上碎片的数量。如果磁盘簇设置过大,会影响到磁盘存储效率;反之如果设置过小,虽然会提高利用效率,但是会产生大量磁盘碎片。


3. 磁盘I/O瓶颈的由来

  影响磁盘读取性能的两个主要因素:寻道时间和轮询延迟。我们在查询数据时,有两种磁盘的读取方式:顺序读和随机读。随机读发生时,磁头需要移动并定位到所在的Track和Sector,这个时间比较长。而一旦磁头完成定位,读取一个Sector和连续几个Sector的耗时基本上没有区别。

  SQL Server 读取数据文件时,通常要按记录的逻辑顺序读取相应的记录,如果逻辑上相邻的数据页在物理分布上不连续,则会因为磁头的来回移动使性能大打折扣。


二、SQL Server中的磁盘存储单位

1. 页(page)和区(extend)

  SQL Server的数据的存储基本单位是8KB的页,即使你只需要读取一条记录,SQL Server还是会把记录所在的整个页读取出来。

  在分配数据页时,连续8个页组成一个区(extend)进行统一分配管理。


2. 预读

  SQL Server企业版有一种预读机制,在读取一个页面时,会顺带把相邻的页面也同时读取到内存中,最大可预读1MB的块。如果下一步需要访问的数据正好位于刚刚读出的相邻页面,则将从预读中大大受益。



3. 建议

  借鉴区的组织结构和预读机制,我们可以将磁盘格式化为64KB的簇。当读取一个8KB页面时,实际的磁盘是读取出了64K。但是因为簇是连续的扇区,因此多读取的这一部分,对性能的影响基本是可以忽略的。

  因此我们可以将专用于SQL Server存储的磁盘分区格式化成为64KB的簇,这样在不浪费空间的前提下,又可以提高性能。

183057513.png



三、扇区对齐

1. 卷对齐(Volume Alignment)

  如果一个NTFS卷创建在一个RAID设备上,通常需要执行卷对齐。如果卷对齐失败,可能导致明显的性能下降。由于国内一般将卷称为分区,因此俗称“分区对齐”。

  早期的磁盘,是以512Bytes作为一个扇区。随着硬盘容量攀升,这个标准不但繁琐,而且降低效率,因此后续硬盘改为每个扇区为4096Bytes,俗称“4K扇区”。有可能NTFS的扇区的写入点正好位于两个物理4KB的扇区之间,也就是说,即使NTFS写入最小的量,也会用到2个物理扇区,显然这样对写入和读取都会造成很大影响。

  以下图为例,上方的区块显示LBA 0已经对齐了第一个物理4KB块,这种情况称为 Alignment 0;下方的区块显示 LBA0 对齐到物理4KB扇区的第2个512字节块,这种情况称为 Alignment 1。

102707877.png

  由于LBA起点位置可以有8种可能性,因此一共可能7种扇区不对齐的情况,这些情况均会引起与Alignment 1 情况相似的“读取-修改-写入”事件。


2. 实现4K对齐

  对于 Windows 7 和 Windows Server 2008 操作系统,使用系统自带工具进行格式化,那么其格式化后的分区默认就会是“4K对齐”的分区,用户无需再做任何设置了。如果是依然在使用低版本的操作系统的话,那么要做到“4K对齐”就需要一些工具。例如:《Disk performance may be slower than expected when you use multiple disks in Windows Server 2003, in Windows XP, and in Windows 2000》 http://support.microsoft.com/default.aspx?scid=kb;EN-US;929491



本文结语:

  根据SQL Server数据页的组织特性,将磁盘分区格式化成为64KB的簇。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值