db file async I/O submit 等待事件優化
db file async I/O submit 等待事件優化
一、資料發生db file async I/O submit
我們從資料庫awr報告中經常會看到很高db
file async I/O submit的等待事件:
-
SQL> select event,wait_class,wait_time from v$session_wait where wait_class<>'Idle'
EVENT WAIT_CLASS WAIT_TIME
-------------------------------- ----------- ----------
SQL*Net message to client Network -1
Data file init write User I/O 0
control file sequential read System I/O 0
db file sync I/O submit System I/O 79
二、分析db file async I/O submit
那麼從這個等待事件的名稱上來看,我們不難看出其和IO有關,IO分為如下:
同步IO:在同步IO中,執行緒啟動一個IO操作然後就立即進入等待狀態,知道IO操作完成後才繼續執行其他事情。
非同步IO:執行緒傳送一個IO請求到核心,然後繼續處理其它事情,內容完成IO請求後,將通知執行緒IO操作完成
IO總結:
如果IO請求需要大量時間執行的話,非同步檔案IO方式可以顯著提高效率,因為線上程等待的這段時間內,CPU將會排程其它執行緒進行執行,如果沒有其它執行緒需要執行的話,這段時間將會浪費掉(可能會排程作業系統的零頁執行緒)。如果IO請求操作很快,用非同步IO的方式更低效,此時同步IO會較優。
同步IO在同一時刻只允許一個IO操作,也就是說對於同一個檔案控制程式碼的IO操作是序列化的,及時使用兩個執行緒也不能同時對一個檔案控制程式碼同時發出讀寫操作。重疊IO允許一個活多個執行緒同事發出IO請求。
非同步IO在請求完成時,通過將檔案控制程式碼設為又訊號狀態來通知應用程式,或者應用程式通過GetOverlappedResult檢視IO請求是否完成,也可以通過一個事件物件來通知應用程式。
三、找出相關的引數
那麼我們看看有關非同步IO的設定:
在Oracle 11g當中,其預設值為如下:
-
SQL> select * from v$version;
-
-
BANNER
-
--------------------------------------------------------------------------------
-
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
-
PL/SQL Release 11.2.0.4.0 - Production
-
CORE 11.2.0.4.0 Production
-
TNS for Linux: Version 11.2.0.4.0 - Production
-
NLSRTL Version 11.2.0.4.0 - Production
-
-
SQL>
-
SQL> show parameter disk_asynch_io
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
disk_asynch_io boolean TRUE
-
SQL> show parameter filesystemio
-
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
- filesystemio_options string none
四、對於filesystemio_options引數的解釋:
You can use the FILESYSTEMIO_OPTIONS initialization parameter to enable or
disable asynchronous I/O or direct I/O on file system files. This parameter is
platform-specific and has a default value that is best for a particular
platform.
使用FILESYSTEMIO_OPTIONS初始化引數在檔案系統檔案上啟用或者禁用非同步I/O或者直接I/O。這個引數是平臺特有的,針對特定的平臺最好有個預設值。
FILESYTEMIO_OPTIONS can be set to one of the following values:
ASYNCH: enable
asynchronous I/O on file system files, which has no timing requirement for
transmission.
在檔案系統檔案上啟用非同步I/O,在資料傳送上沒有計時要求。
DIRECTIO: enable
direct I/O on file system files, which bypasses the buffer cache.
在檔案系統檔案上啟用直接I/O,繞過buffer cache。
SETALL: enable both asynchronous and
direct I/O on file system files.
在檔案系統檔案上啟用非同步和直接I/O。
NONE: disable
both asynchronous and direct I/O on file system files.
在檔案系統檔案上禁用非同步和直接I/O。
五、開啟非同步IO
這個時候我們通過如下語句開啟filesystemio_options非同步IO選項:
- SQL> alter system set filesystemio_options =asynch sid = ‘*’ scope=spfile;
六、重啟資料庫後檢查:
在Oracle11gR2中AIO預設已經是開啟的了。可以通過ldd或者nm來檢查oracle是否已經啟用了AIO支援,有輸出代表已經啟用。
-
[root@db02 ~]# grep kio /proc/slabinfo
-
kioctx 104 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0
-
kiocb 123 210 256 15 1 : tunables 120 60 8 : slabdata 14 14 0
-
[root@db02 ~]# su - oracle
-
[oracle@db02 ~]$ /usr/bin/nm $ORACLE_HOME/bin/oracle | grep io_getevent
- w io_getevents@@LIBAIO_0.4
/proc/sys/fs/aio-nr檔案提供了系統範圍非同步 I/O請求現在的數目。
/proc/sys/fs/aio-max-nr檔案是所允許的併發請求的最大個數。最大個數通常是 64KB,這對於大部分應用程式來說都已經足夠了。
檢查非同步I/O是否在使用
根據[Note 370579.1],可以通過檢視slabinfo統計資訊檢視作業系統中AIO是否執行,slab是Linux的記憶體分配器,AIO相關的記憶體結構已經分配,kiocb值的第二列和第三列非0即是已使用。與kernel 2.4.x不同,沒有顯示kiobuf,因為從kernel 2.5.43開始,kiobuf已經從核心中被移除。
kioctx:
AIO上下文在核心空間對應資料結構kioctx,它儲存非同步IO的所有資訊:
-
[oracle@db02 ~]$ grep kio /proc/slabinfo
-
kioctx 103 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0
- kiocb 134 195 256 15 1 : tunables 120 60 8 : slabdata 13 13 0
七、後記:
1、 使用作業系統cache:
作業系統和裝置控制器提供了資料庫快取,這些不直接與資料庫的快取管理相沖突。儘管如此,這些架構可能消耗資源當有很少的或沒有效能利益。當資料庫檔案儲存在Linux或者UNIX檔案系統上時,這種情況就顯而易見了。預設情況下,所有的資料庫I/O都要通過檔案系統的快取。
在一些Linux和UNIX系統上,直接I/O是可用的對於檔案儲存來說。這個協議允許資料庫檔案存取在檔案系統範圍內,繞過檔案系統快取。直接的I/O節約了CPU資源斌並且允許檔案系統快取是獨立的在沒有資料庫活動的時候,例如program texts 和spool files.
儘管作業系統的的cache經常是冗餘的因為資料庫的cache buffers blocks。在一些情況下,資料庫不能用database
buffer cache。在這些情況下,使用直接I/O或者裸裝置可能產生更嚴重的效能問題比使用系統的buffer。例如
· Reads or writes to the TEMP tablespace
· Data stored in NOCACHE LOBs
· Parallel Query slaves reading data
2、 相關引數介紹:
在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不啟用
八、參考:
- FILESYSTEMIO_OPTIONS (Reference)
- FILESYSTEMIO_OPTIONS (Performance Tuning Guide)
- Asynchronous I/O Support
- Direct I/O Support
- Asynchronous I/O
- Direct I/O Support
- Direct and Asynchronous I/O
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20674423/viewspace-1445522/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- db file async I/O submit 等待事件說明MIT事件
- db file async I/O submit等待事件的故障診斷MIT事件
- 等待事件:Disk file operations I/O事件
- oracle之 db file sequential read等待事件優化思想Oracle事件優化
- 【等待事件】等待事件系列(1)--User I/O型別事件型別
- db file scattered read等待事件事件
- db file sequential read等待事件事件
- 【等待事件】db file sequential read事件
- 【等待事件】db file scattered read事件
- 等待事件--db file scattered reads事件
- 等待事件--db file sequential reads事件
- I/O上的等待事件 —— control file sequential read/control file parallel write事件Parallel
- 詳解 db file sequential read 等待事件事件
- 【TUNE_ORACLE】等待事件之IO等待“db file parallel write”Oracle事件Parallel
- log file sync等待事件的成因及優化方法事件優化
- Oracle之 等待事件log file sync + log file parallel write (awr優化)Oracle事件Parallel優化
- 【TUNE_ORACLE】等待事件之IO等待“db file sequential read”Oracle事件
- 【TUNE_ORACLE】等待事件之IO等待“db file scattered read”Oracle事件
- 優化磁碟I/O優化
- 0322理解db file parallel read等待事件2Parallel事件
- 0316理解db file parallel read等待事件Parallel事件
- 非空閒的等待事件-db file scattered read事件
- Oracle db file parallel write 和 log file parallel write 等待事件 說明OracleParallel事件
- 等待事件db file sequential read、db file scattered read和direct read的區別事件
- 非空閒等待事件之:db file scattered read(轉)事件
- 何時會發生db file sequential read等待事件?事件
- db file sequential read wait event等待事件之二AI事件
- log file sync等待事件事件
- 【等待事件】log file sync事件
- LOG FILE SWITCH等待事件事件
- log file sync" 等待事件事件
- [Oracle Script] check File I/OOracle
- db file sequential read及優化優化
- "log file sync"等待事件-2事件
- "log file sync"等待事件-1事件
- 等待事件 log file sync 小解事件
- goldengate extract abended unable to queue I/O, I/O beyond file sizeGo
- 【kingsql分享】何時出現生db file sequential read等待事件SQL事件