2011年11月15日 星期二

第二十一回 AIX + Oracle 10gR4 & 10gR5 使用 LOCK_SGA 不使用 large page 的方法

最近一個系統一直有 page swap 的問題,雖然系統發生 page swap 就代表平常記憶體不足,或是程式異常佔用記憶體,但這台機器其實己經沒有 Memory 可增加了,僅剩的方法就是請 AP 人員 Tunning 程式,分散系統 Loading 。

但是其實 Oracle Database 的系統中,SGA 的資源如果發生 Swap 的狀況下,系統會跟當掉一樣,少則幾分鐘,重至系統會整個癱瘓,最後只好重啟系統。從前一直以來為了預防這件事,在 Memory 非常大的系統上,會建議客戶將作業系統下,vmo 的參數 v_pinshm=1 設上,再配合 ORACLE LOCK_SGA=true ,將 SGA pin 在記憶體中,如此 SGA 就不會再被 swap。 之前第七回有說明過這件事 http://it2man.blogspot.com/2010/05/aix.html

但 Oracle 在 10.2.0.4 後,規則有些改變,系統會需要你設定 Large Page ,再配合作業系統調整 Oracle User 的權限,才能進行 Lock_sga ,不然在啟動時會發生錯誤。

詳細請見 metalink How to enable Large Page Feature on AIX-Based Systems [ID 372157.1]

這邊節錄幾個重點
一、須在 root 下將 oracle 授予權限
chuser capabilities=CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle

二、計算 Large Page 之大小,公式如下,以每個 Large Page 為 16MB 計算,取得要佔用的數目
num_of_large_pages = INT((total_SGA_size-1)/16MB)+1

三、VMO 設定之參數需將重點二計算出來的數目及 lgpg_size=16777216 (16MB) 和一開始說明的 v_pinshm=1 也設上
vmo -p -o lgpg_regions=num_of_large_pages -o lgpg_size=16777216
vmo -p -o v_pinshm=1 (請注意,我記得這個參數要重啟才會生效)

四、spfile 裏需設定 lock_sga=true

五、最重要的一點,這篇 Metalink 有 Bug ,寫在最後面,上述四點都做到後,SGA 是 pin 不到你預先規畫好的記憶體內的,他會另外自己再要一塊空間,需要配合最後寫的 NOTE:728444.1 中所述的 Patch 安裝後才會真的去使用你己經幫 Oracle 設定好的空間。10.2.0.4 和 10.2.0.5 都有這個 Bug。不過後來我用別的方法,沒有去上這個 Fix ,所以還沒測試過。

上面寫的,都不是本篇標題所要做的,最後來說明標題的作業內容

雖然官方有說使用 Large Page 會增進 5% 左右的效能,但是會造成每次重開機時間比較久,每次要重新設定 SGA Size 就需要在作業系統事先分配等缺點。所以還是有原來不需要設定和計算 Large Page 就可以 Pin 的方式。

重點在部驟一:
chuser capabilities=CAP_NUMA_ATTACH,CAP_BYPASS_RAC_VMM,CAP_PROPAGATE oracle

是的,只要授予作業系統 User 權限時,增加capabilities=CAP_NUMA_ATTACH 即可
第三個部驟的 vmo -p -o lgpg_regions=num_of_large_pages -o lgpg_size=16777216 就不用再設定了,直接就可以做 pin 的動作,當然 v_pinshm=1 是一定要設的

當然最後要說明一下,這個設定動作我好像在 Metalink 找不到,所以有可能你日後遇到問題時,跟 Oracle 諮詢的話,這個 support 看到你的設定方式不同,他可能會先要求你修正。