突破32位操作繫系統記憶體限製

hzh_hu發表於2005-12-15
有這3篇高手寫的文件就比較全面了,不過要注意在SGA_MAX引數引數存在的時候老是抱錯,資料庫起不來,把sga max遮蔽後解決 眾所周知,在32位的作業系統如win2K上,作業系統能管理的記憶體為4GB(power(2,32) =4G) ,oracle使用的總記憶體有2G限制。目前大多數資訊系統都能為資料庫伺服器配上4G實體記憶體甚至更多,但無論你為系統配置多大的實體記憶體,正常情況下 都不能使oracle使用超過2G的記憶體(包含SGA、PGA等),從而造成系統資源浪費。那麼,有沒有什麼辦法能使執行在windows系統上的 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項中新增 /3G 引數。修改過後的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)="Microsoft Windows 2000 Advanced Server" /3G /fastdetect   注意在啟動win2K AdvServer的一欄裡,多了一個 /3G 引數。這個引數的作用,就是讓windows啟動時,將自己的核心及支援程式裝載到記憶體地址 0xC0000000 到 0xFFFFFFFF 之間,給應用程式留出3G的空間來。   3 修改oralce 的 init.ora 檔案   ..1) 確定oracle的緩衝區及共享池大小,假設作如下定義:   ........ db_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 專用伺服器模式[@more@]

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

相關文章