在AIX5.3中將Oracle SGA定在記憶體中的詳細步驟

路途中的人2012發表於2017-07-20

在一些作業系統平臺中,我們可以將OracleSGA定在記憶體裡,這樣可以避免頁交換,從而提高Oracle的效能。在AIX下,要把作業系統的v_pinshm引數設定為1,否則即使在Oracle中將LOCK_SGA設定為TRUE也是不管用的。然而僅僅知道這兩個引數還遠不夠用的,必須對AIX記憶體管理有一定了解。本文要求作業系統是5.3 ML01以上,Oracle9.2.0.4以上。

首先我們來檢查一下作業系統版本:

XXIBM:# oslevel -r

5300-07

可見作業系統版本滿足我們的要求。如果這個輸出是5300-00,那麼就先要給作業系統打補丁。Oracle很多的問題都和作業系統有緊密的聯絡。

接下來看看有多少記憶體。檢視記憶體的方法有很多,隨便用哪一種吧。

XXIBM:# bootinfo -r

64749568

上面的輸出顯示作業系統有64G記憶體。

再用rmss -p來看看當前可用記憶體是否與實際記憶體一致。因為有的時候可能出於測試的考慮,我們可能用rmss把記憶體模擬到某個大小(當然只能向小模擬)。

XXIBM:# rmss -p

Simulated memory size is 63231.9375 Mb.

如果上面的輸出小於實際的記憶體,就要考慮用rmss -r來將記憶體恢復到實際大小。

接下來讓我們檢查幾個有關記憶體的引數設定。AIX5.3的預設記憶體引數

首先檢查lru_file_repage的設定。這是5.3新增的引數,這個引數預設為1,但IBM推薦在ML01之後,將這個引數設定為0

XXIBM:# vmo -L lru_file_repage

NAME             CUR    DEF    BOOT   MIN   MAX    UNIT    TYPE DEPENDENCIES

--------------------------------------------------------------------

lru_file_repage    1     1      1      0     1     boolean   D

在上面的輸出中,CUR代表引數的當前值,DEF代表引數預設值,BOOT代表下次啟動值。

用下面的命令把lru_file_repage設定為0。下面的設定只是在當前生效,不改變重啟的設定。

XXIBM:# vmo -o lru_file_repage=0

Setting lru_file_repage to 0

接下來檢查v_pinshm,應該改成1

XXIBM:# vmo -L v_pinshm

NAME      CUR    DEF    BOOT   MIN   MAX    UNIT    TYPE DEPENDENCIES

--------------------------------------------------------------------

v_pinshm    1     0      0      0     1     boolean   D

XXIBM:# vmo -o v_pinshm=1

Setting v_pinshm to 1

檢查一下minperm%maxperm%等引數。在使用lru_file_repage之前,我們習慣把maxperm%設定很小,如20%。但從5.3開始,IBM建議改大。這個引數預設是80IBM建議可以考慮改成90。至於minperm%,預設是20。如果記憶體在32G-64G,可以改成10,小於32G,改成5,大於64G,保持預設20

XXIBM:# vmo -o minperm%=10

Setting minperm% to 10

XXIBM:# vmo -o maxperm%=90

Setting maxperm% to 90

作業系統的引數調整好了之後,剩下的工作就簡單了。登入到Oracle,檢視一下LOCK_SGA引數的設定:

XXIBM:# su - oracle

$ sqlplus /nolog

SQL*Plus: Release 9.2.0.6.0 - Production on Fri Sep 19 08:40:10 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn / as sysdba

Connected.

SQL> show parameter lock_sga

NAME                                 TYPE        VALUE

------------------------------------ -----------

lock_sga                             boolean     FALSE

這個引數當前為FALSE。要想把SGA定在記憶體中,要把這個引數改成TRUE

SQL> alter system set lock_sga=true scope=spfile;

System altered.

接下來計算一下當前SGA的大小:

SQL> select sum(value)/1024/1024 from v$sga;

SUM(VALUE)/1024/1024

--------------------

          35941.0215

這個大小一般不要超過實體記憶體的60%。太小也不好,利用不充分。從上面的輸出來看,當前的SGA大小基本合適。當然可進一步檢視DB_CACHE_SIZE等引數設定是否合理,以確定是否要調整,這裡略過。

設定好之後要重新啟動資料庫。如果資料庫能夠順利啟動,那麼說明設定沒問題。

那麼怎樣才能看出ORACLESGA是否定在記憶體裡呢?可以透過svmon命令來檢視。這個命令要用超級使用者才可以執行。

$ su -

root's Password:

XXIBM:# svmon -P -t 100|grep -p Pid|head

--------------------------------------------------------------------

 Pid Command       Inuse      Pin     Pgsp  Virtual 64-bit Mthrd  16MB  225546 oracle      9313207  9270407   2232  9308982   Y     N      N

--------------------------------------------------------------------

 Pid Command       Inuse      Pin     Pgsp  Virtual 64-bit Mthrd  16MB

 119692 oracle        9312614  9270438  2232  9308978   Y      N   N

--------------------------------------------------------------------

Pid Command        Inuse      Pin     Pgsp  Virtual 64-bit Mthrd  16MB

注意上面輸出的InusePin,還有CommandCommand對應oracle,說明程式資訊是Oracle的。Inuse代表使用中的記憶體頁,Pin代表定在記憶體中的頁數量,每頁大小4KB。這兩個值如果相差甚遠,則說明隨SGA沒有定在記憶體裡,如果相差很近,則說明定在了記憶體裡。

如果想在作業系統重啟後Oracle也能把SGA定在記憶體裡,並且正常工作,就要把本文一開始設定的v_pinshmlru_file_repage等設定為重起作業系統後也是想要的值。例如:

XXIBM:# vmo -p -o v_pinshm=1

Setting v_pinshm to 1 in nextboot file

Setting v_pinshm to 1

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2142354/,如需轉載,請註明出處,否則將追究法律責任。

相關文章