异步IO概念 Linux异步I/O(AIO)是Linux内核提供的一个增强特性。它是Linux2.6内核的标准特性,当然我们也可以在2.4内核的补丁中找到它。AIO背后的基本思想是允许进程启动许多I/O操作,而无需阻塞或等待任何操作完成。稍后或在收到I/O操作完成的通知时,进程可以检索I/O操作的结果。 LinuxIO模型(I/O模型)分为同步IO模型(synchronousmodels)和异步IO模型(asynchronousmodels)。在同步IO中,线程开始一个IO操作后立即进入等待状态,直到IO操作完成才唤醒继续执行。在异步IO模式下,线程向内核发送IO请求,然后继续处理其他事情。内核完成IO请求后,会通知线程IO操作完成 如果IO请求需要大量时间执行,异步文件IO方法可以显着提高效率,因为在这段时间里,线程在等待,CPU会调度其他线程去执行,如果没有其他线程执行,这个时间就被浪费了(操作系统的零页线程可能会被调度)。如果IO请求操作很快,使用异步IO方式效率低下,最好使用同步IO方式。 关于异步IO和同步IO的其他细节,可以参考文章BoostapplicationperformanceusingasynchronousI/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。 对于同步I/O,当向操作系统提交I/O请求时,写入过程将阻塞,直到确认写入完成。然后它可以继续处理。对于异步I/O,在提交和处理I/O请求的同时继续处理。尽可能使用异步I/O以避免瓶颈。 有些平台默认支持异步I/O,有些需要特殊配置,有些只支持某些底层文件系统类型的异步I/O。 问:2.AsynchronousI/O有什么好处? A:AsynchronousI/O在RedHatAdvancedServer上的实现允许Oracle进程通过一次系统调用向磁盘发出多个I/O请求,而不是一个大的单个I/O请求的数量。这通过两种方式提高了性能: 首先,因为一个进程可以将多个请求排队等待内核处理,所以内核可以通过记录请求或将磁盘上相邻的单个请求组合成更少和更大的请求来优化磁盘活动。 其次,因为系统不会在硬件处理请求时将进程置于睡眠状态。因此,该进程能够执行其他任务,直到I/O完成。 这涉及使用I/O功能,例如: 异步I/O:异步I/O不会减少流量,但允许进程在等待IO完成时做其他事情。 直接I/O(绕过操作系统的文件缓存):直接IO不会减少流量,但可以使用更短的代码路径/更少的CPU周期来执行IO。 启用启用 数据库Oracle9i版本2开始开始开始开始支持支持异步特性特性特性之前之前的的版本版本版本是是是是不不不不的,直达ORACLE10gR2才默认启动使用异常IO特性。 问:4.我可以在Oracle8i或Oracle9i第1版中使用异步I/O吗? A:否。异步I/O特性仅适用于OracleRDBMS9i第2版(Oracle9iR2)。 Q:5.默认情况下,异步I/O是否与OracleRDBMS一起使用? A:没有。默认情况下,Oracle9iR2和Oracle10gR1出厂时是禁用异步I/O支持的。在10gR2中asyncIO是默认启用的。 那么如何启用ORACLE数据库的异步IO特性呢?我们可以按照以下步骤进行: 1:首先确认ORACLE数据库所在的系统平台(操作系统)是否支持异步IO 目前流行的Linux/Unix平台基本上都支持异步IO,但是一些旧版本不一定。大家可以搜索相关文档了解清楚。 2:检查是否安装了libaio和libaio-devel相关包(libaio-devel包好像不是必须的,测试环境好像没有libaio-devel也不行,当然最好一起安装)[root@DB-Server~]#rpm-qa|grepaiolibaio-0.3.106-5libaio-0.3.106-5[root@DB-ServerServer]#rpm-ivhlibaio-devel-0.3.106-5.i386.rpmwarning:libaio-devel-0.3.106-5.i386.rpm:HeaderV3DSAsignature:NOKEY,keyID1e5e0159Preparing...############################################[100%]1:libaio-devel#############################################[100%][root@DB-ServerServer]#rpm-ivhlibaio-devel-0.3.106-5.x86_64.rpmwarning:libaio-devel-0.3.106-5.x86_64.rpm:HeaderV3DSAsignature:NOKEY,keyID1e5e0159Preparing...############################################[100%]1:libaio-devel#############################################[100%][root@DB-ServerServer]#rpm-qa|greplibaiolibaio-0.3.106-5libaio-devel-0.3.106-5libaio-devel-0.3.106-5libaio-0.3.106-5 3:检查是否有系统支持异步I/O 根据文档[Note370579.1],可以通过查看slabinfo统计信息来查看操作系统是否正在运行AIO。slab是linux的内存分配器,已经分配了AIO相关的内存结构。第二列和第三列的值不为0,即用了 [root@DB-Server~]#cat/proc/slabinfo|grepkio kioctx62110384101:tunables54278:slabdata11110 kiocb00256151:tunables120608:slabdata000 kiocb的第二列和第三列kiocb值不为0,说明系统开启了异步IO。如上图,表示异步I/O没有被使用。 kioctx和kiocb是定义在aio.h中的AsyncI/O数据结构。如果它显示非零值,则表示启用了异步io。源码加载/usr/src/linux-/include/linux/aio.h 4:修改优化系统内核参数 Linux从内核2.6开始取消了对IO大小的限制。Oracle建议将aio-max-nr的值设置为1048576或更高。 [root@DB-Server~]#cat/proc/sys/fs/aio-max-nr 65536 commandecho1048576>/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开始就不存在了。有关详细信息,请参阅文档KernelParameter"aio-max-size"doesnotexistinRHEL4/EL4/RHEL5/EL5(DocID549075.1)。 5:查看ORACLE软件是否支持开启AIO。 如下图输出值表示ORACLE软件支持开启AIO。其实从ORACLE9iR2开始,ORACLE就已经支持启用异步IO(AIO)了。不过10GR1之前的版本需要手动开启AIO,比较麻烦。[oracle@DB-Server~]$/usr/bin/ldd$ORACLE_HOME/bin/oracle|greplibaiolibaio.so.1=>/usr/lib64/libaio.so.1(0x00007f5a247f4000)[oracle@DB-Server~]$/usr/bin/nm$ORACLE_HOME/bin/oracle|grepio_geteventwio_getevents@@LIBAIO_0.4 6:在数据库级别启用异步I/O ,并设置参数disk_asynch_io为true。其实ORACLE10gR2defaults中的参数disk_asynch_io是true。SQL>altersystemsetfilesystemio_options=setallscope=spfile;Systemaltered.SQL>altersystemsetdisk_asynch_io=truescope=spfile;Systemaltered. 参数filesystemio_options有四个值:asynch,directio,setall,none。一般建议设置为setall。 您可以使用FILESYSTEMIO_OPTIONS初始化参数来启用或禁用文件系统文件上的异步I/O或直接I/O。此参数是特定于平台的,并且具有最适合特定平台的默认值。它可以动态更改以更新默认设置。 FILESYTEMIO_OPTIONS可以设置为以下值之一: ·ASYNCH:对文件系统文件启用异步I/O,对传输没有时序要求。对文件系统文件启用异步I/O,在有对数据传输没有时间要求。 ·DIRECTIO:在文件系统文件上启用直接I/O,绕过缓冲区缓存。 ·SETALL:启用文件系统文件上的异步和直接I/O。 启用文件系统文件上的异步和直接I/O。 ·NONE:禁用文件系统文件上的异步和直接I/O。 禁用文件系统文件上的异步和直接I/O。 设置完成后,重启数据库,验证异步IO特性是否开启。如下图,kiocb的第二列和第三列都是0,说明已经开启了ORACLE的异步IO特性。 [oracle@DB-Server~]$cat/proc/slabinfo|grepkio kioctx6080384101:可调参数54278:平板数据880 kiocb630256151:可调参数120608:平板数据220 [oracle@DB-Server~]$ 参考: http://www.ibm.com/developerworks/linux/library/l-async/index.html https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=73665184034240&parent=DOCUMENT&sourceId=223117.1&id=432854.1&_afrWindowMode=0&_adf.ctrl-state=11m9r3dm4l_242DocumentDis/?_afrLoop=73689176803264&parent=DOCUMENT&sourceId=471846.1&id=225751.1&_afrWindowMode=0&_adf.ctrl-state=11m9r3dm4l_291 http://blog.sina.com.cn/s/blog_465a4o1htmlsemiter.blog.51cto.com/1234477/1243325 本文转载自:http://www.cnblogs.com/kerrycode/ 作者:潇湘隐士 本文版权归作者所有,欢迎转载,但未经作者同意,此声明必须保留,并在文章页面显着位置给出原文链接。
