ORACLE数据库异步IO介绍

异步IO概念

   
Linux 异步 I/O (AIO)是 Linux 内核中提供的一个增强的功能。它是Linux 2.6
版本内核的一个标准特性,当然我们在2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O
操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。

   
Linux IO模型(I/O models)分同步IO模型(synchronous models)和异步IO模型(asynchronous
models)。
在同步IO中,线程启动一个IO操作然后就立即进入等待状态,直到IO操作完成后才醒来继续执行。而异步IO方式中,线程发送一个IO请求到内核,然后继
续处理其他的事情,内核完成IO请求后,将会通知线程IO操作完成了

   

如果IO请求需要大量时间执行的话,异步文件IO方式可以显著提高效率,因为在线程等待的这段时间内,CPU将会调度其他线程进行执行,如果没有其他线程
需要执行的话,这段时间将会浪费掉(可能会调度操作系统的零页线程)。如果IO请求操作很快,用异步IO方式反而还低效,还不如用同步IO方式。

   其它关于异步IO与同步IO的细节,可以参考Boost application performance using asynchronous I/O这篇文章,网上很多"Linux异步IO"的文章其实是翻译自这篇文章。如果了解更多关于异步IO的细节,可以细读这篇文章。

 

异步IO好处

 

 

异步I/O的优点:异步I/O是和同步I/O相比较来说的,如果是同步I/O,当一个I/O操作执行时,应用程序必须等待,直到此I/O执行完。相反,异
步I/O操作在后台运行,I/O操作和应用程序可以同时运行,提高了系统性能;使用异步I/O会提高I/O流量,如果应用是对裸设备进行操作,这种优势更
加明显, 因此像数据库,文件服务器等应用往往会利用异步I/O,使得多个I/O操作同时执行.
而且从官方文档来看,ORACLE也是推荐ORACLE数据库启用异步IO的这个功能的。

With
synchronous I/O, when an I/O request is submitted to the operating
system, the writing process blocks until the write is confirmed as
complete. It can then continue processing. With asynchronous I/O,
processing continues while the I/O request is submitted and processed.
Use asynchronous I/O when possible to avoid bottlenecks.

Some
platforms support asynchronous I/O by default, others need special
configuration, and some only support asynchronous I/O for certain
underlying file system types.

Q: 2. What are the benefits of Asynchronous I/O?

A:
The implementation of Asynchronous I/O on Red Hat Advanced Server
allows Oracle processes to issue multiple I/O requests to disk with a
single system call, rather than a large number of single I/O requests.
This improves performance in two ways:

  1. First,
    because a process can queue multiple requests for the kernel to handle,
    so the kernel can optimize disk activity by recording requests or
    combining individual requests that are adjacent on disk into fewer and
    larger requests.
  1. Secondary,
    because the system does not put the process in sleep state while the
    hardware processes the request. So, the process is able to perform other
    tasks until the I/O complete.

