Windows 2000下的Oracle性能優化需要考慮磁盤I/O、CPU、網絡子系統、內存幾個子系統,這裡著重介紹Oracle在Windows 2000環境下的內存調整。
Oracle是一個磁盤I/O強烈的應用,要確保你恰當地配置磁盤和文件系統:
在磁盤上建立數據文件前首先運行磁盤碎片整理程序
為了安全地整理磁盤碎片,需關閉打開數據文件的實例,並且停止服務。如果你有足夠的連續磁盤空間建立數據文件,那麼你就很容易避免數據文件產生碎片。
不要使用磁盤壓縮
Oracle數據文件不支持磁盤壓縮。
不要使用磁盤加密
加密象磁盤壓縮一樣增加了一個處理層降低磁盤讀寫速度。如果你擔心自己的數據可能洩密,就使用dbms_obfuscation包和label security選擇性地加密數據的敏感部分。
不要使用超過70%的磁盤空間
剩余的磁盤空間存放系統臨時數據和作為磁盤碎片整理程序存放中間數據。
使用RAID
選擇硬件RAID超過軟件RAID;
帶有硬件RAID控制器;
日志文件不要放在RAID 5卷上,因為RAID 5讀性能高而寫性能差。
把日志文件和歸檔日志放在與控制文件和數據文件分離的磁盤控制系統。
分離頁面交換文件到多個磁盤物理卷
跨越至少兩個磁盤建立兩個頁面文件。你可以建立四個頁面文件並在性能上受益,確保所有頁面文件的大小之和至少是物理內存的兩倍。
取消屏幕保護
屏幕保護吸取大量的CPU資源而且提供的是對數據庫服務器毫無意義的用處,特別要禁止3GL屏幕保護,如果你必須使用屏幕保護就用“空屏幕”減少CPU使用。
把系統配置為應用服務器
運行控制面板的“系統”,在高級選項卡中設置“性能選項”到“後台程序”,這提供優先權給應用程序,象類似Oracle的服務,反對用戶在圖形用戶界面啟動一個笨拙的程序。
監視系統中消耗中斷的硬件
消耗CPU中斷和時間的硬件應該避免使用。通常這樣的硬件是便宜的因為它把工作載入CPU,而CPU要處理外圍的高級性能的硬件,通常需要注意:
1、支持總線控制的網卡
2、支持DMA而不支持PIO的磁盤控制器
使用性能監視器跟蹤處理器對象的%Interrupt Time 計數器數值,和這個計數器的基線和標准,然後監視問題。
3、有利避免中斷的方式是使用硬件RAID控制器代替Windows 2000支持的軟件RAID。
保持最小的安全審計記錄
在專用服務器上運行Oracle
Oracle是內存消耗大戶,不要在執行下列功能的系統上運行Oracle數據庫:
1、主域或備份域控制器(Windows 2000下都稱域控制器)
2、文件服務器
3、打印服務器
4、遠程訪問服務器
5、路由器、代理或防火牆
不要使用花哨的壁紙(如果使用,要盡量減小壁紙文件大小)
禁止非必須的服務
最好禁止系統裡非必須的服務,如果時而需要某些服務功能,可將啟動類型設置為“手動”,要做到這一點首先同網絡管理員驗證實際的服務需求:
1、如果你的系統不需要打印機,通常停止這個服務並設置為手動;
2、停止License Logging Service服務除非你對它有特殊要求;
3、不應該使用DHCP服務,並禁止它;
4、不要自動啟動你不需要的程序;
檢查菜單“開始/程序/啟動”裡的內容,刪除不需要的程序。
網絡配置是性能調整的一項很重要的內容,而且很容易隱藏性能瓶頸。
配置網卡使用最快速度和有效模式
這針對自動檢測,大多數缺省安裝是NIC,如果這是可選的就盡量調整為“全雙工”和最大化線速度。
刪除不需要的網絡協議
只保留TCP/IP協議。
優化網絡協議綁定順序
在每個網卡上設置主協議,典型地是TCP/IP,到協議列表的頂端。
為Oracle禁止或優化文件共享
理想地應該禁止文件共享功能來最小化安全洩露和網絡交通,但如果你需要使用文件和打印共享,那麼就配置系統中每個網卡的“連接屬性”,設置“最大化網絡應用程序數據吞吐量”
內存優化是Windows平台的關鍵設置,首先了解一下Windows 2000平台的Oracle結構:
基於線程的結構
Windows2000是基於線程的結構,相反,Unix操作系統是基於進程的結構。這意味著Windows中更多的應用,包括Oracle在內,是以帶有多個線程的單個進程的形式執行,這種基於線程的結構的確給Window2000帶來優勢——更容易共享內存。內存空間為每個進程分配,進程間共享內存很笨拙,要使用附加編碼,線程是進程的子集,使用比進程少得多的內存。特定進程的所有線程共享同樣的進程內存空間,同一進程的線程間共享內存比不同進程共享內存要快,這給基於線程的結構很大優勢,更有效。
在服務器上運行的每個應用程序都有一個,而且只有一個進程。進程是應用程序的載體,是用來容納執行應用程序實際工作的線程的。從用戶角度看,進程是不用任何專門工具就可以看到的組件。進程對其他應用程序組件的作用就像容器一樣。它持有虛擬的存儲空間、數據、系統資源和應用程序設置。雖然線程可以分配、重新分配和釋放內存,但是進程接受初始的內存分配,並將它分配到請求內存的所有線程。線程是包含在進程內共享所有進程資源的單個執行路徑。它還包含堆棧(存儲在內存中的變量和其他數據)、CPU寄存器的狀態信息(所以,線程可以恢復它的環境)、和在系統調度程序的執行列表中的一個登錄項。每個線程規定了完成任務應用程序需要作的某種工作。
使用Task Manager的主要問題是看不到任何線程。Task Manager被設計成從進程層將應用程序作為整體看待。當然還可以使用性能監視器來監視Windows下的Oracle內存使用。
從“開始/程序/管理工具”選擇“性能”啟動“系統監視器”。注意,“性能”包括兩個MMC插件:“系統監視器”和“性能日志和變更”。這時,需要一些被監視的計數器(計數器是一些性能指示器,用於對 Windows 2000的特殊對象進行統計,例如統計特定線程所要求的處理器時間)。單擊“添加”按鈕(在圖中看起來象一個加號),將看到“添加計數器”對話框。首先需要選擇想監視的“性能”對象。在包含“進程”對象和“線程”對象的“性能”下拉列表中選擇。
進程觀察器(Process VIEwer)是比較容易檢查線程和進程的方法之一。可以在 Windows 2000 Support Tools 或Windows 2000 Resource Kit內找到一些工具。Windows 2000 Support Tools是Windows 2000的一部分,但是並不自動安裝。支持安裝的Windows Installer文件在%CDROM%\SUPPORT\TOOLS\目錄下。只要在2000RKST.MSJ上右擊,並從context菜單上選擇安裝即可。
內存
基於線程的結構的確有一些內存限制,因為單個進程由線程組成,而進程的地址空間是受限的,因此很少有空間是機動的。因為Windows 2000仍然是32為操作系統,單個進程地址空間被限制在4GB內,其中一半被操作系統保留,這2GB被OS保留的系統內存也被視為系統地址空間,他包括OS內核編碼、硬件抽象層編碼(HAL)和需要管理進程和OS交互的不同的其它結構,這2GB的系統地址空間是禁止應用程序進程訪問的。因此,Windows 2000標准服務器單個應用程序進程可使用內存空間共2GB。在Windows 2000高級服務器啟動文件boot.ini中有/3GB開關,改變這個比例到3GB,這項技術被稱作4GB調優(4-gigabyte tuning,或4GT),我們將針對這個問題展開詳細討論。
保留的內存是分配給線程的內存並且留作將來使用,但沒有實際使用的內存。因為沒有實際使用,因此它對其它進程仍然有效。但是,因為它已經被分配,它仍然由對擁有線程的進程的總的內存限制產生,因此,保留內存的計算針對2GB或3GB的限制,並且進程保留的和使用的內存的總和不能超過這個限制。
除了系統中安裝的物理內存之外,Windows 2000還使用虛擬內存。這實際上是駐留在硬盤上的內存。但是Windows 2000使得它對應用程序來說,就像是安裝在機器上內存一樣。當某個應用程序塊要求訪問那個內存時,Windows 2000就把另外的內存塊復制到磁盤上,而把所要求的內存放到物理內存中,這些內存塊的大小是4KB。也就是說,每次應用程序提出對內存的要求時,內存就被分配在4KB的頁面內。在磁盤上模擬內存的文件叫做頁面調度文件。Virtual Memory Manager(VMM虛擬內存管理器)是操作系統管理機器上的虛擬內存組件。所有的內存訪問都通過VMM。這意味著每當操作系統需要進行內存調頁時,就要提出VMM請求。
內存調優方法:
(一)使用超過4GB的內存
另外,有辦法允許為單個進程或應用分配超過32位地址空間的內存,為實現這一點,Windows 2000使用物理地址擴展(physical address extensions ,或PAE),PAE本質上把地址空間從32位增加到36位,但是必須有Pentium Pro或更新的處理器才能享受這個優勢。在Windows NT 4.0下,Intel提供PSE36驅動程序享受全部36位地址空間的優勢,但是在Windows 2000 Advanced Server中36位地址空間的支持已經建立在操作系統中,然而,應用程序必須使用地址窗口擴展(Address Windowing Extensions ,或AWE)API寫成,Oracle9i 發行號1(Release 1)不支持AWE,所有的Oracle 8i發行號(releases 8.1.5–8.1.7)都支持AWE。Oracle在9i發行號2(Release 2)中實現了對AWE的支持。
(二)AWE和Windows 2000
AWE允許你使用系統中任何附加的超過4GB的內存,為了體現這個優勢,你必須有超過4GB的內存,必須有Pentium Pro或更新的處理器,必須運行Windows 2000高級服務器或Windows 2000數據中心服務器,不需要特殊的驅動程序,因為Windows 2000已經支持AWE。
為了利用這項優勢,必須在啟動Windows 2000機器時在boot.ini文件中使用/PAE開關,你必須確保運行Oracle服務的帳戶有Lock Pages in Memory權限。給運行Oracle服務的帳戶增加Lock Pages in Memory權限後,要重新啟動OracleService
(三)AWE和Oracle
可以確定,Oracle8i所有發行號版本和Oracle9i發行號2只允許你為數據庫塊緩沖區配置超過4GB限制的內存空間,因此,要為用戶連接釋放標准進程地址空間的內存(低於3GB界限的內存)、PGA內存和組成SGA的不同內存緩沖池。
在初始化參數文件init.ora中要設置參數USE_INDIRECT_DATA_BUFFERS=TRUE,沒有這個參數,Oracle不能尋址到4GB以上的地址空間。接下來要設置決定內存使用總量的緩沖池大小,設定DB_BLOCK_SIZE和DB_BLOCK_BUFFERS兩個參數。
在Oracle9i發行號2中,參數DB_BLOCK_BUFFERS被參數DB_CACHE_SIZE所代替,這樣就改變了原來指定緩沖區塊數到指定緩沖區字節數,同樣,也解釋了在Oracle9i發行號2的一個數據庫中支持多個數據庫塊大小。無論用哪種辦法,如果你設定參數USE_INDIRECT_BUFFERS=TRUE,你將只能定義和使用單個數據庫塊大小和塊緩沖區(就象在9i以前的發行號中),因此,如果缺省數據庫塊大小是4k、8k或其它,而設置DB_2k_CACHE_SIZE是不允許的。
接下來需要在注冊表中為ORACLE_HOME設置合適的AWE_WINDOW_MEMORY參數值,也就是在HKEY_LOCAL_MacHINE\ Software\Oracle\HOME0下,這個參數指定字節數,如果沒有設置,缺省值是1 GB。這個參數的大小取決於你要設置多少緩沖區大小,並視為來自3GB進程地址空間的常規內存。以緩沖區大小為6 GB為例,設置AWE_WINDOW_MEMORY為缺省值1GB,你希望1GB 視為常規內存,並且剩余5GB緩沖區來自4GB限制以上的地址空間。你希望更多的緩沖池盡可能保留在常規地址空間,因為訪問超過4GB以上的緩沖池比訪問虛擬地址空間緩沖池要慢(盡管仍然比磁盤I/O操作快)。
(四)解決與AWE相關的內存問題
需要注意的是每個4GB界限以上的塊緩沖區需要在常規地址空間保留大約200字節的緩沖區頭,因此,在上面的例子中,我們大約有312000個緩沖區頭指向擴展地址空間的緩沖區,緩沖區頭大約占80MB常規內存空間,如果數據庫塊很小,那麼這個數量會相當高,因此,必須確保這些緩沖區頭、AWE_WINDOW_MEMORY、和所有Oracle.exe進程的內存需求,包括編碼、SGA其它組件、PGA內存和每個用戶連接棧都適合Oracle.exe進程的常規3GB虛擬地址空間。
確認你有足夠的物理內存處理超過AWE_WINDOW_MEMORY之外的DB_BLOCK_BUFFERS,在我們的例子中定義緩沖池大小為6GB,1GB來自常規地址空間,剩余5GB來自4GB以外的對整個進程有效的系統和進程地址空間,因此,這個例子只能工作在至少有9GB內存的機器上,你還應該為其它進程保留一些空間,只有一個進程可以在某一時刻訪問附加的內存。
象前面所說的那樣,/PAE開關只用於系統有超過4GB物理內存的時候,但如果系統內存少於4GB時,也可模仿這項功能。在boot.ini文件中設置MAXMEM參數的值,如下面例子,設為2GB,意味著任何2GB以上的內存都將保留為AWE內存。
multi(0)disk(0)rdisk(0)partition(1)\WINNT="Microsoft Windows 2000 Advanced
Server" /fastdetect /PAE /MAXMEM:2048
為一個數據庫使用附加的多個進程
真正的應用集群(Real Applications Clusters,RAC)提供有多個實例運行和訪問同一數據的能力。通常,這用於有兩個或多個節點的項目,一個實例運行在每個節點。無論如何,它支持在Oracle9i有兩個實例運行在一個節點訪問同一個數據庫。這能克服每個進程的內存限制,又提供某些其它的利益,如應用程序失敗檢測。