網路上流傳著給oracle資料庫分配記憶體的一條法則:把80%的記憶體分配給oracle使用,而又將這80%的記憶體分配80%給oracle的sga,剩下的20%分給oracle的pga。記得tom曾說過類似這樣的話:如果乙個引數的設定對oracle是最佳的,那麼oracle就會自動地將其設為了預設值。而顯然,在記憶體分配這事上,oracle的初始設定並不是按這個法則的,那麼就是說從某一方面證明這個法則存在問題。
當然大部分dba不會這樣設定記憶體引數,但是也有不少的人在oracle的記憶體分配上存在欠考慮的地方。
首先,我們來看看保留可用記憶體20%給作業系統是否合適。比如對於2g記憶體的伺服器,20%意味著400m,而通常400m對作業系統來說是不夠用的。而對於記憶體特別多的主機,20%又顯得太多。比如下面是乙份來自於一台p595的記憶體情況:
1 ***************====|**********|**********=
2 memory overview | pages | megabytes
3 ----------|-----------------|-----------
4 total memory in system | 45875200 | 179200.00
5 total memory in use | 34789026 | 135894.63
6 free memory | 11086174 | 43305.36
7 *****====|**********=
8 segment overview | pages | megabytes
9 --------|-----------------|-----------
10 total segment id mempgs | 32618956 | 127417.79
11 total fork tree segment pages | 2074 | 8.10
12 total kernel segment id mempgs | 3594452 | 14040.82
這台主機共計179gb物理記憶體,已使用135g,其中核心占用14g。核心占用的記憶體不到總記憶體的10%。
以上的資料以及說明,只是表達這樣乙個觀點,對於作業系統的保留記憶體,需要根據實際情況預以考慮,這包括了作業系統的核心引數的設定。比如在aix下的預設設定,client和perm記憶體可以占用遠遠超過20%的記憶體,而hp-ux下的預設設定,file cache和buf cache也可能占用遠遠超過20%的記憶體。所以對於這些環境的資料庫,一定要注意調整os的核心引數。對於os的記憶體使用,至少保留20%也不失為一種穩妥的做法。
除了作業系統這一塊,給oracle分配記憶體的時候,還需要注意以下非常重要的幾點,這幾點經常被人忽略:
注意業務高峰期的記憶體使用:我所維護的一套系統,平時的連線數通常在5000-5500左右,而在最高時連線數達到了8000,也就是到達了連線的上限才作罷。因此,我們需要為業務高峰期時保留足夠的記憶體。
對於rac資料庫,需要考慮到其他節點故障或停機維護時,連線和壓力轉移到繼續工作的節點時的記憶體消耗。
一些人只考慮到了連線時程序使用的pga記憶體,這裡存在乙個很大的誤解,就是認為乙個連線,只會使用pga的記憶體。但還有乙個很重要的記憶體使用,那就是程序本身占用的作業系統記憶體,除了pga之外的記憶體。程序本身有**(在os中這通常是共享的),有stack,有heap,還要有kernel的記憶體占用。pga只是程序使用的記憶體中一部分,甚至大部分情況下只是一小部分。在oracle 10.2.0.4 for aix下測試過,乙個空閒連線,也就是什麼都不幹的乙個連線,pga占用500k左右,而server process程序占用的內存在4-5m之間。測試時這套庫剛啟動,沒有任何負載。實際上據觀察在一套執行比較長時間的庫上,server process占用的內存在9-10m之間。當然不同的系統,不同的配置,oracle程序占用的記憶體有所不同,有興趣的朋友可以測量一下oracle程序在hp-ux和linux下的記憶體占用。
下面舉例進行分析oracle記憶體分配: 注意
--主機記憶體分為檔案快取和計算記憶體
--oracle使用計算記憶體,需要限制檔案快取
--計算記憶體不足時,需要從檔案快取中置換出來記憶體。當檔案快取過大,速度非常慢且需要消耗cpu
total real memory:128gb
parameter:processes=1000
--aix6或aix7系統至少預留4gb記憶體
--oracle10g 每個程序10-15m記憶體 1000個process至少15gb
oracle11g 每個程序至少30m記憶體 1000個process至少30gb
--pga分配至少15gb
(pga取決與sql語句的使用方式)
(pga_target對排序資料是在記憶體中還是磁碟中有參考意義,但無法決定pga記憶體)
--剩下記憶體的50%-80%分給sga,根據記憶體大小調整
oracle環境的記憶體分配需要考慮事項
--operation system 大於等於4gb
--processes 每個30m 1000個程序則要大於等於30gb
--program global area (128-59)*30%=20gb
--free memory 20% real mem 128*20%=25gb
--system global area 128-4-30-20-25=49gb 最後考慮
C 記憶體分配情況
1 程式 區 存放函式體的二進位制 2 全域性區資料區 全域性資料區劃分為三個區域。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。常量資料存放在另乙個區域裡。這些資料在程式結束後由系統釋放。我們所說的bss...
簡述C C 程式編譯的記憶體分配情況
1.從靜態儲存區域分配 內存在程式編譯時就已經分配好,這塊內存在程式的整個執行期間都存在速度快,不容易出錯,因為有系統會善後。例如全域性變數,static變數等。2.在棧上分配 在執行函式時,函式內區域性變數的儲存單元都在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的...
c 虛函式及static的記憶體分配情況
class gfather void b void c c 呼叫虛函式的時候,要根據例項 即this指標指向的例項 中虛函式表指標得到虛函式表,再從虛函式表中找到函式的位址。沒有virtual關鍵字,sizeof father 占用1位元組,有virtual關鍵字,sizeof father 占用4...