direct IO和AIO

myownstars發表於2012-04-09
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

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15480802/viewspace-720749/,如需轉載,請註明出處,否則將追究法律責任。

相關文章