what-is-striping-why-use-striping
--begin 由itlife365.com收集
条带(strip)是把连续的数据分割成相同大小的数据块,把每段数据分别写入到阵列中的不同磁盘上的方法。简单的说,条带是一种将多个磁盘驱动器合并为一个卷的方法。 许多情况下,这是通过硬件控制器来完成的。
当多个进程同时访问一个磁盘时,可能会出现磁盘冲突。大多数磁盘系统都对访问次数(每秒的 I/O 操作,IOPS)和数据传输率(每秒传输的数据量,TPS)有限制。当达到这些限制时,后面需要访问磁盘的进程就需要等待,这时就是所谓的磁盘冲突。避免磁盘冲突是优化 I/O 性能的一个重要目标,而 I/O 性能的优化与其他资源(如CPU和内存)的优化有着很大的区别 ,I/O 优化最有效的手段是将 I/O 最大限度的进行平衡。
条带化技术就是一种自动的将 I/O 的负载均衡到多个物理磁盘上的技术,条带化技术就是将一块连续的数据分成很多小部分并把他们分别存储到不同磁盘上去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突,而且在需要对这种数据进行顺序访问的时候可以获得最大程度上的 I/O 并行能力,从而获得非常好的性能。由于条带化在 I/O 性能问题上的优越表现,以致于在应用系统所在的计算环境中的多个层次或平台都涉及到了条带化的技术,如操作系统和存储系统这两个层次中都可能使用条带化技术。
条带化后,条带卷所能提供的速度比单个盘所能提供的速度要快很多,由于现在存储技术成熟,大多数系统都采用条带化来实现系统的I/O负载 分担,如果OS有LVM软件或者硬件条带设备,决定因素是条带深度(stripe depth)和条带宽度(stripe width)。
条带深度:指的是条带的大小,也叫条带大小。有时也被叫做block size, chunk size, stripe length 或者granularity。这个参数指的是写在每块磁盘上的条带数据块的大小。RAID的数据块大小一般在2KB到512KB之间(或者更大),其数值是2 的次方,即2KB,4KB,8KB,16KB这样。
条带大小对性能的影响比条带宽度难以量化的多。
- 减小条带大小: 由于条带大小减小了,则文件被分成了更多个,更小的数据块。这些数据块会被分散到更多的硬盘上存储,因此提高了传输的性能,但是由于要多次寻找不同的数据块,磁盘定位的性能就下降了。
- 增加条带大小: 与减小条带大小相反,会降低传输性能,提高定位性能。
根据上边的论述,我们会发现根据不同的应用类型,不同的性能需求,不同驱动器的不同特点(如SSD硬盘),不存在一个普遍适用的"最佳条带大小"。所以这也是存储厂家,文件系统编写者允许我们自己定义条带大小的原因。
条带宽度:是指同时可以并发读或写的条带数量。这个数量等于RAID中的物理硬盘数量。例如一个经过条带化的,具有4块物理硬盘的阵列的条带宽度就是 4。增加条带宽度,可以增加阵列的读写性能。道理很明显,增加更多的硬盘,也就增加了可以同时并发读或写的条带数量。在其他条件一样的前提下,一个由8块 18G硬盘组成的阵列相比一个由4块36G硬盘组成的阵列具有更高的传输性能。
下面先看下影响IO大小的操作系统和Oracle的相关参数:
db_block_size oracle数据块的大小,也决定了oracle一次单个IO请求中oracle数据块的大小
db_file_multiblock_read_count:在多数据块读时,一次读取数据块的数量,它和参数db_block_size一起决定了一次多数据块读的大小,它们的乘积不能大于操作系统的最大IO大小。
操作系统的数据块大小:这个参数决定了Redo Log和Archive Log操作时的数据块大小,对于大多数Unix系统来说,该值为512K。
最大操作系统IO大小:决定了一次单个的IO操作的IO大小的上限,对于大多数Unix系统来说,由参数max_io_size设置。
sort_area_size:内存中sort area的大小,也决定了并发排序操作时的IO大小。
hash_area_size:内存中hash area的大小,也决定了哈希操作的IO大小。
在OLTP系统中,会存在大量小的并发的IO请求。这时就需要考虑选择比较大的条带深度。使条带深度大于IO大小就称为粗粒度条带(Coarse Grain Striping)。在高并行度系统中,条带深度为(n * db_block_size),其中n为大于1的整数。
通过粗粒度条带能实现最大的IO吞吐量(一次物理IO可以同时响应多个并发的逻辑IO)。大的条带深度能够使像全表扫描那样的多数据块读操作由一个磁盘驱动来响应,并提高多数据块读操作的性能。
在低并发度的DSS系统中,由于IO请求比较序列化,为了避免出现热点磁盘,我们需要避免逻辑IO只有一块磁盘处理。这是,粗粒度条带就不适合了。 我们选择小的条带深度,使一个逻辑IO分布到多个磁盘上,从而实现IO的负载均衡。这就叫细粒度条带。条带深度的大小为(n * db_block_size),其中n为小于多数据块读参(db_file_multiblock_read_count)大小的整数。
可以简单的理解为并发程度高的IO采用粗粒度条带化,并发程度低的IO采用细粒度条带化。
IO过程中,你无法保证Oracle数据块的边界能和条带单元的大小对齐。如果条带深度大小和Oracle数据块大小完全相同,而它们的边界没有对齐的话,那么就会存在大量一个单独的IO请求被两块磁盘来完成。
在OLTP系统中,为了避免一个逻辑IO请求被多个物理IO操作完成,条带宽度就需要设置为两倍或者两倍以上于Oracle数据块大小。例如,如果条带深度是IO大小的N倍,对于大量并发IO请求,我们可以保证最少有(N-1)/ N的请求是由一块磁盘来完成。
www.HelloDBA.com写的的一篇《Oracle IO问题解析》文档中看到
比较合理的条带深度是从256K到1M
条带宽度
正如前面所述,无论是一个还是多个磁盘响应一个逻辑I/O,都要求I/O能被一次处理。因而在确定了条带深度的基础上,需要保证条带宽度 >= I/O请求的大小 / 条带深度。
此外,考虑到以后系统容量的扩充,也需要规划好条带宽度。
如今大多数LVM都支持在线动态增加磁盘。也就是在磁盘容量不足时,可以随时将新磁盘加入到一个已经使用的逻辑卷中。这样的话,在设置逻辑卷时就可以简单地将所有磁盘都归入到一个卷中。
但是,有些LVM可能还不支持动态增加磁盘,这时就需要考虑以后的容量扩充对I/O均衡的影响。因为新增加的磁盘无法加入原有卷,而需要组成一个新 的卷。但一般扩充的容量和原有容量比相对较小,如果原有卷的条带宽度比较大的话,新增加的卷的条带宽度无法达到其大小,这样就会使新、旧卷之间出现I/O 失衡。
例如,一个系统的初始配置是一个包含64块磁盘、每块磁盘大小为16GB的单一逻辑卷。磁盘总的大小是1TB。随着数据库的数据增长,需要增加 80GB的空间。把新增加的5个16GB磁盘再组成一个逻辑卷。这样就会导致两个卷上的I/O失衡。为了避免这种情况,可以将原有磁盘配置成每个条带宽度 为8个磁盘的8个逻辑卷,这样在新增加磁盘时可以也增加为8个磁盘的新卷,但必须要保证8个磁盘的条带宽度能够支持系统的每秒I/O吞吐量。
如果条带宽度设置的比较小,就需要估算出各个数据库文件的I/O负载,并根据负载量不同将它们分别部署到不同卷上分担I/O负载。
条带大小计算方法
stripe width(条带宽度):RAID中的磁盘数,就是组成这个stripe的磁盘数。例如,4个磁盘组成的RAID 0,条带宽度就是4。
4个磁盘组成的RAID 5,条带宽度就是4-1=3。
stripe depth(条带深度):单块磁盘上条带的大小,有时也称为stripe unit。
stripe size(条带大小):stripe depth×stripe width。有时也称block size块大小、chunk size簇大小、stripe length条带长度、granularity粒度,是单块磁盘上的每次I/O的最小单位。
RAID条带大小的另一个计算公式为:
条带大小=(0.25×平均定位时间×数据传输速率×(并发用户数-1)×1.024)+0.5KB。
平均定位时间=(平均延时+平均寻道时间)(ms);数据传输速率单位为:Mbps;1.024 = 1s/1000ms×1024KB/1MB(单位转换因子)。
举例来说,磁盘寻道时间是6ms,传输速率80MB,且有20个并发用户的条带大小应该为:(0.25×6×80×19×1.024)+0.5=2335.22KB(差不多2MB)。
在进行数据库IO设计的时候一定遇到设置条带深度为多少的问题。
假定为OLTP系统,针对数据文件、归档日志文件、在线日志文件,我们使用的raid类型一般为raid10、raid5
大家的条带深度一般设置为多少呢?
datafile应该是1m比较好,controlfile大概128k吧,忘记在哪个地方看到的了,redo好像也是建议1m
--END由itlife365.com收集