最近有客戶在Oracle10gR2上遇到了Mutex競爭的問題。
Mutex是Oracle在Oracle10g中引入的串行機制,逐漸會用來替代一些存在性能問題的Latch.和Latch相比,一個Mutex Get大約僅需要30~35個指令,而Latch Get則需要大約150~200個指令,同時在大小上,每個Mutex僅占用大約16 Bytes空間,而一個latch在10gR2中要占用大約112 Bytes空間。
Mutex首先替代了Library Cache Latch以及Library Cache Pin,在Oracle 10.2.0.2上通過隱含參數_kks_use_mutex_pin的調整可以限制是否使用Mutex機制來實現Cursor Pin:
SQL> set linesize 120
SQL> col name for a30
SQL> col value for a20
SQL> col describ for a60
SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
2 FROM SYS.x$ksppi x, SYS.x$ksppcv y
3 WHERE x.indx = y.indx
4 AND x.ksppinm LIKE '%&par%'
5 /
Enter value for par: mutex
old 4: AND x.ksppinm LIKE '%&par%'
new 4: AND x.ksppinm LIKE '%mutex%'
NAME VALUE DESCRIB
------------------------------ -------------------- ------------------------------------------------------------
_kks_use_mutex_pin TRUE Turning on this will make KKS use mutex for cursor pins.
在新的Mutex Pins機制下,以下等待事件可能變得常見:
cursor: mutex S
cursor: mutex X
cursor: pin S
cursor: pin S wait on X
cursor: pin X
由於Mutex使用CAS(Compare and Swap)機制,所以在不支持CAS的HP Unix平台上就可能出現CPU消耗過高的情況。
這作為一個Bug在10.2.0.4版本中被修正。