天天看點

實踐真知:使用ASM和檔案系統的資料庫在AIO上有何不同?

實踐真知:使用ASM和檔案系統的資料庫在AIO上有何不同?

張大朋(Lunar)Oracle 資深技術專家

Lunar 擁有超過十年的 ORACLE SUPPORT 從業經驗,曾經服務于ORACLE ACS部門,現就職于 ORACLE Sales Consultant 部門,負責的産品主要是 Exadata,Golden Gate,Database 等。

編輯說明:在Oracle資料庫中,很多概念在悄悄的發生變化,而如果缺乏實踐和動手驗證,你可能離真相會越來越遠。從檔案系統到ASM,Oracle的異步IO參數也在發生不斷變化。

昨天客戶的一個重要應用切換到新的系統環境上,今天觀察,發現部分異常等待:

實踐真知:使用ASM和檔案系統的資料庫在AIO上有何不同?

從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

具體測試過程如下:

先看看官方文檔的描述:

<code>FILESYSTEMIO_OPTIONS</code>

<code>--------------------------------</code>

<code>Property    Description</code>

<code>Parameter</code><code>type</code>  <code>String</code>

<code>Syntax  FILESYSTEMIO_OPTIONS = { none | setall | directIO | asynch }</code>

<code>Default value   Varies by database version and operating system.</code>

<code>Modifiable  No</code>

<code>Basic   No</code>

<code>DISK_ASYNCH_IO</code>

<code>------------------------------</code>

<code>Parameter</code><code>type</code>  <code>Boolean</code>

<code>Default value  </code><code>true</code>

<code>Range of values</code><code>true</code> <code>|</code><code>false</code>

此處是檔案系統:filesystemio_options=none disk_asynch_io=true(預設值),使用strace發現,沒有啟用AIO:

<code>15:21:06 SYS@ Lunar&gt; show parameter filesystemio_options</code>

<code>NAME                                 TYPE        VALUE</code>

<code>------------------------------------ ----------- ------------</code>

<code>filesystemio_options                 string      none</code>

<code>15:21:16 SYS@ Lunar&gt; show parameter DISK_ASYNCH_IO</code>

<code>disk_asynch_io                       boolean     TRUE</code>

<code>15:21:30 SYS@ Lunar&gt;</code>

在系統上看,目前并沒有啟用AIO:

<code>[oracle@Lunar tmp]$</code><code>cat</code> <code>/proc/slabinfo</code> <code>|</code><code>grep</code> <code>kio</code>

<code>kioctx               140    384    320   12    1 : tunables   54   27    8 : slabdata     31     32     22</code>

<code>kiocb                  0      0    256   15    1 : tunables  120   60    8 : slabdata      0      0      0</code>

<code>[oracle@Lunar tmp]$</code>

使用strace對背景程序DBWR進行跟蹤,佐證了上述觀點,目前檔案系統的資料庫沒有啟用AIO:

<code>[oracle@Lunar tmp]$</code><code>ps</code> <code>-ef|</code><code>grep</code> <code>dbw</code>

<code>oracle   16540 30146  0 14:50 pts</code><code>/3</code>    <code>00:00:00</code><code>grep</code> <code>dbw</code>

<code>oracle   20618     1  0 Sep24 ?        00:02:39 ora_dbw0_Lunar</code>

<code>oracle   20620     1  0 Sep24 ?        00:02:55 ora_dbw1_Lunar</code>

<code>oracle   20622     1  0 Sep24 ?        00:02:47 ora_dbw2_Lunar</code>

<code>oracle   20624     1  0 Sep24 ?        00:02:29 ora_dbw3_Lunar</code>

<code>oracle   20626     1  0 Sep24 ?        00:02:48 ora_dbw4_Lunar</code>

<code>oracle   20628     1  0 Sep24 ?        00:02:41 ora_dbw5_Lunar</code>

<code>oracle   20630     1  0 Sep24 ?        00:02:44 ora_dbw6_Lunar</code>

<code>oracle   20632     1  0 Sep24 ?        00:02:55 ora_dbw7_Lunar</code>

<code>oracle   20634     1  0 Sep24 ?        00:02:06 ora_dbw8_Lunar</code>

<code>oracle   20636     1  0 Sep24 ?        00:01:46 ora_dbw9_Lunar</code>

<code>oracle   20638     1  0 Sep24 ?        00:01:56 ora_dbwa_Lunar</code>

<code>oracle   20640     1  0 Sep24 ?        00:01:58 ora_dbwb_Lunar</code>

<code>oracle   20642     1  0 Sep24 ?        00:01:52 ora_dbwc_Lunar</code>

<code>oracle   20644     1  0 Sep24 ?        00:01:57 ora_dbwd_Lunar</code>

<code>oracle   20646     1  0 Sep24 ?        00:01:50 ora_dbwe_Lunar</code>

<code>oracle   20648     1  0 Sep24 ?        00:01:50 ora_dbwf_Lunar</code>

實踐真知:使用ASM和檔案系統的資料庫在AIO上有何不同?

strace中,沒有io_submit函數,因為 filesystemio_options = none

