實踐真知:使用ASM和文件系統的數據庫在AIO上有何不同?
原創張大朋
數據和云
聚焦數據技術和云未來,、MySQL、、 ...從商用到開源,從國際到國產,及時的數據庫資訊、技術熱點、學習資源等。
發表于
收錄于合集
張大朋(Lunar) 資深技術專家
Lunar 擁有超過十年的 從業經驗,曾經服務于 ACS部門,現就職于 Sales 部門,負責的產品主要是 , Gate, 等。
編輯說明:在數據庫中,很多概念在悄悄的發生變化,而如果缺乏實踐和動手驗證,你可能離真相會越來越遠。從文件系統到ASM,的異步IO參數也在發生不斷變化。
昨天客戶的一個重要應用切換到新的系統環境上,今天觀察,發現部分異常等待:
從OS的CPU負載來看,定期會出現一個峰值,從ASH中可以看出,這個峰值對應的等待事件跟AWR的完全吻合。
因此,主要懷疑兩個東西:
1,應用的SQL和對象的屬性(比如table或者index的統計信息,并行度等等……)
2,系統的AIO設置
上面的第一條,已經提交給開發相應的SQL和其他信息;第二條,因為系統以前是11.2 RAC,使用了ASM,而現在是單機文件系統.
因此對比了這兩種環境下AIO的異同,結論如下:
1,Linux下,ASM數據庫和文件系統數據庫的AIO設置差別:
----(1). ASM的AIO屬性是不受 參數的影響(因為ASM會繞過文件系統),只跟有關系
----(2). 文件系統的AIO屬性跟 和 都有關系
2,=NONE : Bug – Wait Time on “ Path” with S=NONE (Doc ID .8)
3, db file async I/O ’相關內容:
‘db file async I/O ’ when =NONE (Doc ID .1) —詳細講述了 ‘db file async I/O ’ 和 =NONE的關系
當文件系統設置了=NONE時,會出現“db file async I/O ”后臺等待事件,而正常應該是出現“db file write”
可以通過設置 =,啟用AIO,然后在AWR中會出現db file write,而不再是db file async I/O
4,= : Wrong Can Cause a Block to be at the First Read (Doc ID .1)
5,一般,linux建議設置為 =
具體測試過程如下:
先看看官方文檔的描述:
--------------------------------
type
= { none | | | }
value by and .
No
Basic No
------------------------------
type
value true
No
Range of true | false
Basic No
此處是文件系統:=none =true(缺省值),使用發現,沒有啟用AIO:
15:21:06 SYS@ Lunar> show
NAME TYPE VALUE
------------------------------------ ----------- ------------
none
15:21:16 SYS@ Lunar> show
NAME TYPE VALUE
------------------------------------ ----------- ------------
TRUE
15:21:30 SYS@ Lunar>
在系統上看,目前并沒有啟用AIO:
[@Lunar tmp]$ cat /proc/ | grep kio
140 384 320 12 1 : 54 27 8 : 31 32 22
kiocb 0 0 256 15 1 : 120 60 8 : 0 0 0
[@Lunar tmp]$
使用對后臺進程DBWR進行跟蹤,佐證了上述觀點,當前文件系統的數據庫沒有啟用AIO:
[@Lunar tmp]$ ps -ef|grep dbw
16540 30146 0 14:50 pts/3 00:00:00 grep dbw
20618 1 0 Sep24 ? 00:02:39
20620 1 0 Sep24 ? 00:02:55
20622 1 0 Sep24 ? 00:02:47
20624 1 0 Sep24 ? 00:02:29
20626 1 0 Sep24 ? 00:02:48
20628 1 0 Sep24 ? 00:02:41
20630 1 0 Sep24 ? 00:02:44
20632 1 0 Sep24 ? 00:02:55
20634 1 0 Sep24 ? 00:02:06
20636 1 0 Sep24 ? 00:01:46
20638 1 0 Sep24 ? 00:01:56
20640 1 0 Sep24 ? 00:01:58
20642 1 0 Sep24 ? 00:01:52
20644 1 0 Sep24 ? 00:01:57
20646 1 0 Sep24 ? 00:01:50
20648 1 0 Sep24 ? 00:01:50
中,沒有函數,因為 = none
如果 = ,那么會出現 函數。
下面的測試是使用ASM的數據庫的參數:
15:24:25 SYS@ > show
NAME TYPE VALUE
------------------------------------ ----------- --------------
none
15:24:29 SYS@ > show
NAME TYPE VALUE
------------------------------------ ----------- -------------
TRUE
15:24:39 SYS@ >
在系統上看,雖然設置了=NONE,但是由于=TRUE(缺省值),因此,ASM下的數據庫依然使用AIO:
[root@ ~]# cat /proc/ | grep kio
238 340 384 10 1 : 54 27 8 : 34 34 0
kiocb 3656 4845 256 15 1 : 120 60 8 : 323 323 180
[root@ ~]#
[@ ~]$ ps -ef|grep dbw
82860 82820 0 15:25 pts/1 00:00:00 grep dbw
grid 85795 1 0 Sep25 ? 00:00:36 +ASM1
grid 86406 1 0 Sep25 ? 00:01:32 /u01/app/11.2.0/grid/jdk/jre//bin/java - -:jni - - -Djava.awt.=true -.=true -.=100 -.=10 -.=false -.wlm...level=INFO -Dport.rmi=23792 -jar /u01/app/11.2.0/grid/oc4j/j2ee/home/oc4j.jar - /u01/app/11.2.0/grid/oc4j/j2ee/home//.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
87014 1 0 Sep25 ? 00:10:02
87018 1 0 Sep25 ? 00:11:22
87022 1 0 Sep25 ? 00:09:28
87026 1 0 Sep25 ? 00:08:50
87030 1 0 Sep25 ? 00:09:43
87041 1 0 Sep25 ? 00:09:47
87048 1 0 Sep25 ? 00:08:52
87052 1 0 Sep25 ? 00:08:59
87056 1 0 Sep25 ? 00:08:26
87060 1 0 Sep25 ? 00:12:26
87064 1 0 Sep25 ? 00:09:35
87068 1 0 Sep25 ? 00:09:25
87072 1 0 Sep25 ? 00:08:35
87076 1 0 Sep25 ? 00:09:22
87080 1 0 Sep25 ? 00:08:16
[@ ~]$
可以看到數據庫應用系統包括什么,使用ASM數據庫的dbw0進程,即使設置為NONE,只要設置為true(缺省值),DBWR也可以使用到AIO:
再看ASM實例的dbw進程數據庫應用系統包括什么,也是用了AIO:
在實踐學習中,跟蹤工具是利器之一。
如何加入"云和恩墨大講堂"微信群