当你的操作系统使用lvm软件或是硬件条带,那么这些工具就会把io分布开来。在使用lvm或是硬件的时候需要确定2个方面:1条带深度2条带宽度
条带深度是条带的大小,也可以叫做条带单元,条带宽度我的理解就是磁盘的数量
对于oracle数据库系统合理的条带深度是256KB到1MB,不同类型的应用在不同的条带深度中获益,调优条带深度和条带宽度依赖与下面的几个方面:
1要求的io大小
2io请求的并发
3系统的管理性
4物理条带边界和块大小边界的一致
下面是设置io大小的oracle和操纵系统相关参数
除了io大小,并行度也决定了条带的单元,到选择条带宽度和深度的时候考虑下面的情况:
1在低并发系统中,确保单个io不会访问相同的磁盘2次。例如:假设条带宽度是4个磁盘,条带深度是32k,要是有一个1MB的io请求,那么每块磁盘要有8次的io请求才能返回需要的数据。为了避免这种情况,平均的io应该要小于条带宽度乘以条带深度大小,如果不是这样,oracle的一个io请求就会访问相同的磁盘多次。
2在高并发系统中,确保单个io请求不要被分成多个物理io。如果不这样做,你的系统中就会有很多的物理io请求,这个会严重降低io的响应时间。
io请求的并发
在传统的oltp环境中,通常是保持大的条带单元,使用比io大的条带单元叫粗粒度条带化。在高并发系统中,条带深度可能是
n*db_block_size n是大于1的。
粗粒度的条带允许在阵列中的一个磁盘服务于多个io请求,这样,大量的并发io请求能够被一系列的条带磁盘以最小的代价满足。粗粒度的条带能获得最大的io吞吐量。全表扫描中的多块读能在这种情况下受益,在dss系统中的并行查询也可以使用粗粒度条带。这是因为有很多单独的进程,有单独分开的io,如果粗粒度条带化被用于每月高并发的请求系统,那么会出现热点。
例如在传统的dss环境和低并发的oltp系统中,最好是保持条带单元比较小,这叫细粒度条带化,这样的系统中,条带单元是:
n*db_block_size n是小于db_file_multiblock_read_count的值。细粒度条带化允许单个io请求被多个磁盘服务,细粒度的条带对单独的io请求获取了最大性能。
条带单元设置建议
Table 8-2 Minimum Stripe Depth
Table 8-3 Block Size Advantages and Disadvantages
Block Size | Advantages | Disadvantages |
---|---|---|
Smaller | Good for small rows with lots of random access. Reduces block contention. | Has relatively large space overhead due to metadata (that is, block header). Not recommended for large rows. There might only be a few rows stored for each block, or worse, row chaining if a single row does not fit into a block, |
Larger | Has lower overhead, so there is more room to store data. Permits reading a number of rows into the buffer cache with a single I/O (depending on row size and block size). Good for sequential access or very large rows (such as LOB data). | Wastes space in the buffer cache, if you are doing random access to small rows and have a large block size. For example, with an 8 KB block size and 50 byte row size, you waste 7,950 bytes in the buffer cache when doing random access. Not good for index blocks used in an OLTP environment, because they increase block contention on the index |