您好,登錄后才能下訂單哦!
在同步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了,那么很可能就會造成數據丟失。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。