實踐真知:使用ASM和文件係統的數據庫在AIO上有何不同?
張大朋(Lunar)Oracle 資深技術專家
Lunar 擁有超過十年的 ORACLE SUPPORT 從業經驗,曾經服務於ORACLE ACS部門,現就職於 ORACLE Sales Consultant 部門,負責的產品主要是 Exadata,Golden Gate,Database 等。
編輯說明:在Oracle數據庫中,很多概念在悄悄的發生變化,而如果缺乏實踐和動手驗證,你可能離真相會越來越遠。從文件係統到ASM,Oracle的異步IO參數也在發生不斷變化。
昨天客戶的一個重要應用切換到新的係統環境上,今天觀察,發現部分異常等待:
從OS的CPU負載來看,定期會出現一個峰值,從ASH中可以看出,這個峰值對應的等待事件跟AWR的完全吻合。
因此,主要懷疑兩個東西:
1,應用的SQL和對象的屬性(比如table或者index的統計信息,並行度等等……)
2,係統的AIO設置
上麵的第一條,已經提交給開發相應的SQL和其他信息;第二條,因為係統以前是11.2 RAC,使用了ASM,而現在是單機文件係統.
因此對比了這兩種環境下AIO的異同,結論如下:
1,Linux下,ASM數據庫和文件係統數據庫的AIO設置差別:
----(1). ASM的AIO屬性是不受 FILESYSTEMIO_OPTIONS 參數的影響(因為ASM會繞過文件係統buffer),隻跟DISK_ASYNCH_IO有關係
----(2). 文件係統的AIO屬性跟 FILESYSTEMIO_OPTIONS 和 DISK_ASYNCH_IO 都有關係
2,FILESYSTEMIO_OPTIONS=NONE : Bug 6733627 – Unaccounted Wait Time on “Direct Path” operations with FILESYSTEM_IO_OPTIONS=NONE (Doc ID 6733627.8)
3, db file async I/O submit’相關內容:
‘db file async I/O submit’ when FILESYSTEMIO_OPTIONS=NONE (Doc ID 1274737.1) —詳細講述了 ‘db file async I/O submit’ 和 FILESYSTEMIO_OPTIONS=NONE的關係
當文件係統設置了FILESYSTEMIO_OPTIONS=NONE時,會出現“db file async I/O submit”後台等待事件,而正常應該是出現“db file parallel write”
可以通過設置 FILESYSTEMIO_OPTIONS=SETALL,啟用AIO,然後在AWR中會出現db file parallel write,而不再是db file async I/O submit
4,FILESYSTEMIO_OPTIONS=DIRECTIO : Wrong FILESYSTEMIO_OPTIONS Settings Can Cause a Corrupted Block to be Returned at the First Read (Doc ID 1918825.1)
5,一般,linux建議設置為 FILESYSTEMIO_OPTIONS=SETALL
具體測試過程如下:
先看看官方文檔的描述:
FILESYSTEMIO_OPTIONS -------------------------------- Property Description Parameter type String
Syntax FILESYSTEMIO_OPTIONS = { none | setall | directIO | asynch } Default value Varies by database version and operating system. Modifiable No Basic No DISK_ASYNCH_IO ------------------------------ Property Description Parameter type Boolean
Default value true
Modifiable No Range of values true | false
Basic No |
此處是文件係統:filesystemio_options=none disk_asynch_io=true(缺省值),使用strace發現,沒有啟用AIO:
15:21:06 SYS@ Lunar> show parameter filesystemio_options NAME TYPE VALUE ------------------------------------ ----------- ------------ filesystemio_options string none 15:21:16 SYS@ Lunar> show parameter DISK_ASYNCH_IO NAME TYPE VALUE ------------------------------------ ----------- ------------ disk_asynch_io boolean TRUE 15:21:30 SYS@ Lunar> |
在係統上看,目前並沒有啟用AIO:
[oracle@Lunar tmp]$ cat /proc/slabinfo | grep kio
kioctx 140 384 320 12 1 : tunables 54 27 8 : slabdata 31 32 22 kiocb 0 0 256 15 1 : tunables 120 60 8 : slabdata 0 0 0 [oracle@Lunar tmp]$ |
使用strace對後台進程DBWR進行跟蹤,佐證了上述觀點,當前文件係統的數據庫沒有啟用AIO:
[oracle@Lunar tmp]$ ps -ef| grep dbw
oracle 16540 30146 0 14:50 pts /3 00:00:00 grep dbw
oracle 20618 1 0 Sep24 ? 00:02:39 ora_dbw0_Lunar oracle 20620 1 0 Sep24 ? 00:02:55 ora_dbw1_Lunar oracle 20622 1 0 Sep24 ? 00:02:47 ora_dbw2_Lunar oracle 20624 1 0 Sep24 ? 00:02:29 ora_dbw3_Lunar oracle 20626 1 0 Sep24 ? 00:02:48 ora_dbw4_Lunar oracle 20628 1 0 Sep24 ? 00:02:41 ora_dbw5_Lunar oracle 20630 1 0 Sep24 ? 00:02:44 ora_dbw6_Lunar oracle 20632 1 0 Sep24 ? 00:02:55 ora_dbw7_Lunar oracle 20634 1 0 Sep24 ? 00:02:06 ora_dbw8_Lunar oracle 20636 1 0 Sep24 ? 00:01:46 ora_dbw9_Lunar oracle 20638 1 0 Sep24 ? 00:01:56 ora_dbwa_Lunar oracle 20640 1 0 Sep24 ? 00:01:58 ora_dbwb_Lunar oracle 20642 1 0 Sep24 ? 00:01:52 ora_dbwc_Lunar oracle 20644 1 0 Sep24 ? 00:01:57 ora_dbwd_Lunar oracle 20646 1 0 Sep24 ? 00:01:50 ora_dbwe_Lunar oracle 20648 1 0 Sep24 ? 00:01:50 ora_dbwf_Lunar |
strace中,沒有io_submit函數,因為 filesystemio_options = none
如果 filesystemio_options = setall ,那麼會出現 io_submit函數。
下麵的測試是使用ASM的數據庫的參數:
15:24:25 SYS@ Lunardb1> show parameter FILESYSTEMIO_OPTIONS NAME TYPE VALUE ------------------------------------ ----------- -------------- filesystemio_options string none 15:24:29 SYS@ Lunardb1> show parameter DISK_ASYNCH_IO NAME TYPE VALUE ------------------------------------ ----------- ------------- disk_asynch_io boolean TRUE 15:24:39 SYS@ Lunardb1> |
在係統上看,雖然設置了FILESYSTEMIO_OPTIONS=NONE,但是由於DISK_ASYNCH_IO=TRUE(缺省值),因此,ASM下的數據庫依然使用AIO:
[root@Lunardb1 ~] # cat /proc/slabinfo | grep kio
kioctx 238 340 384 10 1 : tunables 54 27 8 : slabdata 34 34 0 kiocb 3656 4845 256 15 1 : tunables 120 60 8 : slabdata 323 323 180 [root@Lunardb1 ~] #
[oracle@Lunardb1 ~]$ ps -ef| grep dbw
oracle 82860 82820 0 15:25 pts /1 00:00:00 grep dbw
grid 85795 1 0 Sep25 ? 00:00:36 asm_dbw0_+ASM1 grid 86406 1 0 Sep25 ? 00:01:32 /u01/app/11 .2.0 /grid/jdk/jre//bin/java -server -Xcheck:jni -Xms128M -Xmx384M -Djava.awt.headless= true -Ddisable.checkForUpdate= true -Dstdstream.filesize=100 -Dstdstream.filenumber=10 -DTRACING.ENABLED= false -Doracle.wlm.dbwlmlogger.logging.level=INFO -Dport.rmi=23792 -jar /u01/app/11 .2.0 /grid/oc4j/j2ee/home/oc4j .jar -config /u01/app/11 .2.0 /grid/oc4j/j2ee/home/OC4J_DBWLM_config/server .xml -out /u01/app/11 .2.0 /grid/oc4j/j2ee/home/log/oc4j .out -err /u01/app/11 .2.0 /grid/oc4j/j2ee/home/log/oc4j .err
oracle 87014 1 0 Sep25 ? 00:10:02 ora_dbw0_Lunardb1 oracle 87018 1 0 Sep25 ? 00:11:22 ora_dbw1_Lunardb1 oracle 87022 1 0 Sep25 ? 00:09:28 ora_dbw2_Lunardb1 oracle 87026 1 0 Sep25 ? 00:08:50 ora_dbw3_Lunardb1 oracle 87030 1 0 Sep25 ? 00:09:43 ora_dbw4_Lunardb1 oracle 87041 1 0 Sep25 ? 00:09:47 ora_dbw5_Lunardb1 oracle 87048 1 0 Sep25 ? 00:08:52 ora_dbw6_Lunardb1 oracle 87052 1 0 Sep25 ? 00:08:59 ora_dbw7_Lunardb1 oracle 87056 1 0 Sep25 ? 00:08:26 ora_dbw8_Lunardb1 oracle 87060 1 0 Sep25 ? 00:12:26 ora_dbw9_Lunardb1 oracle 87064 1 0 Sep25 ? 00:09:35 ora_dbwa_Lunardb1 oracle 87068 1 0 Sep25 ? 00:09:25 ora_dbwb_Lunardb1 oracle 87072 1 0 Sep25 ? 00:08:35 ora_dbwc_Lunardb1 oracle 87076 1 0 Sep25 ? 00:09:22 ora_dbwd_Lunardb1 oracle 87080 1 0 Sep25 ? 00:08:16 ora_dbwe_Lunardb1 [oracle@Lunardb1 ~]$ |
可以看到,使用ASM數據庫的dbw0進程,即使FILESYSTEMIO_OPTIONS設置為NONE,隻要disk_asynch_io設置為true(缺省值),DBWR也可以使用到AIO:
再看ASM實例的dbw進程,也是用了AIO:
在實踐學習中,跟蹤工具strace是利器之一。
本文出自數據和雲公眾號,原文鏈接
最後更新:2017-07-17 18:03:48