SGA的大小
2024-07-21 02:38:13
供稿:網友
那么我們現在來考察內存參數的設置。實際上,對于特定的環境,總是存在著不同的最優設置的,沒有任何一種普遍適用的最優方案。但為什么在這里我們還要來談設置這個話題呢,那僅僅是出于一個目的,避免過度的犯錯誤。 事實上,在任何一個生產系統正式投入使用之前,我們不擁有任何系統運行信息讓我們去調整,這樣就只有兩種可能,一是根據文檔推薦設置,另外一種就是根據經驗設置。相對來說,根據經驗的設置比根據文檔的設置要可靠一些。尤其是那些24*7的系統,我們更要減少錯誤的發生。那么我們嘗試去了解不同的系統不同的應用的具體設置情況,從而提供一個參照信息給大家。 為了得出一個參照設置,我們就必須假定一個參照環境。以下所有設置我們基于這樣一個假定,那就是硬件服務器上只考慮存在操作系統和數據庫,在這個單一的環境中,我們來考慮內存的設置。 在設置參數之前呢,我們首先要問自己幾個問題 一:物理內存多大 二:操作系統估計需要使用多少內存 三:數據庫是使用文件系統還是裸設備 四:有多少并發連接 五:應用是OLTP類型還是OLAP類型 根據這幾個問題的答案,我們可以粗略地為系統估計一下內存設置。那我們現在來逐個問題地討論,首先物理內存多大是最輕易回答的一個問題,然后操作系統估計使用多少內存呢?從經驗上看,不會太多,通常應該在200M以內(不包含大量進程PCB)。 接下來我們要探討一個重要的問題,那就是關于文件系統和裸設備的問題,這往往輕易被我們所忽略。操作系統對于文件系統,使用了大量的buffer來緩存操作系統塊。這樣當數據庫獲取數據塊的時候,雖然SGA中沒有命中,但卻實際上可能是從操作系統的文件緩存中獲取的。而假如數據庫和操作系統支持異步IO,則實際上當數據庫寫進程DBWR寫磁盤時,操作系統在文件緩存中標記該塊為延遲寫,等到真正地寫入磁盤之后,操作系統才通知DBWR寫磁盤完成。對于這部分文件緩存,所需要的內存可能比較大,作為保守的估計,我們應該考慮在 0.2——0.3 倍內存大小。但是假如我們使用的是裸設備,則不考慮這部分緩存的問題。這樣的情況下SGA就有調大的機會。 關于數據庫有多少并發連接,這實際上關系到PGA的大小(MTS下還有large_pool_size)。事實上這個問題應該說還跟OLTP類型或者OLAP類型相關。對于OLTP類型Oracle傾向于可使用MTS,對于OLAP類型使用獨立模式,同時OLAP還可能涉及到大量的排序操作的查詢,這些都影響到我們內存的使用。那么所有的問題綜合起來,實際上主要反映在UGA的大小上。UGA主要包含以下部分內存設置 SQL> show parameters area_sizeNAME TYPE VALUE------------------------------------ ------- -------------bitmap_merge_area_size integer 1048576create_bitmap_area_size integer 8388608hash_area_size integer 131072sort_area_size integer 65536
SQL> 在這部分內存中我們最關注的通常是sort_area_size,這是當查詢需要排序的時候,數據庫會話將使用這部分內存進行排序,當內存大小不足的時候,使用臨時表空間進行磁盤排序。由于磁盤排序效率和內存排序效率相差好幾個數量級,所以這個參數的設置很重要。這四個參數都是針對會話進行設置的,是單個會話使用的內存的大小,而不是整個數據庫使用的。偶然會看見有人誤解了這個參數以為是整個數據庫使用的大小,這是極其嚴重的錯誤。假如設置了MTS,則UGA被分配在large_pool_size,也就是說放在了共享內存里面,不同進程(線程)之間可以共享這部分內存。在這個基礎上,我們假設數據庫存在并發執行server PRocess為100個,根據上面我們4個參數在oracle8.1.7下的默認值,我們來計算獨立模式下PGA的大致大小。由于會話并不會經常使用create_bitmap_area_size、bitmap_merge_area_size,所以我們通常不對四個參數求和。在考慮到除這四個參數外會話所保存的變量、堆棧等信息,我們估計為2M,則100個進程最大可能使用200M的PGA。 現在,根據上面這些假定,我們來看SGA實際能達到多少內存。在1G的內存的服務器上,我們能分配給SGA的內存大約為400—500M。若是2G的內存,大約可以分到1G的內存給SGA,8G的內存可以分到5G的內存給SGA。當然我們這里是以默認的排序部分內存sort_area_size=64k進行衡量的,假如我們需要調大該參數和hash_area_size等參數,然后我們應該根據并發的進程的數量,來衡量考慮這個問題。 事實上,通常我們更習慣通過直觀的公式化來表達這樣的問題: OS使用內存+SGA+并發執行進程數*(sort_area_size+hash_ara_size+2M) < 0.7*總內存 (公式是死的,系統是活的,實際應用的調整不必框公式,這不過是一個參考建議) 在我們的實際應用中,假如采用的是裸設備,我們可適當的增大SGA(假如需要的話)。由于目前幾乎所有的操作系統都使用虛擬緩存,所以實際上假如就算SGA設置的比較大也不會導致錯誤,而是可能出現頻繁的內存頁的換入與換出(page in/out)。在操作系統一級假如觀察到這個現象,那么我們就需要調整內存的設置。