1. 程式人生 > >Oracle資料庫中的非同步I/O

Oracle資料庫中的非同步I/O

linux 2.4以上是支援非同步IO了,oracle 10g r2開始都預設使用非同步IO了,關於非同步IO可以參考http://www.ibm.com/developerworks/cn/linux/l-async/,    非同步IO的好處小結如下:  Linux 非同步 I/O 是 Linux 核心中提供的一個相當新的增強。它是 2.6 版本核心的一個標準特性,但是我們在 2.4版本核心的補丁中也可以找到它。AIO 背後的基本思想是允許程序發起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍後或在接收到 I/O 操作完成的通知時,程序就可以檢索 I/O 操作的結果      1、檢查linux相關包  [[email protected] ~]# rpm -qa | grep aio  libaio-devel-0.3.106-3.2  libaio-0.3.106-3.2  libaio-devel-0.3.106-3.2  libaio-0.3.106-3.2  libsane-hpaio-1.6.7-4.1.el5_2.4  [[email protected] ~]# cat /proc/slabinfo | grep kio  kioctx                64     96    320   12    1 : tunables   54   27    8 : slabdata      8      8      0  kiocb                  0      0    256   15    1 : tunables  120   60    8 : slabdata      0      0      0  kiocb值的第二列和第三列非0即是已使用。  The kioctx and kiocb are Async I/O data structures that are defined in aio.h.  If it shows a non zero value that means async io is enabled.  source code loaded /usr/src/linux-<version>/include/linux/aio.h  從2.6 kernel開始,已經取消了對IO size的限制,Oracle建議將aio-max-nr的值設定為1048576或更高。  [
[email protected]
~]# echo 1048576 > /proc/sys/fs/aio-max-nr  2、檢查Oracle軟體是否開啟AIO支援。  [[email protected] ~]$ /usr/bin/ldd $ORACLE_HOME/bin/oracle | grep libaio  libaio.so.1 => /usr/lib64/libaio.so.1 (0x00002aaaac4a9000)  如上面顯示說明已經開啟  [[email protected] ~]$ /usr/bin/nm $ORACLE_HOME/bin/oracle | grep io_getevent  w
[email protected]
@LIBAIO_0.4  如上面顯示說明已經開啟  10GR1以前版本需要手動開啟AIO,relink一下。  cd $ORACLE_HOME/rdbms/lib  make -f ins_rdbms.mk async_on  make -f ins_rdbms.mk ioracle  關閉Oracle的非同步功能支援  cd $ORACLE_HOME/rdbms/lib  make -f ins_rdbms.mk async_off  3、開啟Oracle資料庫AIO功能的支援。  SQL> alter system set filesystemio_options = setall scope=spfile;  SQL> alter system set disk_asynch_io = true scope=spfile;  SQL> shutdown immediate  SQL> startup  4、檢視是否開啟  [
[email protected]
~]# cat /proc/slabinfo | grep kio  kioctx                64     96    320   12    1 : tunables   54   27    8 : slabdata      8      8      0  kiocb                 15     15    256   15    1 : tunables  120   60    8 : slabdata      1      1      0  非零說明已經開啟  補充:  在oracle裡為了提高io的速度,常用引數db_writer_processes 和 dbwr_io_slaves  在資料庫裡事務數非常高,或db cache很大,一個DBWn process跟不上資料的load,我們可以調整這兩個引數,這兩個  引數的作用就是增加io讀寫程序,啟用非同步io,加快io的速度  多個 slaves 可以並行寫資料檔案,而多個dbwr也可以並行寫資料檔案  一個 dbwr 多個 slaves是 dbwr 蒐集dirty  buffer 而 slaves 寫資料檔案  多個dbwr 可以並行地蒐集dirty buffer 並且並行地寫資料檔案  但是如果系統支援AIO一般不用設定多dbwr 或者 io slaves  db_writer_processes:在多cpu,多磁碟的環境,一般是每8個cpu一個dbwr程序  什麼時候配置這兩個引數  如果系統的io是瓶頸是,檢查os是否支援非同步io,如果支援非同步io,但目前沒有使用,那就啟用非同步io來緩解io瓶頸。如果os不支援非同步io,  或os已經啟用非同步io,但io還是瓶頸,那我們可以配置多個dbwr程序。配置這兩個引數是要注意,大都是如下  一個db_writer_processes,多個dbwr_io_slaves  多個db_writer_processes,dbwr_io_slaves不啟用