如何給Oracle資料庫分配記憶體?
阿新 • • 發佈:2019-02-12
曾幾何時,網路上流傳著給Oracle資料庫分配記憶體的一條法則:把80%的記憶體分配給Oracle使用,而又將這80%的記憶體分配80%給Oracle的SGA,剩下的20%分給Oracle的PGA。記得Tom曾說過類似這樣的話:如果一個引數的設定對Oracle是最佳的,那麼Oracle就會自動地將其設為了預設值。而顯然,在記憶體分配這事上,Oracle的初始設定並不是按這個法則的,那麼就是說從某一方面證明這個法則存在問題。
當然大部分DBA不會這樣設定記憶體引數,但是也有不少的人在Oracle的記憶體分配上存在欠考慮的地方。
首先,我們來看看保留可用記憶體20%給作業系統是否合適。對於2G記憶體的伺服器(現實中這樣的機器不少),20%意味著400M,而通常400M對作業系統來說是不夠用的。而對於記憶體特別多的主機,20%又顯得太多。比如下面是一份來自於一臺P595的記憶體情況:
- ====================================================|==========|===========
- 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
====================================================|==========|===========
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下的記憶體佔用。