如果 filesystemio_options = setall ,那麼會出現 io_submit函數。

下面的測試是使用ASM的資料庫的參數:

<code>15:24:25 SYS@ Lunardb1&gt; show parameter FILESYSTEMIO_OPTIONS</code>

<code>------------------------------------ ----------- --------------</code>

<code>15:24:29 SYS@ Lunardb1&gt; show parameter DISK_ASYNCH_IO</code>

<code>------------------------------------ ----------- -------------</code>

<code>15:24:39 SYS@ Lunardb1&gt;</code>

在系統上看,雖然設定了FILESYSTEMIO_OPTIONS=NONE,但是由于DISK_ASYNCH_IO=TRUE(預設值),是以,ASM下的資料庫依然使用AIO:

<code>[root@Lunardb1 ~]</code><code># cat /proc/slabinfo | grep kio</code>

<code>kioctx               238    340    384   10    1 : tunables   54   27    8 : slabdata     34     34      0</code>

<code>kiocb               3656   4845    256   15    1 : tunables  120   60    8 : slabdata    323    323    180</code>

<code>[root@Lunardb1 ~]</code><code>#</code>

<code>[oracle@Lunardb1 ~]$</code><code>ps</code> <code>-ef|</code><code>grep</code> <code>dbw</code>

<code>oracle    82860  82820  0 15:25 pts</code><code>/1</code>    <code>00:00:00</code><code>grep</code> <code>dbw</code>

<code>grid      85795      1  0 Sep25 ?        00:00:36 asm_dbw0_+ASM1</code>

<code>grid      86406      1  0 Sep25 ?        00:01:32</code><code>/u01/app/11</code><code>.2.0</code><code>/grid/jdk/jre//bin/java</code> <code>-server -Xcheck:jni -Xms128M -Xmx384M -Djava.awt.headless=</code><code>true</code> <code>-Ddisable.checkForUpdate=</code><code>true</code> <code>-Dstdstream.filesize=100 -Dstdstream.filenumber=10 -DTRACING.ENABLED=</code><code>false</code> <code>-Doracle.wlm.dbwlmlogger.logging.level=INFO -Dport.rmi=23792 -jar</code><code>/u01/app/11</code><code>.2.0</code><code>/grid/oc4j/j2ee/home/oc4j</code><code>.jar -config</code><code>/u01/app/11</code><code>.2.0</code><code>/grid/oc4j/j2ee/home/OC4J_DBWLM_config/server</code><code>.xml -out</code><code>/u01/app/11</code><code>.2.0</code><code>/grid/oc4j/j2ee/home/log/oc4j</code><code>.out -err</code><code>/u01/app/11</code><code>.2.0</code><code>/grid/oc4j/j2ee/home/log/oc4j</code><code>.err</code>

<code>oracle    87014      1  0 Sep25 ?        00:10:02 ora_dbw0_Lunardb1</code>

<code>oracle    87018      1  0 Sep25 ?        00:11:22 ora_dbw1_Lunardb1</code>

<code>oracle    87022      1  0 Sep25 ?        00:09:28 ora_dbw2_Lunardb1</code>

<code>oracle    87026      1  0 Sep25 ?        00:08:50 ora_dbw3_Lunardb1</code>

<code>oracle    87030      1  0 Sep25 ?        00:09:43 ora_dbw4_Lunardb1</code>

<code>oracle    87041      1  0 Sep25 ?        00:09:47 ora_dbw5_Lunardb1</code>

<code>oracle    87048      1  0 Sep25 ?        00:08:52 ora_dbw6_Lunardb1</code>

<code>oracle    87052      1  0 Sep25 ?        00:08:59 ora_dbw7_Lunardb1</code>

<code>oracle    87056      1  0 Sep25 ?        00:08:26 ora_dbw8_Lunardb1</code>

<code>oracle    87060      1  0 Sep25 ?        00:12:26 ora_dbw9_Lunardb1</code>

<code>oracle    87064      1  0 Sep25 ?        00:09:35 ora_dbwa_Lunardb1</code>

<code>oracle    87068      1  0 Sep25 ?        00:09:25 ora_dbwb_Lunardb1</code>

<code>oracle    87072      1  0 Sep25 ?        00:08:35 ora_dbwc_Lunardb1</code>

<code>oracle    87076      1  0 Sep25 ?        00:09:22 ora_dbwd_Lunardb1</code>

<code>oracle    87080      1  0 Sep25 ?        00:08:16 ora_dbwe_Lunardb1</code>

<code>[oracle@Lunardb1 ~]$</code>

可以看到,使用ASM資料庫的dbw0程序,即使FILESYSTEMIO_OPTIONS設定為NONE,隻要disk_asynch_io設定為true(預設值),DBWR也可以使用到AIO:

實踐真知:使用ASM和檔案系統的資料庫在AIO上有何不同?

再看ASM執行個體的dbw程序,也是用了AIO:

實踐真知:使用ASM和檔案系統的資料庫在AIO上有何不同?

在實踐學習中,跟蹤工具strace是利器之一。