欢迎光临
我们一直在努力

oracle 异步IO简述

       在同步IO中,线程启动一个IO请求之后就进入等待状态,知道IO结束后线程才结束等待,转而去处理其他请求。异步IO将IO请求发送到内核后就不管了,无需等待IO操作完成,就去处理其他事情了。异步IO可以提高性能。但是显而易见的是对磁盘处理IO能力有较高要求,否则提交的处理请求多,处理能力跟不上,根本无法达到提高性能的要求。异步IO需要Linux内核是2.6版本。

检查操作系统是否启用异步IO:

cat /proc/slabinfo | grep kio

kioctx                29     40    384   10    1 : tunables   54   27    8 : slabdata      4      4      0

kiocb                  0      0    256   15    1 : tunables  120   60    8 : slabdata      0      0      0

kiocb前两个值是0,表明异步IO没有启用。

要启用异步IO,需要两个参数配合:

alter system set filesystemio_options=setall scope=spfile;

alter system set disk_asynch_io = true scope=spfile;   –默认就是开启的

disk_asynch_io开启后还需要filesystemio_options也开启,不然还是不会启用,类似双开关。这种默认情况会出现db file async I/O submit等待事件。

filesystemio_options参数有四个值:

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

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

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

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

如果disk_asynch_io=false的话还可以设置参数dbwr_io_slaves为一个大于0的值来模仿异步io。

内核参数中,fs.aio-max-nr参数指的是可以同时拥有的的异步IO请求数目。oracle建议大于等于1048576。

root@bd-dev-mingshuo-183:/home/oracle#more /etc/sysctl.conf |grep aio

fs.aio-max-nr = 1048576

SQL> sho parameter disk_asynch_io

NAME                                 TYPE        VALUE

———————————— ———– ——————————

disk_asynch_io                       boolean     TRUE

SQL> sho parameter filesystem

NAME                                 TYPE        VALUE

———————————— ———– ——————————

filesystemio_options                 string      none

root@bd-dev-mingshuo-183:/home/oracle#ps -ef|grep dbw

root      5068  4412  0 16:56 pts/5    00:00:00 grep dbw

oracle   10201     1  0 Jul11 ?        00:02:41 ora_dbw0_mingdb

root@bd-dev-mingshuo-183:strace -p 10201 -o /home/oracle/dbwn.trc

写入一些数据:

SQL> create table test_io as select * from user_objects;

SQL> update test_io set object_id=11 ;

SQL>  select file_no,filetype_name,asynch_io from v$iostat_file;

   FILE_NO FILETYPE_NAME                ASYNCH_IO

———- —————————- ———

         0 Other                        ASYNC_OFF

         0 Control File                 ASYNC_OFF

         0 Log File                     ASYNC_OFF

         0 Archive Log                  ASYNC_OFF

         0 Data File Backup             ASYNC_OFF

         0 Data File Incremental Backup ASYNC_OFF

         0 Archive Log Backup           ASYNC_OFF

         0 Data File Copy               ASYNC_OFF

         0 Flashback Log                ASYNC_OFF

         0 Data Pump Dump File          ASYNC_OFF

         0 External Table               ASYNC_OFF

   FILE_NO FILETYPE_NAME                ASYNCH_IO

———- —————————- ———

         1 Data File                    ASYNC_OFF

         1 Temp File                    ASYNC_OFF

         2 Data File                    ASYNC_OFF

         2 Temp File                    ASYNC_OFF

         3 Data File                    ASYNC_OFF

         3 Temp File                    ASYNC_OFF

         4 Data File                    ASYNC_OFF

         5 Data File                    ASYNC_OFF

         6 Data File                    ASYNC_OFF

         7 Data File                    ASYNC_OFF

         8 Data File                    ASYNC_OFF

   FILE_NO FILETYPE_NAME                ASYNCH_IO

———- —————————- ———

         9 Data File                    ASYNC_OFF

        10 Data File                    ASYNC_OFF

        11 Data File                    ASYNC_OFF

        14 Data File                    ASYNC_OFF

        15 Data File                    ASYNC_OFF

27 rows selected.

修改参数并重启

alter system set filesystemio_options=setall scope=spfile;

startup force  –测试环境,暴力了一点。

重启后再写入一些数据

root@bd-dev-mingshuo-183:/home/oracle#ps -ef|grep dbw

oracle    5137     1  0 16:59 ?        00:00:00 ora_dbw0_mingdb

root      5374  4412  0 16:59 pts/5    00:00:00 grep dbw

strace -p 5137 -o /home/oracle/dbwn_aio.trc

对比两种情况下的trace文件:

同步IO:

