1. 程式人生 > >如何給Oracle資料庫分配記憶體?

如何給Oracle資料庫分配記憶體?

 

曾幾何時,網路上流傳著給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   
====================================================|==========|===========
Memory Overview                                     |    Pages |  Megabytes 
----------------------------------------------------|----------|-----------
Total memory in system                              | 45875200 |  179200.00 
    Total memory in use                             | 34789026 |  135894.63 
    Free memory                                     | 11086174 |   43305.36 
====================================================|==========|===========
Segment Overview                                    |    Pages |  Megabytes 
----------------------------------------------------|---------|-----------
Total segment id mempgs                             | 32618956 |  127417.79 
    Total fork tree segment pages                   |     2074 |       8.10 
    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下的記憶體佔用。