問題描述
曾幾何時,網路上流傳著給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
這臺主機共計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下的記憶體占用。
對于SGA內各組件的細分以及PGA大小設定,網上很多相關的文章可供參考,本文不再涉及。不過我的個人觀點是:引數的調整也不是一步到位的事情,需要根據系統運行時對性能資料的分析來進行調整,直至達到最優化。
uj5u.com熱心網友回復:
把80%的記憶體分配給Oracle使用這個比例高了, 設定 50% - 60% 的比較多見。
不過我的個人觀點是:引數的調整也不是一步到位的事情,需要根據系統運行時對性能資料的分析來進行調整,直至達到最優化。 這個贊!
uj5u.com熱心網友回復:
10g SGA_TARGET是自動分配,系統上線臨時分配參考值,再根據線上業務進行調整。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/22917.html
標籤:基礎和管理
