眾所周知,在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
我的配置是這樣的
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003, Enterprise" /3GB /fastdetect /NoExecute=OptOut
注意在啟動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 專用伺服器模式