root@bd-dev-mingshuo-183:/home/oracle#more dbwn.trc |grep pwrite

pwrite(267, "\2\242\0\0FW\202\1\326\351;\0\0\0\10\4j\257\0\0\207\0\35\0\211\0\0\0\"\0\f\f"…, 8192, 1256767488) = 8192

pwrite(267, "\2\242\0\0\360g\202\1\275\351;\0\0\0\2\4X\17\0\0\235\0\0\0\213\0\0\0\37\00099"…, 8192, 1291714560) = 8192

pwrite(267, "\2\242\0\0\303\177\202\1\276\351;\0\0\0\2\4\351\367\0\0\254\0\31\0\212\0\0\0 \00011"…, 8192, 1341677568) = 8192

pwrite(267, "\2\242\0\0\260\213\202\1\270\351;\0\0\0\4\4\263_\0\0&\1\31\0006\0\0\0\21\0&&"…, 8192, 1366687744) = 8192

异步IO:

more /home/oracle/dbwn_aio.trc|grep io_

io_submit(140219848069120, 1, {{data:0x7f8775482ed0, pwrite, filedes:262, str:"\6\242\0\0\3Y\0\1\246z=\0\0\0\1\6\246\310\0\0\2\0\0\0\322\"\0\0\245z=\0"…, nbytes:8192, offset:186671104}}) = 1

io_getevents(140219848069120, 1, 128, {{0x7f8775482ed0, 0x7f8775482ed0, 8192, 0}}, {600, 0}) = 1

io_submit(140219848069120, 1, {{data:0x7f8775482ed0, pwrite, filedes:262, str:"\6\242\0\0\360j\0\1\246z=\0\0\0\1\6\257\337\0\0\1\36@\0\323\"\0\0\245z=\0"…, nbytes:8192, offset:224264192}}) = 1

io_getevents(140219848069120, 1, 128, {{0x7f8775482ed0, 0x7f8775482ed0, 8192, 0}}, {600, 0}) = 1

io_submit(140219848069120, 1, {{data:0x7f8775482ed0, pwrite, filedes:262, str:"\6\242\0\0\177D\0\1\246z=\0\0\0\1\6\305\207\0\0\2\0\0\0\324\"\0\0\245z=\0"…, nbytes:8192, offset:143646720}}) = 1

io_getevents(140219848069120, 1, 128, {{0x7f8775482ed0, 0x7f8775482ed0, 8192, 0}}, {600, 0}) = 1

pwrite代表同步IO。

io_submit/io_getevents代表异步IO。io_submit代表一次异步IO请求,io_getevents获得IO处理结果。获取结果的目的是将结果写入io_event,而且在io_submit和io_getevents之间还有很多步骤,并不是这里看到的请求了还在继续等待,好像与异步IO相违背,其实并没有。

开启异步IO后:

SQL> select file_no,filetype_name,asynch_io from v$iostat_file;

   FILE_NO FILETYPE_NAME                ASYNCH_IO

———- —————————- ———

         0 Other                        ASYNC_OFF

         0 Control File                 ASYNC_OFF

         0 Log File                     ASYNC_OFF

         0 Archive Log                  ASYNC_OFF

         0 Data File Backup             ASYNC_OFF

         0 Data File Incremental Backup ASYNC_OFF

         0 Archive Log Backup           ASYNC_OFF

         0 Data File Copy               ASYNC_OFF

         0 Flashback Log                ASYNC_OFF

         0 Data Pump Dump File          ASYNC_OFF

         0 External Table               ASYNC_OFF

   FILE_NO FILETYPE_NAME                ASYNCH_IO

———- —————————- ———

         1 Data File                    ASYNC_ON

         1 Temp File                    ASYNC_ON

         2 Data File                    ASYNC_ON

         2 Temp File                    ASYNC_ON

         3 Data File                    ASYNC_ON

         3 Temp File                    ASYNC_ON

         4 Data File                    ASYNC_ON

         5 Data File                    ASYNC_ON

         6 Data File                    ASYNC_ON

         7 Data File                    ASYNC_ON

         8 Data File                    ASYNC_ON

   FILE_NO FILETYPE_NAME                ASYNCH_IO

———- —————————- ———

         9 Data File                    ASYNC_ON

        10 Data File                    ASYNC_ON

        11 Data File                    ASYNC_ON

        14 Data File                    ASYNC_ON

        15 Data File                    ASYNC_ON

27 rows selected.

数据文件和临时文件都变成异步方式了,不过还是有一些文件仍然是同步,这可能是因为不能丢数据的缘故。比如日志文件如果启用异步IO了,那么很可能就会造成数据丢失。

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。