详细讲解Oracle I/O子系统的配置和设计

  • 来源: 赛迪网 作者: 若水   2008-05-10/21:42
  • 很多人都知道,Oracle IO子系统是数据库中一个非常重要的组成部分。 由于很多软件系统的瓶颈都是由DISK IO引起的,系统花费了大量的CPU_TIMES用于等待I/O行为的完成。
    我们设计数据库的IO子系统的时候,应该考虑以下因素:
    ■ 存储,最小的磁盘容量
    ■ 可用性,诸如(24 x 7) 不间断的服务
    ■ 性能,诸如I/O的吞吐量和系统响应时间
    基本的IO设计
    使用操作系统或者硬件来条带化文件存储,如果你的操作系统有类似LVM和硬件striping,的化,那么使用它们来尽可能的分散IO。在striping中,要考虑两个要素:stripe width 和stripe depth
    ■ Stripe depth 指的stripe的大小,也被称为stripe unit。
    ■ Stripe width 指的stripe depth 和 stripe设定中驱动器的数目的乘积。
    Oracle数据库中,一个合理的stripe depths 应该在256KB到1M。不同类型的应用需要不同stripe depth,最理想的stripe depth 和 stripe width应该考虑以下:
    ■ I/O请求的大小
    ■ 同时发生I/O
    ■ Physical Stripe Boundaries 和 Block Size Boundaries
    ■ Manageability of the Proposed System
    I/O请求的大小
    下面是在配置I/O会用DB和OS参数:
    DB_BLOCK_SIZE:单块I/O请求的大小,也被用于诊断多块I/O请求。
    OS block size:操作系统块的大小
    Maximum OS I/O size:OS能提供的最大单块I/O的大小
    DB_FILE_MULTIBLOCK_READ_COUNT:它和DB_BLOCK_SIZE的积用于计算全表扫描最大I/O,注意能超过OS限制。默认为8。
    SORT_AREA_SIZE:排序操作需要的I/O大小
    HASH_AREA_SIZE:hash操作需要的I/O大小
    出了I/O大小外,并发度也决定了stripe的depth。在选择stripe width和stripe depth的时候请考虑以下因素:
    ■在低并发的系统中,确保在同一磁盘上不会发生重复单一的I/O。这是什么意思呢?例如,假设stripe width有4个磁盘,stripe depth
    是32KB,这时候Oracle server process发出一个1MB的I/O请求,那么每个磁盘都会返回8次I/O请求。为了尽量避免这种情况,平均I/O请求的大小应该小于stripe width×stripe depth,在这里是32KB×4,否则就会在一个磁盘发生第二次I/O。
    这是完全理想化的设计。
    ■在高并发的系统中,要确保单一的I/O请求会被分散到多个物理I/O中完成,如果不行,则会严重的影响系统响应时间。
    并发的I/O
    在OLTP系统中,特点是高并发和低I/O需求,这时最好Stripe depth大于一个单独I/O的大小,这种被称为粗颗粒stripe。
    在高并发的系统中,一般stripe depth设计为n×DB_BLOCK_SIZE,n>1.
    粗颗粒stripe设计使得磁盘可以以队列的方式同时执行多个I/O,这样就可以以最小的成本处理大量的并发I/O。不过,一旦系统不具备并发足够并发,就会导致磁盘热点#p#分页标题#e#
    粗颗粒stripe设计也同样有益于DSS系统,但它应该设计得小一点,同样它大小也为n×DB_BLOCK_SIZE,但n应该小于DB_FILE_MULTIBLOCK_READ_COUNT。
    而细颗粒设计能够获得最好的响应时间。
    Alignment of Physical Stripe Boundaries with Block Size Boundaries
    如果物理stripe颗粒和块大小一致的化,就可能会导致一个单独I/O分散到两个物理IO中。这不是最优化的OLTP环境,所以stripe最好是两倍BLOCK的大小。下面是关于大小的建议
    Random reads and writes 两倍BLOCK大小
    Sequential reads 两倍DB_FILE_MULTIBLOCK_READ_COUNT×DB_BLOCK_SIZE
    Manageability of the Proposed System
    使用LVM可以更加容易配置所有可用磁盘的stripe,在大多数环境下,单卷就可以提供良好的性能。不过单卷只在使用RAID技术的时候可用,如RAID 1,不过丢失一个卷卷意味着丢失所有卷
    除了了性能以外,还有一个问题要考虑,那就是数据的增加要容易扩展。
    手工分布I/O
    如果你的系统不能做stripe,那么你就要手工配置你文件来达到尽量均匀分布I/O的目的。
    1.检查磁盘和文件的大小,估计数据库的存储需求
    2.为每个文件预估I/O,分辨出高I/O和低I/O的文件,将它们分布到磁盘组中。
    这里存在一个误解,就是把index和data分开,这是不恰当的。因为在一个事务的过程中,是先访问索引,再访问表,它们是有序的,所以在同一磁盘中是没有竞争的。这个是很多人都曾经误解的,包括我。
    什么时候需要分割文件
    这个问题很简单,当I/O需求已经不能被满足的时候,将可能需要分割文件。
    I/O热点一般发生在table、index或者TEMP TABLESPACE,造成I/O过高的大多数原因是由于SQL,这个时候需要做SQL tuning。其它:
    Redo log file如果发生很高的I/O,考虑把它们单独放置到一个磁盘,或者分布到几个磁盘,这样还可以提高可用性。
    stripe它们的存储环境。避免使用RAID5。
    archived redo log,如果归档慢,则要考虑归档进程和LGWR的竞争。
    建议
    stripe所有的磁盘
    移动归档文件到不同的磁盘
    移动在线日志到单独的磁盘
    使用Oracle管理文件可以获得更多益处。
    最后,讲一讲数据块大小的选择
    8K是适合于大多是系统的,但是有时候OLTP系统使用更小,DSS使用更大的数据块可以提供更优的性能。
    READS
    如何行比较小,访问比较随机,选择较小的块
    如果行比较小,访问是连续的,选择较大的块
    如果行比较小,访问情况复杂,尽量选择较大的块
    如果行比较大,包含诸如LOB类型的字段,那么选择较#p#分页标题#e#大块WRITES
    在一个高并发的OLTP系统中,使用一个大块,那么要慎重的考虑INITRANS,
    MAXTRANS, 和FREELISTS设置。这些参数影响到一个块的并发更新率。不过,如果你使用自动段空间管理,则不用考虑FREELISTS。如果你还是不能确定块的大小,那么就使用8K,如果你大量使用LOB类型,那么就可以大于8k。
    小结:一般来说,小块减少锁竞争,适合随机访问,但是元数据管理需要很大的头空间,不适合大行,容易产生行链。大块,可以存储更多的数据,减少管理开销,适合连续的访问和存储LOB类型,但是浪费空间大,不适合存储OLTP系统的索引,因为很容易产生索引叶子块的相互竞争。

    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多