概述
前面针对awr报告的几个等待事件做了详细介绍,今天主要总结了oracle数据库I/0相关的等待事件和Oracle 数据库 I/O 相关竞争等待的处理方法。
![4a1ea59e9b5938f2bbc85c139dee083e.png](https://i-blog.csdnimg.cn/blog_migrate/8856fdc6b20e08312f0bf3ab19541b65.jpeg)
oracle数据库I/0相关的等待事件
1、数据文件 I/O 相关的等待事件包括以下:
db file sequential read(数据文件顺序读)
db file scattered read(数据文件多块读)
db file parallel read(数据文件并行读)
direct path read
direct path write
direct path read (lob)
direct path write (lob)
2、控制文件 I/O 相关的等待事件包括以下:
control file parallel write
control file sequential read
control file single write
3、重做日志文件 I/O 相关的等待事件包括以下:
log file parallel write
log file sync
log file sequential read
log file single write
switch logfile command
log file switch completion
log file switch (clearing log file)
log file switch (checkpoint incomplete)
log switch/archive
log file switch (archiving needed)
4、高速缓存区 I/O 相关的等待事件包括以下:
db file parallel write
db file single write
write complete waits
free buffer wait
下面介绍Oracle 数据库 I/O 相关竞争等待的处理方法
1、优化Oracle数据库的SQL语句来减少数据库对I/O的需求:
如果数据库没有任何用户的SQL运行的话,一般来说只会产生很少的磁盘I/O或者几乎没有磁盘I/O,基本上来说数据库产生I/O的最终原因都是直接或者间接的由于用户执行SQL语句导致的。
这也就意味着可以控制单个SQL语句避免其产生大量的I/O来减少整个数据库对磁盘I/O的需求,通过优化SQL语句改变其执行计划以便让其产生尽可能少的I/O。
一般典型的存在问题的情况仅仅只是很少的几个SQL语句,但是由于其相应的执行计划不理想,会导致产生大量的物理磁盘I/O,从而使得整个数据库的性能非常之差。因此,让用户执行的SQL语句优化产生比较好的执行计划来减少磁盘I/O是一种非常行之有效的方法。
2、调整实例的初始化参数来减少数据库的I/O需求:
一般来说可以通过两种途径:
2.1、通过内存缓存来减少I/O。
数据库的I/O分为两种,一种是实际读取了数据文件的物理I/O,一种是从缓存中读取数据的逻辑I/O,可以通过使用一定数量的内存缓存来减少物理I/O(例如高速缓存区、日志缓存区以及各种排序区等等)。适当的增大高速缓存区,可以有更多的缓存供给数据库的进程使用,从缓存中读取所需要的数据,这样产生的I/O都是逻辑I/O,而不是直接从物理磁盘上读取数据,减少了物理I/O的产生。设置一个适当的排序区,可以减少在排序操作中读取临时表空间数据文件所在磁盘的次数,而尽可能多的使用缓存中的排序区来排序。其他的缓存区的工作原理基本都是一致的,都是通过使用缓存来减少读取物理磁盘的次数来降低I/O。
PS:这里顺便介绍下怎么看高速缓存区是不是值得优化
--测量Database Buffer Cache的性能select 1 - ((physical.value - direct.value - lobs.value) / logical.value) "Buffer Cache Hit Ratio" from v$sysstat physical, v$sysstat direct, v$sysstat lobs, v$sysstat logical where physical.name = 'physical reads' and direct.name = 'physical reads direct' and lobs.name = 'physical reads direct (lob)' and logical.name = 'session logical reads';
![0056a9b973c3a7f3b25f869f0d9d07a5.png](https://i-blog.csdnimg.cn/blog_migrate/036ee14dec6f4a59777ab2c0ce537985.jpeg)
当>90%则说明调整充分的。命中率是高的,如果低于90%就需要优化高速缓存区了。
2.2、调整一次读取多个BLOCK的大小
单独的一次多个BLOCK读取的操作的大小是由实例的初始化参数db_file_multiblock_read_count来控制的。如果执行比较大的I/O操作,一次读取的多个BLOCK大小越大,所需要的时间就会越短。
Oracle 10gR2以后会根据相应的操作系统及buffer cache以最优化的方式来自动设定该参数的值。通常情况下该值为1MB/db_block_size。
在最大I/O为1MB的情况下,block的大小为8KB,则参数的值为128。如果在最大I/O为64KB,block为8KB,则参数的值为8。
对于OLTP和batch环境该参数的值为4到16,DSS环境应设置大于16以上或大的值。
该参数的变化对数据库性能产生整体性的影响,过大的设置会导致大量SQL访问路径发生变化,如原先的索引扫描倾向于使用全表扫描。
因此,在配置数据库初始化参数的时候,根据操作系统的I/O吞吐能力都会设置的一次读取多个BLOCK的大小尽量多,以减少读取I/O的次数。
![d33ff11fbc65b56f9040bd6cfd70f89f.png](https://i-blog.csdnimg.cn/blog_migrate/06cee4f61f6eee6344eb0f55602bb617.jpeg)
3、在操作系统级别上优化I/O:
在操作系统级别上优化磁盘的I/O,以提高I/O的吞吐量,如果操作系统支持异步I/O,尽量去使用异步I/O;还可以使用高级文件系统的一些特性,例如直接I/O读取,忽略掉操作系统的文件缓存,也就是我们平时所说的使用裸设备。还有一种可行的方法是增大每次传输的最大I/O大小的限制,以便每次能够传输的I/O尽可能的大。
4、通过使用RAID、SAN、NAS来平衡数据库的I/O:
4.1、RAID
RAID是Redundent Array of Independent Disks的缩写,直译为"廉价冗余磁盘阵列",也简称为"磁盘阵列"。RAID的优点是传输速率高并且可以提供容错功能。在RAID中,可以让很多磁盘驱动器同时传输数据,而这些磁盘驱动器在逻辑上又是一个磁盘驱动器,所以使用RAID可以达到单个磁盘驱动器几倍、几十倍甚至上百倍的速率。因为普通磁盘驱动器无法提供容错功能,如果不包括写在磁盘上的CRC(循环冗余校验)码的话。RAID容错是建立在每个磁盘驱动器的硬件容错功能之上的,所以它提供更高的安全性。
RAID分为以下几个级别:
RAID 0: RAID 0并不是真正的RAID结构,没有数据冗余. RAID 0连续地分割数据并并行地读/写于多个磁盘上.因此具有很高的数据传输率.但RAID 0在提高性能的同时,并没有提供数据可靠性,如果一个磁盘失效,将影响整个数据.因此RAID 0不可应用于需要数据高可用性的关键应用。
RAID 1: RAID 1通过数据镜像实现数据冗余,在两对分离的磁盘上产生互为备份的数据. RAID 1可以提高读的性能,当原始数据繁忙时,可直接从镜像拷贝中读取数据.RAID 1是磁盘阵列中费用最高的,但提供了最高的数据可用率.当一个磁盘失效,系统可以自动地交换到镜像磁盘上,而不需要重组失效的数据。
RAID 2:从概念上讲, RAID 2同RAID 3类似,两者都是将数据条块化分布于不同的硬盘上,条块单位为位或字节.然而RAID 2使用称为"加重平均纠错码"的编码技术来提供错误检查及恢复.这种编码技术需要多个磁盘存放检查及恢复信息,使得RAID 2技术实施更复杂.因此,在商业环境中很少使用。
RAID 3:不同于RAID 2, RAID 3使用单块磁盘存放奇偶校验信息.如果一块磁盘失效,奇偶盘及其他数据盘可以重新产生数据.如果奇偶盘失效,则不影响数据使用.RAID 3对于大量的连续数据可提供很好的传输率,但对于随机数据,奇偶盘会成为写操作的瓶颈。
RAID 4:同RAID 2, RAID 3一样, RAID 4, RAID 5也同样将数据条块化并分布于不同的磁盘上,但条块单位为块或记录. RAID 4使用一块磁盘作为奇偶校验盘,每次写操作都需要访问奇偶盘,成为写操作的瓶颈.在商业应用中很少使用。
RAID 5: RAID 5没有单独指定的奇偶盘,而是交叉地存取数据及奇偶校验信息于所有磁盘上.在RAID5上,读/写指针可同时对阵列设备进行操作,提供了更高的数据流量. RAID 5更适合于小数据块,随机读写的数据.RAID 3与RAID 5相比,重要的区别在于RAID 3每进行一次数据传输,需涉及到所有的阵列盘.而对于RAID 5来说,大部分数据传输只对一块磁盘操作,可进行并行操作.在RAID 5中有"写损失