時間:2015-06-28 00:00:00 來源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評論(0)
前言
對于 oracle 的內(nèi)存的管理,截止到9iR2,都是相當(dāng)重要的環(huán)節(jié),管理不善,將可能給數(shù)據(jù)庫帶來嚴(yán)重的性能問題。下面我們將一步一步就內(nèi)存管理的各個方面進(jìn)行探討。
概述
Oracle 的內(nèi)存可以按照共享和私有的角度分為系統(tǒng)全局區(qū)和進(jìn)程全局區(qū),也就是SGA和PGA(process global area or private global area)。對于SGA區(qū)域內(nèi)的內(nèi)存來說,是共享的全局的,在UNIX 上,必須為oracle 設(shè)置共享內(nèi)存段(可以是一個或者多個),因?yàn)閛racle 在UNIX上是多進(jìn)程;而在WINDOWS上oracle是單進(jìn)程(多個線程),所以不用設(shè)置共享內(nèi)存段。PGA是屬于進(jìn)程(線程)私有的區(qū)域。在oracle 使用共享服務(wù)器模式下(MTS),PGA中的一部分,也就是UGA會被放入共享內(nèi)存large_pool_size 中。
對于SGA部分,我們通過sqlplus 中查詢可以看到:
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 454032
Variable Size 109051904
Database Buffers 385875968
Redo Buffers 667648
Fixed Size
Oracle 的不同平臺和不同版本下可能不一樣,但對于確定環(huán)境是一個固定的值,里面存儲了SGA 各部分組件的信息,可以看作引導(dǎo)建立SGA的區(qū)域。
Variable Size
包含了shared_pool_size、java_pool_size、large_pool_size 等內(nèi)存設(shè)置。
Database Buffers
指數(shù)據(jù)緩沖區(qū),在8i 中包含db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三部分內(nèi)存。在9i 中包含db_cache_size、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。
Redo Buffers
指日志緩沖區(qū),log_buffer。在這里要額外說明一點(diǎn)的是,對于v$parameter、v$sgastat、v$sga查詢值可能不一樣。v$parameter 里面的值,是指用戶在初始化參數(shù)文件里面設(shè)置的值,v$sgastat是oracle 實(shí)際分配的日志緩沖區(qū)大?。ㄒ?yàn)榫彌_區(qū)的分配值實(shí)際上是離散的,也不是以block 為最小單位進(jìn)行分配的),v$sga 里面查詢的值,是在oracle 分配了日志緩沖區(qū)后,為了保護(hù)日志緩沖區(qū),設(shè)置了一些保護(hù)頁,通常我們會發(fā)現(xiàn)保護(hù)頁大小大約是11k(不同環(huán)境可能不一樣)。參考如下內(nèi)容
SQL> select substr(name,1,10) name,substr(value,1,10) value
2 from v$parameter where name = 'log_buffer';
NAME VALUE
-------------------- --------------------
log_buffer 524288
SQL> select * from v$sgastat ;
POOL NAME BYTES
----------- -------------------
fixed_sga 454032
buffer_cache 385875968
log_buffer 656384
SQL> select * from v$sga;
NAME VALUE
-------------------- ----------
Fixed Size 454032
Variable Size 109051904
Database Buffers 385875968
Redo Buffers 667648
關(guān)于各部分內(nèi)存的作用,參考Oracle體系結(jié)構(gòu),在此不再敘述。
SGA的大小
那么我們現(xiàn)在來考察內(nèi)存參數(shù)的設(shè)置。實(shí)際上,對于特定的環(huán)境,總是存在著不同的最優(yōu)設(shè)置的,沒有任何一種普遍適用的最優(yōu)方案。但為什么在這里我們還要來談設(shè)置這個話題呢,那僅僅是出于一個目的,避免過度的犯錯誤。事實(shí)上,在任何一個生產(chǎn)系統(tǒng)正式投入使用之前,我們不擁有任何系統(tǒng)運(yùn)行信息讓我們?nèi)フ{(diào)整,這樣就只有兩種可能,一是根據(jù)文檔推薦設(shè)置,另外一種就是根據(jù)經(jīng)驗(yàn)設(shè)置。相對來說,根據(jù)經(jīng)驗(yàn)的設(shè)置比根據(jù)文檔的設(shè)置要可靠一些。尤其是那些24*7 的系統(tǒng),我們更要減少錯誤的發(fā)生。那么我們嘗試去了解不同的系統(tǒng)不同的應(yīng)用的具體設(shè)置情況,從而提供一個參照信息給大家。
為了得出一個參照設(shè)置,我們就必須假定一個參照環(huán)境。以下所有設(shè)置我們基于這樣一個假定,那就是硬件服務(wù)器上只考慮存在操作系統(tǒng)和數(shù)據(jù)庫,在這個單一的環(huán)境中,我們來考慮內(nèi)存的設(shè)置。
在設(shè)置參數(shù)之前呢,我們首先要問自己幾個問題
一:物理內(nèi)存多大
二:操作系統(tǒng)估計(jì)需要使用多少內(nèi)存
三:數(shù)據(jù)庫是使用文件系統(tǒng)還是裸設(shè)備
四:有多少并發(fā)連接
五:應(yīng)用是OLTP 類型還是OLAP 類型
根據(jù)這幾個問題的答案,我們可以粗略地為系統(tǒng)估計(jì)一下內(nèi)存設(shè)置。那我們現(xiàn)在來逐個問題地討論,首先物理內(nèi)存多大是最容易回答的一個問題,然后操作系統(tǒng)估計(jì)使用多少內(nèi)存呢?從經(jīng)驗(yàn)上看,不會太多,通常應(yīng)該在200M 以內(nèi)(不包含大量進(jìn)程PCB)。
接下來我們要探討一個重要的問題,那就是關(guān)于文件系統(tǒng)和裸設(shè)備的問題,這往往容易被我們所忽略。操作系統(tǒng)對于文件系統(tǒng),使用了大量的buffer 來緩存操作系統(tǒng)塊。這樣當(dāng)數(shù)據(jù)庫獲取數(shù)據(jù)塊的時候,雖然SGA 中沒有命中,但卻實(shí)際上可能是從操作系統(tǒng)的文件緩存中獲取的。而假如數(shù)據(jù)庫和操作系統(tǒng)支持異步IO,則實(shí)際上當(dāng)數(shù)據(jù)庫寫進(jìn)程DBWR寫磁盤時,操作系統(tǒng)在文件緩存中標(biāo)記該塊為延遲寫,等到真正地寫入磁盤之后,操作系統(tǒng)才通知DBWR寫磁盤完成。對于這部分文件緩存,所需要的內(nèi)存可能比較大,作為保守的估計(jì),我們應(yīng)該考慮在0.2——0.3 倍內(nèi)存大小。但是如果我們使用的是裸設(shè)備,則不考慮這部分緩存的問題。這樣的情況下SGA就有調(diào)大的機(jī)會。
關(guān)于數(shù)據(jù)庫有多少并發(fā)連接,這實(shí)際上關(guān)系到PGA 的大?。∕TS 下還有l(wèi)arge_pool_size)。事實(shí)上這個問題應(yīng)該說還跟OLTP 類型或者OLAP 類型相關(guān)。對于OLTP類型oracle 傾向于可使用MTS,對于OLAP 類型使用獨(dú)立模式,同時OLAP 還可能涉及到大量的排序操作的查詢,這些都影響到我們內(nèi)存的使用。那么所有的問題綜合起來,實(shí)際上主要反映在UGA的大小上。UGA主要包含以下部分內(nèi)存設(shè)置
SQL> show parameters area_size
NAME????? TYPE??? VALUE
------------------------------------ ------- -------------
bitmap_merge_area_size????? integer????? 1048576
create_bitmap_area_size???? integer????? 8388608
hash_area_size? integer????? 131072
sort_area_size? integer????? 65536
在這部分內(nèi)存中我們最關(guān)注的通常是sort_area_size,這是當(dāng)查詢需要排序的時候,數(shù)據(jù)庫會話將使用這部分內(nèi)存進(jìn)行排序,當(dāng)內(nèi)存大小不足的時候,使用臨時表空間進(jìn)行磁盤排序。由于磁盤排序效率和內(nèi)存排序效率相差好幾個數(shù)量級,所以這個參數(shù)的設(shè)置很重要。這四個參數(shù)都是針對會話進(jìn)行設(shè)置的,是單個會話使用的內(nèi)存的大小,而不是整個數(shù)據(jù)庫使用的。偶爾會看見有人誤解了這個參數(shù)以為是整個數(shù)據(jù)庫使用的大小,這是極其嚴(yán)重的錯誤。假如設(shè)置了MTS,則UGA被分配在large_pool_size,也就是說放在了共享內(nèi)存里面,不同進(jìn)程(線程)之間可以共享這部分內(nèi)存。在這個基礎(chǔ)上,我們假設(shè)數(shù)據(jù)庫存在并發(fā)執(zhí)行serverprocess 為100 個,根據(jù)上面我們4 個參數(shù)在oracle8.1.7 下的默認(rèn)值,我們來計(jì)算獨(dú)立模式下PGA 的大致大小。由于會話并不會經(jīng)常使用create_bitmap_area_size 、bitmap_merge_area_size,所以我們通常不對四個參數(shù)求和。在考慮到除這四個參數(shù)外會話所保存的變量、堆棧等信息,我們估計(jì)為2M,則200 個進(jìn)程最大可能使用200M 的PGA。
現(xiàn)在,根據(jù)上面這些假定,我們來看SGA 實(shí)際能達(dá)到多少內(nèi)存。在1G 的內(nèi)存的服務(wù)器上,我們能分配給SGA 的內(nèi)存大約為400—500M。若是2G 的內(nèi)存,大約可以分到1G的內(nèi)存給SGA,8G 的內(nèi)存可以分到5G的內(nèi)存給SGA。當(dāng)然我們這里是以默認(rèn)的排序部分內(nèi)存sort_area_size=64k進(jìn)行衡量的,假如我們需要調(diào)大該參數(shù)和hash_area_size等參數(shù),然后我們應(yīng)該根據(jù)并發(fā)的進(jìn)程的數(shù)量,來衡量考慮這個問題。
事實(shí)上,通常我們更習(xí)慣通過直觀的公式化來表達(dá)這樣的問題:
OS使用內(nèi)存+SGA+并發(fā)執(zhí)行進(jìn)程數(shù)*(sort_area_size+hash_ara_size+2M) < 0.7*總內(nèi)存
(公式是死的,系統(tǒng)是活的,實(shí)際應(yīng)用的調(diào)整不必框公式,這不過是一個參考建議)
在我們的實(shí)際應(yīng)用中,假如采用的是裸設(shè)備,我們可適當(dāng)?shù)脑龃骃GA(如果需要的話)。由于目前幾乎所有的操作系統(tǒng)都使用虛擬緩存,所以實(shí)際上如果就算SGA 設(shè)置的比較大也不會導(dǎo)致錯誤,而是可能出現(xiàn)頻繁的內(nèi)存頁的換入與換出(page in/out)。在操作系統(tǒng)一級如果觀察到這個現(xiàn)象,那么我們就需要調(diào)整內(nèi)存的設(shè)置。
SGA內(nèi)參數(shù)設(shè)置
Log_buffer
對于日志緩沖區(qū)的大小設(shè)置,通常我覺得沒有過多的建議,因?yàn)閰⒖糒GWR寫的觸發(fā)條件之后,我們會發(fā)現(xiàn)通常超過3M意義不是很大。作為一個正式系
關(guān)鍵詞標(biāo)簽:Oracle,內(nèi)存分配
相關(guān)閱讀
熱門文章 Oracle中使用alter table來增加,刪除,修改列的語法 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 誤刪Oracle數(shù)據(jù)庫實(shí)例的控制文件 為UNIX服務(wù)器設(shè)置Oracle全文檢索
人氣排行 oracle中使用SQL語句修改字段類型-oracle修改SQL語句案例 Oracle中使用alter table來增加,刪除,修改列的語法 ORACLE SQL 判斷字符串是否為數(shù)字的語句 ORACLE和SQL語法區(qū)別歸納(1) oracle grant 授權(quán)語句 ORACLE修改IP地址后如何能夠使用 如何加速Oracle大批量數(shù)據(jù)處理 Oracle刪除表的幾種方法