ITPub博客

首页 > Linux操作系统 > Linux操作系统 > direct IO和AIO

direct IO和AIO

原创 Linux操作系统 作者:myownstars 时间:2012-04-09 20:37:09 0 删除 编辑
Raw device
相较于block device,I/O操作不需要OS buffer cache,消除了文件系统buffer带来的额外开销(inodes/free list);
配置RAC若没有使用OCFS/NFS,则所有的文件必须存放在raw device上以便共享;
不同的raw partitions应该位于不同的磁盘,以避免竞争;
数据文件必须要比所在的raw partition略小,至少要空出2个数据块以保存OS信息;
Linux最多可以使用255个raw devices(/dev/raw);
既支持direct I/O又支持AIO

Direct I/O
当oracle使用文件系统的buffer时,读取数据块时须经历如下步骤 :disk -> 文件系统buffer -> oracle buffer,有时候也会带来性能提升,比如当oracle发生物理读时,有可能从文件系统buffer获取该数据块,避免了真正的磁盘读;
因此并非所有情形都适用direct IO,写密集的文件(redo log/temp file)适合单独放在raw device上;
从oracle10R2起,数据文件默认启用direct IO,以避免内核开销;
 
AIO
Linux 2.6新特性,当应用发起I/O请求,在等待I/O操作时可以去执行别的任务;
oracle 9.2开始支持AIO
Disk_asynch_io:决定数据文件是否开启async I/O
Filesystemio_options:依赖于disk_asynch_io参数的设置,提供更细粒度的管理;比如当disk_asynch_io设置为true时,可以让裸设备使用async I/O的同时对文件系统禁用此功能;该参数可有如下4种设置:
1. "asynch" : means buffered I/O + Async I/O,enable asynchronous I/O on file system files
2. "directIO" : means Direct I/O only,enable direct I/O on file system files
3. "setall" : means Direct I/O + Async I/O,enable both asynchronous and direct I/O on file system files
4. "none" : disables Async I/O and Direct I/O
如要对oracle开启AIO,还需要编译binary
cd to $ORACLE_HOME/rdbms/lib
a) make -f ins_rdbms.mk async_on
b) make -f ins_rdbms.mk ioracle

适用场景:
1 Raw device
2使用O_DIRECT选项open的文件系统,诸如ext2/ext3/jfs/xfs
3 AIO不适用于sockets
注:O_DIRECT,Open()用到的一个flag,开启块设备的直接读写,与libaio/librt一起协同工作;
 
如何检查系统使用了direct I/O
使用strace跟踪dbwr进程,与此同时打开一个datafile
$ strace -o /tmp/strace_dbwr.out -p
如果使用了direct I/O,则显示
...
156 open("/emea/bde/32bit/app/oracle/oradata/EMB111W3/system01.dbf", O_RDWR|O_SYNC|O_DIRECT|O_LARGEFILE) = 13
...
 
如何检查系统使用了AIO
slabinfo维护了内存中的object信息,通过查看它可以获知
$ cat /proc/slabinfo | grep kio
If Async I/O is enabled:
$ cat /proc/slabinfo | grep kio
kioctx 270 270 128 9 9 1 : 252 126
kiocb 66080 66080 96 1652 1652 1 : 252 126
kiobuf 236 236 64 4 4 1 : 252 126
同时dbw0的strace日志显示如下
...io_submit(3071864832, 1, {{0xb7302e34, 0, 1, 0, 21}}) = 1gettimeofday({1176916625, 58882}, NULL) = 0io_getevents(-1223102464, 1, 1024, {{0xb7302e34, 0xb7302e34, 8192, 0}}, {600, 0}) = 1...
如果没有开启AIO,则为以下形式
...pwrite64(21, "\6\242\0\0004\21\300\0\220B\243\0\0\0\1\6\207\357\0\0\1"..., 8192, 36077568) = 8192times(NULL) = 1775653082times(NULL) = 1775653082pwrite64(21, "\6\242\0\0<\21\300\0\220B\243\0\0\0\1\6\254\0\0\0\2\0*"..., 8192, 36143104) = 8192...

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-720749/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3102903