突破oracle for win2K的2G記憶體限制 (轉)

gugu99發表於2007-08-16
突破oracle for win2K的2G記憶體限制 (轉)[@more@]突破 for 的2G限制  
  眾所周知,在32位的操作如win2K上,能管理的記憶體為4GB(power(2,32) =4G) ,oracle使用的總記憶體有2G限制。目前大多數資訊系統都能為配上4G實體記憶體甚至更多,但無論你為系統多大的實體記憶體,正常情況下都不能使oracle使用超過2G的記憶體(包含SGA、PGA等),從而造成系統資源浪費。那麼,有沒有什麼辦法能使執行在系統上的oracle使用超過2G的記憶體呢?windows 提供了一種叫4GT(4G Tuning)的技術,使得oracle使用超過2G(不超過3G)的記憶體成為可能。而為了讓應用使用更大的記憶體,還有一種PSE36的技術,可以讓oracle使用超過3G的記憶體。這裡,只對我們使用4GT特性讓oracle使用超過2G的記憶體進行討論。

一 使用4GT特性的基本要求:

....儘管可以在不超過2G實體記憶體的系統上使用4GT特性,但oracle並不推薦這種做法,因為這將會嚴重降低系統。以我的來講,如果系統未4G實體記憶體,最好也不要使用這種方法來讓oracle使用更多的記憶體。此外,在需要你的oracle使用超過2G的記憶體時,資料庫伺服器最好不要再執行其他的服務,以減小系統的壓力,讓oracle工作得更好。

....另外,據MS的文件,4GT只能用於 Advanced Server , Datacenter版本上,Server 版以及 Professional 版不能使用4GT特性(實際上是不是也沒有必要?)

二 為什麼4GT能讓應用程式使用超過2G的記憶體

....在正常情況下,windows系統對記憶體的分配是這樣的:在記憶體地址0x00000000 到 0x7FFFFFFF之間的空間,交給應用程式使用,作業系統核心及其支援則使用記憶體地址 0x80000000 到 0xFFFFFFFF之間的空間。在使用4GT之後,作業系統將核心及其支援程式使用的記憶體地址空間到 0xC0000000 到 0xFFFFFFFF之間,從而為應用程式“讓”出來1G的空間。但是,僅僅“讓”出來了這1G的空間還是不夠的,還需要指定哪一個應用程式來使用這“多出來的”1G空間,以及如何分配份額等。後面將結合具體的引數設定來討論。為便於討論,我們將正常情況下應用程式可以使用的2G記憶體(即地址在 0x00000000 到 0x7FFFFFFF 之間的記憶體)稱作普通記憶體,而將windows “讓”出來的1G記憶體(地址在 0x80000000 到 0xBFFFFFFF之間)稱作間接記憶體。

三 oracle使用超過2G記憶體,不超過3G記憶體的具體設定步驟:

1 首先應解除安裝例項,關閉oracle服務。

2 開啟作業系統3G開關:

....修改boot.ini,在啟動windows項中新增 /引數。修改過後的boot.ini檔案應該類似以下內容:

[boot loader]

timeout=8

default=multi(0)disk(0)rdisk(0)partition(1)

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)=" Advanced Server" /3G /fastdetect

注意在啟動win2K AdvServer的一欄裡,多了一個 /3G 引數。這個引數的作用,就是讓windows啟動時,將自己的核心及支援程式裝載到記憶體地址 0xC0000000 到 0xFFFFFFFF 之間,給應用程式留出3G的空間來。

3 修改oralce 的 init.檔案

..1) 確定oracle的緩衝區及共享池大小,假設作如下定義:

........ _block_size = 4096

........ db_block_buffers = 262144 # 緩衝區大小為1G

........ share_pool_size = 314572800 # 使用300M共享池

..2) 新增下列各項內容:

........ use_indirect_data_buffers = true

........ # 告訴oracle可以使用間接記憶體(即可以使用windows讓出來的1G記憶體作為資料緩衝區)

........ pre_page_sga = true

........ # 把oracle SGA鎖定到記憶體中,不產生頁面檔案(8i的引數可能是lock_sga = true)

........ # 對於一個有4G實體記憶體的系統來講,可能這一個引數並不是必須的

4 修改登錄檔,定義oracle的DBbuffer使用常規記憶體大小

....在登錄檔 _Local_Machine中新增一個二進位制值,名稱為AWE_WINDOW_MEMORY ,值的單位為位元組,大小為你需要讓oracle使用普通記憶體作為快取的大小(不是windows讓出來的1G,而是記憶體地址在0x00000000 到 0x7FFFFFFF 之間的記憶體大小)。假如設為209715200,即200M大小,那麼oracle的資料緩衝區將佔用200M的普通記憶體,其餘部分(1G - 200M = 824M)則使用間接記憶體。

5 重新啟動作業系統,啟動資料庫。OK,你現在的 oracle 可以使用2G + 824M記憶體了。

四 幾個補充討論

1 windows系統“讓”出來的1G間接記憶體,只能用於資料緩衝區

....在4GT特性測試中發現,間接記憶體只能用於資料緩衝區,而不能用於共享池,也不能分配給作為PGA。或許有其他的引數可以定義,但我查到的文獻中沒有任何一篇講間接記憶體可以用於哪些地方,而在我們的測試中發現按上面的修改後,間接記憶體只能用於資料緩衝區。此結論只作為一個經驗,不是定論,請各位大俠補充修正。

2 登錄檔中 AWE_WINDOW_MEMORY 引數大小的定義

....這個引數定義緩衝池使用普通記憶體的大小,不能太小。在資料塊大小為4K,緩衝池為1G(即使用262144個塊作緩衝池)大小的情況下,此引數定義為100M時,oracle不能啟動,定義為200M時正常啟動。根據我閱讀文獻後對這個情況的理解,資料緩衝區的每一個塊的塊頭資訊都將存放於普通記憶體中,不能存放於間接記憶體中。如果此引數定義過小,導致緩衝區塊頭資訊都不能存放,則可導致資料庫啟動失敗。那麼,是不是同樣大小的緩衝區,資料庫塊越大,則這個引數就可以定義得越小,因而可以佔用更少的普通記憶體呢?有待驗證。

....在具體的應用中,如何定義此引數,應綜合考慮最大併發連線數(專用伺服器下)、使用者重用的堆疊大小、排序區、共享池、大池等記憶體引數的設定情況,儘可能的將資料緩衝區放到間接記憶體中,充分利用系統的資源。

3 間接記憶體的效能

....據oracle的文獻講,間接記憶體的效能(我想主要是指速度和吧?)不如直接記憶體,絕不推薦在未安裝有4G實體記憶體的系統上使用4GT特性。我不知道如何比較間接記憶體與直接記憶體的速度和效率,因而未作測試,姑且信之。

....一點小結,期望能對大家有所啟發。還請各位大俠補充指正。

以上內容的測試環境:

IBM X360 +4G記憶體 + RAID 5陣列

Windows 2000 Advaced Server SP3 + oracle 8.1.6 專用伺服器模式
 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-960558/,如需轉載,請註明出處,否則將追究法律責任。

相關文章