This involves making use of I/O capabilities such as:

  • Asynchronous
    I/O: Asynchronous I/O does not reduce traffic but allows processes to
    do other things while waiting for IO to complete.
  • Direct
    I/O (bypassing the Operating System's File Caches) : Direct IO does not
    reduce traffic but may use a shorter code path / fewer CPU cycles to
    perform the IO.

 

 

启用异步IO

  
ORACLE数据库是从ORACLE 9i Release 2开始支持异步IO特性的。之前的版本是不支持异步IO特征的。另外在ORACLE 9i
R2和 ORACLE 10g R1中默认是禁用异步特性的,直到ORACLE 10g R2才默认启用异步IO特性。

Q: 4. Can I use Asynchronous I/O with Oracle 8i or Oracle 9i release 1?

A: No. Asynchronous I/O feature is only available with Oracle RDBMS 9i release 2 (Oracle9iR2).

Q: 5. Is Asynchronous I/O active with Oracle RDBMS by default?

A:
No. By default, Oracle9iR2 and Oracle10gR1 are shipped with
asynchronous I/O support disabled.In 10gR2 asyncIO is enabled by
default.

那么如何启用ORACLE数据库的异步IO特性呢? 我们可以按照下面步骤操作:

 

1:首先要确认ORACLE数据库所在的系统平台(操作系统)是否支持异步IO

   目前流行的Linux/Unix平台基本上都支持异步IO,但是一些老旧的版本就不一定了。可以搜索一下相关文档了解清楚。

 

2: 检查是否安装libaio、libaio-devel相关包(似乎libaio-devel包不是必须的,测试环境没有libaio-devel似乎也OK,当然最好也一起安装)

[root@DB-Server ~]# rpm -qa | grep aio 
libaio-0.3.106-5
libaio-0.3.106-5
 
[root@DB-Server Server]# rpm -ivh libaio-devel-0.3.106-5.i386.rpm
warning: libaio-devel-0.3.106-5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...                ########################################### [100%]
   1:libaio-devel           ########################################### [100%]
[root@DB-Server Server]# rpm -ivh  libaio-devel-0.3.106-5.x86_64.rpm
warning: libaio-devel-0.3.106-5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...                ########################################### [100%]
   1:libaio-devel           ########################################### [100%]
 
[root@DB-Server Server]# rpm -qa | grep libaio
libaio-0.3.106-5
libaio-devel-0.3.106-5
libaio-devel-0.3.106-5
libaio-0.3.106-5

 

3:检查系统是否支持异步I/O

根据文档[Note 370579.1] ,可以通过查看slabinfo统计信息查看操作系统中AIO是否运行,slab是Linux的内存分配器,AIO相关的内存结构已经分配,kiocb值的第二列和第三列非0即是已使用


kiocb值的第二列和第三列非0表示系统已经启用异步IO。如上所示,表示异步I/O没有在使用。

The kioctx and kiocb are
Async I/O data structures that are defined in aio.h. If it shows a non
zero value that means async io is enabled. source code loaded
/usr/src/linux-<version>/include/linux/aio.h

 

4:修改、优化系统内核参数

Linux从2.6 kernel开始,已经取消了对IO size的限制,Oracle建议将aio-max-nr的值设置为1048576或更高。

[root@DB-Server ~]# cat /proc/sys/fs/aio-max-nr

65536

命令echo 1048576 >
/proc/sys/fs/aio-max-nr修改参数,只对当前环境有效,如果系统重启过后,则会使用默认值,所以最好修改参数文件/etc
/sysctl.conf。编辑/etc/sysctl.conf 添加或修改参数fs.aio-max-nr =
1048576,保存后。运行sysctl -p使之生效。

[root@DB-Serveruat ~]# cat /proc/sys/fs/aio-max-nr

1048576

注意aio-max-size参数从RHEL4开始已经不存在了,详情见文档Kernel Parameter "aio-max-size" does not exist in RHEL4 / EL4 / RHEL5 /EL5 (文档 ID 549075.1)

 

5:检查ORACLE软件是否支持开启AIO。

如下所示有输出值,表示ORACLE软件支持开启AIO,其实从ORACLE 9i R2开始,ORACLE就已经支持开启异步IO(AIO)了。不过10GR1以前版本需要手动开启AIO,相对而言要麻烦一些。

[oracle@DB-Server ~]$ /usr/bin/ldd $ORACLE_HOME/bin/oracle | grep libaio
        libaio.so.1 => /usr/lib64/libaio.so.1 (0x00007f5a247f4000)
[oracle@DB-Server ~]$  /usr/bin/nm $ORACLE_HOME/bin/oracle | grep io_getevent 
                 w io_getevents@@LIBAIO_0.4

 

6:数据库级别启用异步I/O

将参数disk_asynch_io设置为true,其实ORACLE 10g R2中参数disk_asynch_io默认是为true的。

SQL> alter system set filesystemio_options = setall scope=spfile; 
 
System altered.
 
SQL> alter system set disk_asynch_io = true scope=spfile; 
 
System altered.

关于参数filesystemio_options有四个值: asynch、directio, setall,none. 一般建议设置为setall比较合适。

You can use the FILESYSTEMIO_OPTIONS
initialization parameter to enable or disable asynchronous I/O or
direct I/O on file system files. This parameter is platform-specific and
has a default value that is best for a particular platform. It can be
dynamically changed to update the default setting.

FILESYTEMIO_OPTIONS can be set to one of the following values:

 

   · ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission.

            在文件系统文件上启用异步I/O,在数据传送上没有计时要求。

· DIRECTIO: enable direct I/O on file system files, which bypasses the buffer cache.

            在文件系统文件上启用直接I/O,绕过buffer cache。

· SETALL: enable both asynchronous and direct I/O on file system files.

            在文件系统文件上启用异步和直接I/O。

· NONE: disable both asynchronous and direct I/O on file system files.

           在文件系统文件上禁用异步和直接I/O。

 

设置完成后重启数据库,验证异步IO特性是否启用。如下所示, kiocb的第二、三列都不为0,表示ORACLE的异步IO特性已经启用。




 
时间: 2025-01-27 00:31:10

ORACLE数据库异步IO介绍的相关文章

连接oracle抛异常 o-java 连接 oracle数据库 抛 Io 异常 ... 求解啊!!

问题描述 java 连接 oracle数据库 抛 Io 异常 ... 求解啊!! import java.sql.*; public class TestJDBC { public static void main(String[] args) throws Exception{ Class.forName("oracle.jdbc.driver.OracleDriver"); //new oracle.jdbc.driver.OracleDriver(); Connection co

Oracle数据库服务器IO高的分析方案和案例探讨

Oracle数据库服务器IO高的分析方案和案例探讨   > >                &     

JDBC连接Oracle数据库出现Io 异常

环境:Oracle11g + MyEclipse 6.5 + JDK1.6 问题:JDBC连接Oracle数据库出现以下错误: java.sql.SQLRecoverableException: Io 异常: The Network Adapter could not establish the connection at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:101) at oracle.

Oracle数据库高级复制功能介绍

前言 日益增长的分布式应用需求要求实现更好分布式的软件环境,不断推动着分布式技术的进步.Oracle数据复制是实现分布式数据环境的一种技术,通过在不同的物理站点拷贝数据来建立分布式数据环境.它与分布式数据库不同,在分布式数据库中,虽然每个数据对象也对所有的站点可用,但是特定的数据对象只存在于一个特定的站点中.而数据复制实现所有的站点都有相同数据对象的可用拷贝. 在一个典型的分布式商业应用中经常需要把个地区的数据备份到总部的数据库中,一方面可以作为一种备份方式,另一方面也方便总部应用中的综合统计.

介绍了Oracle数据库锁的种类及研究

本文通过对Oracle数据库锁机制的研究,首先介绍了Oracle数据库锁的种类,并描述了实际应用中遇到的与锁相关的异常情况,特别对经常遇到的由于等待锁而使事务被挂起的问题进行了定位及解决,并对死锁这一比较严重的现象,提出了相应的解决方法和具体的分析过程. 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性. 加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某

oracle数据库最近两小时数据文件及io统计信息

select e.tsname, substr(e.filename, 1, 52) filename, e.phyrds - nvl(b.phyrds, 0) reads, (e.phyrds - nvl(b.phyrds, 0)) / (SELECT EXTRACT(DAY FROM E.END_INTERVAL_TIME - B.END_INTERVAL_TIME) * 86400 + EXTRACT(HOUR FROM E.END_INTERVAL_TIME - B.END_INTERV

oracle数据库表空间最近2小时的io统计信息

select e.tsname tsname, sum(e.phyrds - nvl(b.phyrds, 0)) reads, sum(e.phyrds - nvl(b.phyrds, 0)) / (SELECT EXTRACT(DAY FROM E.END_INTERVAL_TIME - B.END_INTERVAL_TIME) * 86400 + EXTRACT(HOUR FROM E.END_INTERVAL_TIME - B.END_INTERVAL_TIME) * 3600 + EXT

[数据库] Navicat for Oracle基本用法图文介绍

        引自百度百科:Navicat for Oracle是一套超强的Oracle数据库系统管理工具.它有极具巧思的图形化用户界面(GUI),让你可以快速且容易的以安全且简单的方法建立.组织.存取及共享资讯.Navicat for Oracle可以让用户连接本地/远端Oracle Server.提供一些实用的工具如数据/结构同步.导入/导出.备份及报表以协助管理数据的流程.        本文主要通过图文的方法介绍了Navicat for Oracle的基本用法,因为最近做J2EE项目涉

Oracle数据库的增删改操作介绍

前面的博文介绍了Oracle的简单查询操作,博客地址:http://blog.csdn.net/weixin_36380516/article/details/65935879 这里再对Oracle的更新操作即Oracle的增删改操作进行简单的介绍 首先要掌握对表结构的基本操作. 增加字段: alter table 表名 add(字段名 字段类型和长度) alter table table_name add(one_column varchar2(10)); 一次增加多个字段的话,每个字段直接以