數(shù)據(jù)庫-oracle8-8i開發(fā)使用手冊_第1頁
數(shù)據(jù)庫-oracle8-8i開發(fā)使用手冊_第2頁
數(shù)據(jù)庫-oracle8-8i開發(fā)使用手冊_第3頁
數(shù)據(jù)庫-oracle8-8i開發(fā)使用手冊_第4頁
數(shù)據(jù)庫-oracle8-8i開發(fā)使用手冊_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第22每一個數(shù)據(jù)庫管理員都面對過這樣一種情形,即數(shù)據(jù)庫開始拖延并由于某種原因速度突然變慢。這種現(xiàn)象能夠發(fā)生在一個已被很好調(diào)整過的數(shù)據(jù)庫中,它會在不知不覺中影響你。這時數(shù)據(jù)庫管理員需要用技巧來辨認資源密集型用戶并做一些必要的影響數(shù)據(jù)庫性能的事情。我查明用光全部系統(tǒng)資源并引起數(shù)據(jù)庫整體性能下降的會話。資源密集型用戶可能是一個執(zhí)行大型查詢的用戶,其中該查詢擁有很多表并在SELECT子句中遺漏了幾個鍵列連結(jié),或者它可以是一個未優(yōu)化的語句。本章的目的就是要使數(shù)據(jù)庫管理員具備必要的技巧以便相對容易地鑒別這樣的用戶。本章提供鑒別資源密集型用戶的方法和技術(shù),但沒有詳細地糾正問題的細節(jié)。關(guān)于如何解決它們的細節(jié)將在本書中其他有關(guān)性能調(diào)整的章節(jié)中。你可以采用許多方法鑒別資源密集型用戶。下面這個方法首先對環(huán)境進行了概述。假如覺察到出錯的地方,那么應(yīng)進一步地在該區(qū)域中以便對用戶進行詳細描述。你要查看的資源是CPU、文件輸入/輸出和內(nèi)存。假如CPU被嚴重加載并且完全被某個執(zhí)行大量的CPU密集型工作的用戶占用的話,那么該用戶會降低系統(tǒng)速度。類似,頻繁地文件輸入/輸出也能夠引起系統(tǒng)性能下降。某些進程對內(nèi)存的頻繁請求會導(dǎo)致內(nèi)存分頁與交換,這將嚴重阻礙系統(tǒng)性能。你應(yīng)把注意力集中在這三種資源上?;旧希诜?wù)器上執(zhí)行的每一個進程試圖獲取如下資源:CPU—每一個進程都需要一些CPU時間片以執(zhí)行它的工作。有些進程奪取了大量CPUCPU能力必須在系統(tǒng)上的Oracle進操作系統(tǒng)(OS)CPU密集型用戶是指消耗大量文件輸入/輸出—每當一個進程需要存取數(shù)據(jù)時,如果該數(shù)據(jù)已經(jīng)由以前的某個進程帶入的話,那么該進程就首先查找緩存。如果數(shù)據(jù)已經(jīng)存在于該緩存中,則很快便完成。如果需要的數(shù)據(jù)不在緩存中,那么就必須從磁盤上該數(shù)據(jù)。這時必須執(zhí)行一個物理。這種從磁盤中數(shù)據(jù)的操作非常耗時,因為從磁盤中讀數(shù)據(jù)所用的時間幾乎是從高速緩存中讀數(shù)據(jù)所用時間的50倍。當系統(tǒng)開始密集地進行輸入/時,系統(tǒng)性能開始下降,因為所有進程在大部分時間里所做的工作就是等待將要從磁盤中返回的數(shù)據(jù)。內(nèi)存—造在UNIX操作系統(tǒng)中,利用虛擬內(nèi)存的原理可以有效地使用內(nèi)存。在一個虛擬內(nèi)存系統(tǒng)中,僅僅最常使用的頁面才被保留在物理內(nèi)存中;其余的或當前非活動頁面被保存在交換空間中,在需要時才被引入物理內(nèi)存中。當由于物理內(nèi)存較少或進程對內(nèi)存的頻繁使用而使得系統(tǒng)中的內(nèi)存短缺時,為滿足對內(nèi)存的需要,系統(tǒng)首先開始分頁。假如內(nèi)存仍然短缺,系統(tǒng)便求助于交換物理進程,實際上這樣做會降低系統(tǒng)性能。分頁與交換將在稍后的22.4節(jié)中。當大量使用這些資源時,系統(tǒng)會經(jīng)歷性能的下降。因此,給每一個用戶分配多少資源非常重要。要鑒別嚴重資源消耗,你應(yīng)每次把注意力集中在一種資源上并設(shè)法鑒別由進程消耗的個別資源。WindowsNT用于WindowsNT的Oracle8i包含如下三種性能工具Oracle8WindowsNT性能程序Oracle8性能程序Oracle8有多組的有關(guān)數(shù)據(jù)庫性能信息的數(shù)據(jù)字典視圖。有兩個常見的數(shù)據(jù)字典視圖類(static)(dynamic。靜態(tài)視圖包含有關(guān)數(shù)據(jù)庫整體結(jié)構(gòu)的信息,例如名稱、數(shù)據(jù)庫文件的位置、用戶信息、器使用率、重做日志和控制文件信息等。動態(tài)視圖(也稱為V$表)反映了諸如物理輸入/輸出、內(nèi)存使用率、用戶活動等實時性能信息。WindowsNT性能程WindowsNT可以調(diào)整的參數(shù)不多。例如,在UNIX操作系統(tǒng)中,系統(tǒng)管理員可以修改大量的直接影響系統(tǒng)性能的參數(shù)。相反,WindowsNT根本不能接觸到參數(shù)。WindowsNT被認WindowsNT操作系統(tǒng)的大部分性能信息可以在WindowsNT性能程序(PerfMon)中找到。WindowsNT性能程序是一個靈活的圖形工具,你可以使用它來收集有關(guān)WindowsNT的實時性能信息。它也為被選取的每一個計數(shù)器產(chǎn)生一個數(shù)值。這些值顯示在圖的。你可以使用該信息確定系統(tǒng)中正經(jīng)歷性能瓶頸的部分并采取相應(yīng)的步驟消除這些問題。WindowsNT幾乎把整個操作系統(tǒng)中的每一個事物作為一個對象對待。Oracle8性能程racle8性能程序是一系列定制的WindowsNT性能程序計數(shù)器,它們能夠用來測量Oracle數(shù)據(jù)庫的性能。此性能工具采用數(shù)據(jù)字典視圖的信息并以圖形方式顯示該信息。計數(shù)器全部基于依靠數(shù)據(jù)字典發(fā)出的SQL語句。你可以在PERF81.ORA文件中看到由Oracle8PerfMon發(fā)出的SQL語句,PERF81.ORA文件位于ORANT\DBS 中。當你單擊Oracle8程序圖標時便自動建立一個到數(shù)據(jù)庫的連接。用于此連接的用戶名、口令和其他信息位于WindowsNT表中。要查看此信息,運行表編輯程序(REGEDT32.EXE。打開HKEY_LOCAL_MACHINE鍵,然后定位到SYSTEM\CurrentControlSet\Service\Oracle80\Performance通過雙擊用戶名、口令或主機名來相應(yīng)地改變它們的值(參見圖 22-1。缺省設(shè)置是圖22-1用于Oracle8性能工具的用于Oracle8的性能程序計數(shù)器顯示于表22-1中表22- 計數(shù)Oracle8緩 %物理讀/獲取的次Oracle8字典緩 %遺漏/獲取的次Oracle8數(shù)據(jù)文 物理讀/秒的次數(shù);物理寫/秒的次(每一個實例是一個單獨的數(shù)據(jù)文件Oracle8DBWRstats 已搜索的緩沖區(qū)/秒;LRU搜索/Oracle8DBWRstats 檢查點/秒;停工時間/Oracle8動態(tài)空間管 循環(huán)調(diào)用次數(shù)/每Oracle8 %表等待次數(shù)/請Oracle8庫緩 %重新加載/Oracle8重做日志緩沖 重做日志空間請Oracle8排 內(nèi)存中的排序數(shù)/秒;磁盤上的排序數(shù)/UNIX系統(tǒng)是一個多進程操作系統(tǒng);也就是說,UNIX操作系統(tǒng)能夠同時管理多個進程。每一個必須執(zhí)行一個作業(yè)的進程在運行隊列中等待得到CPU時間片來執(zhí)行它的作業(yè)。當輪到某一個進程時,該進程便被分配一個時間片,它在該時間片中執(zhí)行它的作業(yè)。一個經(jīng)過良好調(diào)整的CPU22.2.2鑒別那些消耗過多CPU資源的進程。當做此練習(xí)時,記住,在一個較輕負載的系統(tǒng)中,一個進程可以獨占整個CPU,這很普通并且不會成為驚慌的理由。當你試圖鑒別CPU密集型用戶時,你務(wù)必保證在任何時間點上系統(tǒng)中有足夠數(shù)量的作業(yè)正在運行并且存在性能問題。僅在這種情況下你才可以采用這里提到的方法,因為在低負載的系統(tǒng)中,少量的用戶消耗了大量的CPU時間,這確實很普通。CPU在你鑒別正引起CPU資源問題的用戶以前,你必須大致了解一下CPU是如何運轉(zhuǎn)的。在UNIX系統(tǒng)中,你可以使用sar-u命令確定CPU的工作情況。sar-u命令有4列輸出,見表22-2表22- sar-u命令輸出中的重要列 花費在為用戶請求服務(wù)上的CPU時間的百分 CPU參與系統(tǒng)調(diào)用所花費的時間百分 空閑CPU時間的百分一個正常的或經(jīng)過良好調(diào)整的CPU通常使用戶CPU時間是系統(tǒng)CPU時間的兩倍;也就是說,同服務(wù)于系統(tǒng)調(diào)用相比,CPU花費時間服務(wù)于用戶請求。n是執(zhí)行的時間間隔,t是執(zhí)行的次數(shù)。下面是一條sarCPUUtilization命令的輸假如CPU的空閑時間,這可能意味著CPU沒有被最充分地利用。假如%wio、假如CPU花費的系統(tǒng)時間高于用戶時間,這也需要進行檢查。你旨在使用戶CPU時間成倍于或超過系統(tǒng)CPU時間;否則,你需要進一步的檢查。面的輸出中,%wio列具有較高的數(shù)值;這意味著在當前的方案中,CPU沒有出現(xiàn)問題,但是在磁盤上可能存在瓶頸。你需要進一步執(zhí)行sar-d命令以便發(fā)現(xiàn)哪一張磁盤正輸入/輸出負載。正如較早前所提及的那樣,每一個必須在系統(tǒng)中執(zhí)行的進程要在運行隊列中等待。假如有太多的作業(yè)在運行隊列中等待,這表明系統(tǒng)中有大量的資源密集型作業(yè)正在運行,此時CPUCPU于系統(tǒng)中運行的進程而停頓的好起點:表22- 對sar-qu輸出中的列的解 列描 等待執(zhí)行的進程占用的運行隊列時間百分swpq-sz 在執(zhí)行的間隔期內(nèi)交換隊列的平均長度。準備運行但已經(jīng)被換出的進程包含在此數(shù)量中%swpocc 能夠運行的進程(已換出但準備運行的進程)占用的交換隊列的時間從上面的輸出中,你可以看到運行隊列的容量僅為1;這意味著在間隔期內(nèi),隊列中僅有一個進程正在等待CPU。在間隔期內(nèi),占用的運行隊列百分率僅為整個時間的25%。你可以推斷出CPU在此時刻負載較輕。一般要注意一個超過5或6的運行隊列。假如該隊列大于這些值,要么減少運行進程的數(shù)量、增加CPU的數(shù)量,要么升級已有的CPU。你可以鑒別正等待CPU資源的進程或使用下一節(jié)提到的技術(shù)加載CPU。尋找CPU有幾種方法用來尋找系統(tǒng)中 CPU密集型用戶。你既可以使用操作系統(tǒng)工具,也可以用在Oracle系統(tǒng)表中的信息來鑒別CPU密集型用戶。在本節(jié)中,兩種方法你都要檢驗一下。事實上,這兩種方法都可以用來尋找系統(tǒng)中的CPU密集型用戶。使用OracleOracle動態(tài)系統(tǒng)性能表提供了有關(guān)系統(tǒng)中正在發(fā)生的事件的大量信息。V$SYSSTAT與于V$SYSSTAT視圖中的數(shù)值的通用列表在下面的22-1中給出。你感的信息SQL>select*fromv$sysstatorderby22-1是上述SQL語句的輸出結(jié)果22- 使用V$SYSSTAT視圖查找系統(tǒng)統(tǒng)計信從 22-2中,你可以推斷出會話 45與95是系統(tǒng)中的頂端CPU用戶,它們消耗CPU的時間分別為95分鐘和22分鐘。此輸出存在的唯一問題是它反映了自會話開始以來的累積統(tǒng)計值,而不是一個時間間隔內(nèi)的統(tǒng)計值。假如會話A在8小時內(nèi)已占用了50分鐘的CPU時間,會話B在1小時中已經(jīng)占用了30分鐘的CPU時間,此輸出將報告會話A較會話B來說是高CPU用戶——事實并非如此,因為會話B的CPU使用率遠超過會話A的CPU使用率。然而,此輸出對系統(tǒng)中的頂端CPU用戶做了一個相當假如你希望更精確的話,你必須捕獲經(jīng)過一個時間間隔的統(tǒng)計值。選擇系統(tǒng)在一天中最忙的一段時期,然后捕獲該會話的CPU使用信息并把它在一個臨時表中。在繁忙期過去用V$SESSA視圖的會話的CPU使用信息并把它在一個臨時表中。在臨表中的個照中捕的息能夠來解間隔內(nèi)個會話的CPU使用率以及總CPU使用情況。這可以用22-3中的來實現(xiàn)。22- 在該表創(chuàng)建之后,使用22-4中的可以對第一個快照進行處理22- 用于捕獲stat$cpu_begin表中的起始CPU統(tǒng)計信息類似地,在繁忙期結(jié)束后,你可以再運行22-5中的并生成stat$cpu_end表22- 用于捕獲stat$cpu_end表中的結(jié)束CPU統(tǒng)計信息現(xiàn)在準備生成CPU密集型用戶報告以及CPU使用率。該報表更精確,因為它報告了CPU的使用率,該使用率是確定資源密集型用戶的一個重要因素。該報表用每小時使用CPU的分鐘數(shù)顯示了每個會話的CPU消耗率。此快照技術(shù)消除了22-5中的差異。22-6中顯示的22- 用于使用快照生成CPU使用視圖是對于統(tǒng)計量為12(CPUusedbythissession)的視圖。如果該值在返回到客戶進一個具有還沒有返回的用戶調(diào)用的批處理作業(yè),那么CPU使用值或許不能在V$SESSTAT視圖中更新并且你可能會得到確的結(jié)果。當你正在使用以前的SQL列表時要注意這一點。假如時間間隔較大且所有的會話在此間隔內(nèi)的某個時間點上CPU資源的會話,那么你可以確定正在執(zhí)行的大量使用22-7中的可以用來發(fā)現(xiàn)會話當前正在執(zhí)行的SQL語句。這清楚地了會話正在執(zhí)行哪一個程序,當前代碼段是什么以及是否需要在該SQL上執(zhí)行一個查詢優(yōu)化。22- 用于發(fā)現(xiàn)會話當前正在執(zhí)行的SQL注意這里提到的技術(shù)假定用戶不經(jīng)?;蜃N。假如用戶經(jīng)?;蜃N,那么由Oracle分配的會話標識會變化,使得在會話級或報告會話變得起來。注意因為繁忙的時間間隔已經(jīng)過去,所以它與執(zhí)行22-7中的無關(guān)。然而,通使用22-8中的創(chuàng)建臨時表并由會話執(zhí)行 SQL語句22- 用于創(chuàng)建SQL執(zhí)行歷史記錄表stat$session_hash在創(chuàng)建了該表后,你可以運行22-9中的以創(chuàng)建sp_stat$sample_hash過程,該過程在SQL執(zhí)行歷史記錄表stat$session_hash中由期內(nèi)的不同會話執(zhí)行的所有SQL語句。22- 用于創(chuàng)建sp_stat$sample_hash過程該過程(sp_stat$sample_hash)能夠在期內(nèi)間歇地運行。在捕獲了開始和結(jié)束CPU使用信息以及SQL執(zhí)行歷史之后,你可以產(chǎn)生一個CPU密集型用戶以及每一個會話在快照期內(nèi)所執(zhí)行的SQL語句的報告。該報告隨后便可以用來調(diào)整引起大量使用CPU的SQL語句。22-10給出了產(chǎn)生大量使用CPU報告的以及由會話執(zhí)行的SQL語句的哈西值。22- 用于產(chǎn)生CPU使用報告以及在期內(nèi)執(zhí)行的SQL語句的哈西值從此輸出中,你能夠很容易地確定會話23與24是頂端CPUCPU的時間分別是9.68分鐘與8.46分鐘。使用sql_hash_value與V$SQTEXT視圖,你可以確定長時間使用CPU的SQL語句并采取相應(yīng)的措施。22-10中的num_occ列顯示了在期內(nèi)執(zhí)行SQL語句的次數(shù)。注意大使用PU的SQ句很能是全掃或系統(tǒng)引起物理的SQ語句。當所需要的數(shù)據(jù)已經(jīng)不在數(shù)據(jù)塊緩沖區(qū)時會發(fā)生遺漏,數(shù)據(jù)必須從物理設(shè)備中讀取。假如沒有空閑的空間,數(shù)據(jù)遺漏會緩沖區(qū)管理器在緩沖區(qū)緩存中為將要的數(shù)據(jù)分配空間。然后,緩沖區(qū)管理器把要被寫出的數(shù)據(jù)塊移動到臟列表中以便它們可以隨后被寫出到磁盤中。與直接從高速緩存中讀出數(shù)據(jù)相比,緩沖區(qū)管理器的處理要求使理成為個PU密集作。你可以使用top命令查找UNIX系統(tǒng)中的CPU密集型用戶。top命令按照等待時間由高到低CPU用戶。當頂端CPU用戶被找到后,你可以發(fā)現(xiàn)該用戶正在做什么。22-1是top命令的一個輸出示例。22- 從此輸出中,很明顯可以看出PID為28586并且USERNAME為manish的用戶是CPU密集型用戶。注意,從USER、SYS與IDLEUSER的值為46%,SYS為1.2%,其余是空閑的。這意味著該系統(tǒng)主要服務(wù)于用戶請求,這是一個好的跡象。盡管用戶是頂端CPU用戶,但是這不必驚慌,因為在一個負載較輕的系統(tǒng)中,如果有一個需要大量CPU的進程,那么它會獨占CPU。0.50.61和0.6。0.59是最后1分鐘的負載平均值,0.61是最后5分鐘的負載平均值,0.6是最后1515分鐘內(nèi)的情況,當CPU并且系統(tǒng)性能變壞時,負載平均值是非常有用的信息。當負載平均值突然增加時,你可以推斷23表明系統(tǒng)輕度負載,裝載量為5或6表明系統(tǒng)中度負載。其他要查看的信息有%CPU列,它指示了由特定進程使用的CPU時間的百分率。如果該數(shù)值較高,則很明顯表明該進程是一個大量花費CPU時間的進程你還可以使用s命令確定CPU密集型用戶。ps命令包括了一個顯示CPU在服務(wù)于特殊進程時所花費時間的列。你可以按照花費CPU時間由高到低的順序?qū)s的輸出進行排序,并再次找出頂端CP22-12顯示PID為28586和14171是頂端CPU資源。自進程開始以來,28586已經(jīng)使用了192.21分鐘的CPU時間,14171已經(jīng)使用了152.29分鐘的CPU22- 使用ps命令得到CPU注意PU資源、目前處于空閑狀態(tài)的會話。要確定進程是否是空閑的,再次運行相同令并檢查CPU時間是否增加了。活動會話可以通過查看22-12中的第二列來得到識別。數(shù)值R表明它正在運行。即便在這里,一個具有S狀態(tài)的進程當前也可以在睡眠,因為它正在等待某些事情,然后轉(zhuǎn)入運行狀態(tài)。為了識別一個當前處于活動狀態(tài)的頂端CPU資源,請記住以上所有的這些東西。換句話說,顯示于Oracle途徑中的快照技術(shù)可以用于識別。最后,管理員可以把來自O(shè)racl途徑的值以及來自操作系統(tǒng)途徑的值在資源密在pid被識別之后,你可以找到sid進程并進一步使用Oracle的V$SQLTEXT視圖來查找當前正在執(zhí)行的進程。這可以使用22-13中的來完成。22- 用于從sid獲得pid并獲得會話正在執(zhí)行的SQL語句在WindowsNT操作系統(tǒng)中,你可以處理器對象并使用%處理器時間計數(shù)器生成一張大量使用磁盤可能引起CPU性能問題。當磁盤正在執(zhí)行大量的輸入/CPU會因為處理輸入/輸出中斷而陷入停頓。你可以在PerfMon(WindowsNT操作系統(tǒng))中通過查看處理器:中斷數(shù)/秒和處理器:%中斷時間來對此進行。假如CPU花費過多的時間處理中斷,可能會嚴重的性能。還有,你可以檢查處理器應(yīng)用時間(%處理器時間,如圖22-290,就說明有一個CPU瓶頸。圖22-2使用Oracle8性能程序處理器使用時當某個用戶程序需要對數(shù)據(jù)進行存取時,操作系統(tǒng)首先查看該數(shù)據(jù)當前在高速緩存中是否可用,以及如果可用的話,它將如何被使用。假如在高速緩存中沒有找到該數(shù)據(jù),那么就不得不從磁盤中數(shù)據(jù)。與從高速緩存中數(shù)據(jù)相比,從磁盤中數(shù)據(jù)的過程代價很大,因為內(nèi)存存取比磁盤存取更快。磁盤操作極大地阻礙了進程的吞吐量。基于磁盤存取的進程性能依賴于諸如輸入/輸出控制卡的數(shù)量、、磁盤速度等因素。輸入/(queuingdelay。一般還存在其他一些在給定的時刻從磁盤中數(shù)據(jù)的未完成的請求。花費在隊列中的時間依賴于操作系統(tǒng)與磁盤上裝載的系統(tǒng)。對磁盤中未完成的請求進行排序以便磁盤頭不必做太多的來回移動。這種對請求的排序可能導(dǎo)致請求在隊列中花費的時間,但搜索時間減少了。當數(shù)據(jù)的存放位置找到后,磁盤臂—或者更精確地說,磁盤頭必須定位在正確磁盤的正確磁道上。發(fā)生在這里的時間延遲叫做搜索時間(seektime。當磁盤在磁盤頭下旋轉(zhuǎn)時,磁盤頭該磁盤的數(shù)據(jù)。在磁盤頭被定位在正確的磁道后,它必須等待磁盤旋轉(zhuǎn)到相關(guān)的數(shù)據(jù)扇區(qū)剛好位于磁盤頭下,這樣便能完成讀/寫操作。這個階段通常稱為旋轉(zhuǎn)等待時間(rotationallatency。通過磁盤頭讀出的數(shù)據(jù)被傳送到控制器。這最后一部分的輸入/輸出被稱為數(shù)據(jù)傳送時間(datatransfertime。最終,該數(shù)據(jù)在輸入/輸出板上傳送并發(fā)送到發(fā)出數(shù)據(jù)請求的進程??梢郧宄乜吹剑疟P存取包含磁盤的機械和旋轉(zhuǎn)運動,假多個用戶并行地在同一張磁盤上頻繁進行輸入/輸出調(diào)用時,磁盤存取或許會成為系統(tǒng)中的瓶頸。最終,磁盤的輸入輸出率支配了該磁盤的總吞吐量,在該磁盤中形成用戶隊列。在你開始查找輸入/輸出密集型用戶以前,必須確定任何一個文件系統(tǒng)當前是否被頻繁地存取。如果是這樣的話,開始定位這些用戶。像以前一樣,得到短時間段的系統(tǒng)快照,然后獲得時間間隔輸出。通過查看輸出值,很容易估價是否正在進行大量的輸入/輸出。運行22-14的可以對系統(tǒng)有一個快速的了解。在該中,有stat$begin_file和stat$end_file兩個表用于開始和結(jié)束文件輸入/輸出的統(tǒng)計信息。利用兩個快照之間的差別與時間,你可以計算出文件存取率。運行22-14,在該快照間隔的起始處文件輸入/輸22- 在想要的間隔結(jié)束后,運行結(jié)束輸入/輸出以便在間隔結(jié)束時捕獲統(tǒng)計數(shù)字以對系統(tǒng)的性能進行分析。結(jié)束輸入/輸出捕獲統(tǒng)計數(shù)字并于stt$nd_fle表中,然后產(chǎn)生輸入/輸出報告。-是用于結(jié)束輸入輸出并獲得輸入輸出報表的。22- 用于填充stat$file_end表并產(chǎn)生輸入/從此輸入//輸出活動并且受此影響最嚴重的表空間是ARMSLIVEDB04_TS。該表空間的輸入/輸出率大約是每秒完成93次讀/寫。根據(jù)磁盤的速度或磁盤能夠支持的輸入/輸出率,可以確定獲得的數(shù)值是否是高的。在發(fā)現(xiàn)系/你還可以在UNIX操作系統(tǒng)上使用sar命令得到操作系統(tǒng)級的一個抽樣的概況。22-中的sar命令每5秒鐘對磁盤活動進行322- 用于磁盤輸入/輸出統(tǒng)計數(shù)字的sar命在輸入/輸出概況快照被執(zhí)行的同時,這個sar命令被激發(fā)。在該命令中,磁盤c0t5d0的讀/寫率為180,這清楚地表明該磁盤上存在大量的輸入/輸出。sar命令的輸出被詳細列出;其中,avwait是花費在隊列中的時間,avserv為搜索時間與旋轉(zhuǎn)等待時間、磁盤傳送時間三者現(xiàn)在尋找使用大量輸入/輸出資源的用戶。在操作系統(tǒng)級,尋找執(zhí)行大量輸入/輸出操作的用戶很;因此,可使用Oracle系統(tǒng)表取得你所要的信息。你可以使用V$SESS_IO視圖來鑒別資源密集型用戶。該視圖有關(guān)會話的輸入/輸出統(tǒng)計數(shù)字的信息。對于每一個會話,在該視圖中有一行與之對應(yīng)。對V$SESS_IO視圖中的列的解釋在表22-4

表22- V$SESS_IO視圖的列描 會話標識符(數(shù)據(jù)庫名 會話獲得的數(shù)據(jù)塊的數(shù) 使用一致性獲取機制的會話的一致性 此會話的物理的數(shù) 此會話改變的數(shù)據(jù)塊 此會話的一致性改變像以前的小節(jié)中所講述的那樣,你可以在該視圖中使用快照技術(shù),將在一個期中捕獲的開始和結(jié)束快照值在一個臨時表中,然后利用差別來查找執(zhí)行大量文件存取的用戶。使用在PHYSICALREADS列中的差別來查找從磁盤中執(zhí)行大量數(shù)據(jù)存取的用戶。BLOCK_GETS列中的差別可以用來鑒別執(zhí)行大量緩沖區(qū)的用戶??梢蚤_發(fā)與22.2節(jié)中類似的腳本。在數(shù)據(jù)庫中引起大量磁盤存取的最常見的事情是磁盤排序(會在臨時表空間中引起瓶頸、全表掃描和頻繁地索引。22- 在V$session_wait中的p1列中包含文件標識符(fileid,事件將在該標識符上執(zhí)行?,F(xiàn)在,可以把屬于臨時表空間的文件的fileid用數(shù)據(jù)庫數(shù)據(jù)文件中的file#值替換。從用于數(shù)據(jù)庫中的臨時表空間的dba_data_files中選取file#列,然后替換22-17中的fileid變量。在發(fā)現(xiàn)sid值以后,可以使用V$SQTEXT視圖和22-17中的發(fā)現(xiàn)由此會話執(zhí)行的當前SQL語句。如果在數(shù)據(jù)庫中執(zhí)行了過多的磁盤排序,考慮增加init.ora的參數(shù)SOT_AREA_SIZE的值。你可以使用22-18中的鑒別一個當前正在執(zhí)行全表掃描且正在等待多塊調(diào)用返回的會話或最后一個等待用于一個多塊的會話。22-18立刻便能識別所有執(zhí)行全表掃描的會話。22- 你可以使用V$SQLAREA視圖鑒別正在執(zhí)行大量物理和大量緩沖區(qū)的SQL語句,如22-19所示。你可以用一個你認為合適的值替換22-19中的buffer_gets和disk_reads。22- 這些SQL語句中的大部分很有可能正在執(zhí)行全表掃描,從而了大量讀操作。通過添SQL語句進行優(yōu)化。在WindowsNT操作系統(tǒng)中,你必須從WindowsNT命令提示符執(zhí)行如下的DISKPERF命令以這會影響到系統(tǒng)開銷;這也就是為什么在缺省情況下不使用該計數(shù)器的原因。你必須重新啟動該系統(tǒng)以便得到邏輯磁盤計數(shù)器的正確讀數(shù)。DB_BLOCK_SIZE參數(shù)對磁盤輸入/輸出有影響。DB_BLOCK_SIZE應(yīng)當?shù)扔诨虺杀队贜T簇容量。DB_BLOCK_SIZE決不能小于NT簇容量。簇容量是WindowsNT一次所能夠讀出或?qū)懭氲淖钚〉妮斎?輸出基本單元。例如,如果DB_BLOCK_SIZE是4K并且NT簇容量是1K的話,那么每當Oracle需從磁盤中數(shù)據(jù)時,WindowsNT就需要執(zhí)行4次輸入/輸出操作。一個磁盤驅(qū)動器一次僅能支持一個請求。當有其他進程等待該磁盤時便會形成磁盤隊列。PerfMon計數(shù)器的物理磁盤:磁盤傳送量/秒項目讓你了解到一定時間中的磁盤傳送率。通過把物理磁盤:平均值制成圖還能夠查看磁盤隊列(包括讀和寫隊列。磁盤隊列的長度顯示于圖22-3中。圖22-3物理磁盤性將分離的、無數(shù)據(jù)條的磁盤上的Oracle聯(lián)機重做日志與數(shù)據(jù)文件分開存放/IDE磁盤到SCSI磁盤或從SCSI磁盤到更快的SCSI。UNIX系統(tǒng)把虛擬內(nèi)存用于內(nèi)存管理。使用虛擬內(nèi)存進程,系統(tǒng)中所有進程的總?cè)萘靠赡艹^系統(tǒng)中可用的物理內(nèi)存??梢允褂梅猪撆c交換技術(shù)—UNIX系統(tǒng)中的兩種內(nèi)存管理策略來實現(xiàn)虛擬內(nèi)存。虛擬內(nèi)存技術(shù)使進程的容量大于可用的物理內(nèi)存數(shù)量成為可能。主存(RAM)執(zhí)行程序所需要的數(shù)據(jù)。當數(shù)據(jù)不再被需要用于執(zhí)行時,它被在磁盤上的輔助內(nèi)存中以便為其他的活動進程騰出空間。整個進程從主存移動到磁盤上的輔助內(nèi)存區(qū),這個區(qū)域被稱為交換區(qū)(swapspace。在內(nèi)存分頁中,單個內(nèi)存頁面被傳送到交換區(qū),也就是說,整個進程的一部分被傳送到交換區(qū)。在交換中,整個進程被傳送到交換區(qū)。內(nèi)存分頁只少量的內(nèi)存,而交換大量的內(nèi)存。這些內(nèi)存管理策略所用到的原理是將進程最需要的內(nèi)存頁面保留在物理內(nèi)存中,助當一個進程需要的內(nèi)存時,物理內(nèi)存中的非活動頁面可以被分頁出,物理內(nèi)存中的空間被。當空間在物理內(nèi)存區(qū)中被時,駐留在輔助內(nèi)存中的頁面便可以被帶入物理內(nèi)存中(RAM。當UNIX系統(tǒng)把單個內(nèi)存頁面移動到交換區(qū)時發(fā)生內(nèi)存分頁。因此,僅有一部分進程移動到交換區(qū)。另一方面,交換把整個進程移動到交換區(qū)中。這樣,交換了許多物理內(nèi)存,但是它比內(nèi)存分頁代價更高。一個理想內(nèi)存狀況的關(guān)鍵指標是在完全負載的情況下,系統(tǒng)輕微分頁并且根本不發(fā)生交換。在大多數(shù)的系統(tǒng)中可以看到如下的情況:當系統(tǒng)有輕微的負載時,沒有分頁或交換;當系統(tǒng)適度負載時,開始進行分頁;當系統(tǒng)負載較重時,由于繁重的內(nèi)存請求與物理內(nèi)存的低可用性,分頁停止,系統(tǒng)中的交換開始。交換是最昂貴的內(nèi)存操作。在一個虛擬內(nèi)存系統(tǒng)中,系統(tǒng)中的進程所使用的內(nèi)存地址不是物理內(nèi)存地址,而是虛擬地址(virtualaddress。此虛擬地址由內(nèi)存管理單元(MMU)轉(zhuǎn)化為物理內(nèi)存地址。當進程需要一張內(nèi)存頁面時,它使用虛擬地址那一頁。此虛擬地址由內(nèi)存管理單元轉(zhuǎn)化,用來定位實際物理地址。此轉(zhuǎn)化的地址可以到物理內(nèi)存中的一個區(qū)域中或者到輔助內(nèi)存(交換區(qū))地址中。假如物理頁面被定位在主存中,該進程可以立即使用它。如果它被定位在磁盤上,內(nèi)存管理單元會產(chǎn)生頁面出錯(pagefault,然后操作系統(tǒng)把此頁面讀到物理內(nèi)存中的一個空閑頁面中;這就叫做調(diào)入頁面(pagein)操如內(nèi)存嚴重短缺,此頁面的會物理內(nèi)存中的其他頁面被寫入到磁盤中。這通常被稱為調(diào)出頁面(pageout。在頁面作系統(tǒng)讀入后,新的頁面地址被傳送到內(nèi)存管理單元,然后操作系統(tǒng)重新啟動指令。分頁僅把物理內(nèi)存頁面移動到磁盤換會把整個進程移動到磁盤中。假如系統(tǒng)中內(nèi)存嚴重短缺,那么會非常頻繁地發(fā)生交換。無論是調(diào)出頁面還是調(diào)入頁面對于系統(tǒng)性能來說都是很昂貴的,因為與可直接在高速緩/寫非常昂貴。因此,假如進程由于在物理內(nèi)存缺乏的系統(tǒng)中頻繁申請新的數(shù)據(jù)頁而產(chǎn)生大量的頁面錯誤的話,進程的運行速度會明顯慢下來。在使用虛擬內(nèi)存的系統(tǒng)中,只有由進程使用的那部分內(nèi)存駐留在物理內(nèi)存中。這部分內(nèi)存被叫做該進程的工作組(workingset。因為在任何給定的時刻上,進程不會使用它的全部頁面,因此把當前使用的頁面保存在物理內(nèi)存中是更為經(jīng)濟的做法。在進程運行期間,該進可能需要當前不在物理內(nèi)存中的頁面。這會頁面出錯,但是在進程運行期間出現(xiàn)一些頁面出錯問題是極為普通的,因為把進程需要的所有內(nèi)存頁面都放入主存中明顯是不切合實際的。操作系統(tǒng)總是試圖把工作組的全部頁面保存在主存中。使用內(nèi)存的這項技術(shù)可以使一個系統(tǒng)的內(nèi)存吞吐量達到最大值,記住,系統(tǒng)中有許多并行進程正在運行,這些并行進程主動生成對內(nèi)存的并行請求。進程的實際物理內(nèi)存使用決不是恒定不變的,由于它的易變性,要確定物理內(nèi)存的使用非常。另一方面,進程對虛擬內(nèi)存的需求可以很容易地被確定。一個進程所消耗的物理內(nèi)存的數(shù)量基于許多因素,例如系統(tǒng)負載、進程正在做的工作等等。例如,假如一個進程正在一個較重負載的系統(tǒng)中運行,因為有許多需要物理內(nèi)存頁面的其他進程,所以物理內(nèi)存中實際分配給該進程的頁面的數(shù)量將非常接近于該進程的工作組的容量。換句話說,如果同一個進程在一個較輕負載的系統(tǒng)中運行,該系統(tǒng)中正在運行的并行活動進程并不多,那么實際分配給該進程的物理頁面的數(shù)量會大大超過該進程需要的工作組容量。類似地,在一個進程的運行過程中,如果該進程的工作組改變了,那么分配的物理內(nèi)存的數(shù)量也會隨之改變。所有這些使得很難消耗大量物理內(nèi)存的程序,因為內(nèi)存分配完全是隨形勢的發(fā)展而變化的。要模擬進程對物理內(nèi)存的需求,你必須還要模擬系統(tǒng)中的負載,因為一個孤立運行在系統(tǒng)中的進程對物理內(nèi)存的使用要大于運行在峰值負載上的進程對內(nèi)存的使用。記住如下這些要點:要系統(tǒng)中的進程對內(nèi)存的使用,你必須把系統(tǒng)負載考慮在內(nèi)。一個進程在較輕負載的系統(tǒng)中獨占大量的物理內(nèi)存而在一個較重負載的系統(tǒng)中占用少量內(nèi)存是極為普通的事情。檢查整個內(nèi)存工作情況(在下一節(jié)中)以查看是否存在任何分頁或交換的跡象。忽略少量的分頁,因為當進程的工作組改變時,進程分頁是很自然的事情。假過多的分頁或交換發(fā)生,或許表明系統(tǒng)中可用的物理內(nèi)存數(shù)量較少,你必須重新安排你的某些內(nèi)存密集型進程的執(zhí)行時間。UNIX系統(tǒng)中的每一個進程被分為兩個大的領(lǐng)域:文本頁與數(shù)據(jù)頁。文本(text)段包含進程執(zhí)行的機器指令。數(shù)據(jù)(data)段包含進程在執(zhí)行期間所需要的所有其他信息。文本頁被標記為只讀,因為它們包含機器指令并且從文件系統(tǒng)中調(diào)出。執(zhí)行同一個程序的進程將共享相同的文本頁,這樣便優(yōu)化了內(nèi)存使用。例如,假10個用戶工作在OracleForm上,所有這些人共享OracleForm的可執(zhí)行文件或文本頁。讀/寫。它們于某進程并且從分頁區(qū)(交換區(qū))中調(diào)出;也就是說,每一個進它自己的數(shù)據(jù)頁,當進程數(shù)量增加時,對頁的需求也隨之增加—這與共享文本頁的情況不一樣。主要的區(qū)別是假如一個文本頁由于內(nèi)存短缺而被調(diào)出,該文本頁當前占用的物理內(nèi)存頁能夠直接被新的信息改寫;但是如果一個數(shù)據(jù)頁被改寫或調(diào)出,那么該頁必須在物理頁開始改寫以前寫入或拷貝到磁盤中。這其中的理由很簡單,因為文本頁決不會被修改,文本頁的映象總能夠從文件系統(tǒng)中獲得。一個UNIX進程實際上被劃分為6個區(qū)域:文本、堆棧、堆、BSS堆棧(stack)對進程是的,它從交換區(qū)中調(diào)出,包含運行期執(zhí)行堆棧。除了函數(shù)和過程參數(shù)以外,運行期堆棧還包括函數(shù)和過程活動記錄。堆棧頁被標記為讀/寫。堆棧的容量可以增長。當堆(heap)運行時,它包含了分配給進程的數(shù)據(jù)頁。堆是一個的進程區(qū)并且它的/寫,這些頁從交換區(qū)中調(diào)出。BSS段對進程也是的。它被標記為讀/寫,它的容量在進程執(zhí)行期間保持不變,段的頁面被標記為讀/寫。該段的容量在進程執(zhí)行期間保持固定。該段用于靜態(tài)地分配的未初始化數(shù)據(jù),這些頁從交換區(qū)中調(diào)出。初始化數(shù)據(jù)(initializeddata)段對進程是的。它被標記為讀/寫,從交換區(qū)中調(diào)出,共享內(nèi)存(sharedmemory)段是在進程之間共享的頁面。它們被標記為讀/寫。使用系統(tǒng)調(diào)用shmget()分配共享頁面。進程通過使用系統(tǒng)調(diào)用shmat()共享頁面。共享頁面從交換在你深入研究使用內(nèi)存的個別進程以前,必須首先對系統(tǒng)有一個大概的了解。當對系統(tǒng)中的內(nèi)存進行預(yù)覽時,要尋找的關(guān)鍵東西是系統(tǒng)中過多的分頁與交換。假如系統(tǒng)中的內(nèi)存比較缺乏,那么當進程被分配了CPUCPU時間用于交換與分頁,不做急劇影響系統(tǒng)性能的其他事情。系統(tǒng)中頻繁地分頁與交換活動嚴重地防礙了系統(tǒng)性能,必須通過增加額外的物理內(nèi)存或重新安排進程的方式來盡可能地減小。在UNIX系統(tǒng)中,vmstat與sar是用來對系統(tǒng)內(nèi)存的使用進行的工具。這兩個工具的缺陷是它們僅能在總體水平上實現(xiàn)對內(nèi)存的,不能給出每一個進程的內(nèi)存使用細節(jié)。22- 用于內(nèi)存使用的vmstat命令的輸表22-5中列舉了Vmstat命令輸出中的主要的列方面幾乎給了系個完整的概述。在此輸出中,就內(nèi)存使用而言,要查找的關(guān)鍵項目是po、so、b與w假如po(調(diào)出頁面)與so(換出)值很高,表明系統(tǒng)中內(nèi)存嚴重短缺。在22-20中,系統(tǒng)中沒有頁面調(diào)出。系統(tǒng)中大約有2885×4KB(4KB是內(nèi)存頁面的容量),即11.26MB的可 假如你查看前面的輸出,會發(fā)現(xiàn)b列顯示了大量的阻塞進程。我通過使用sar-d命令做了進一步的研究,發(fā)現(xiàn)大量的阻塞進程是因為少量磁盤上正在進行繁忙的輸入/輸出。由于輸入/輸出正在等待被執(zhí)行,所以造成進程被阻塞。假如vmstat輸出顯示了大量的分頁或交換,你必表22- 在如下顯示的各種狀態(tài)中的進程 實內(nèi)存與虛擬內(nèi)存的報 平均活 頁面中表的容 在時間間隔中的頁面出錯報 被換入的頁面 被換出的頁面 調(diào)進頁面的千字節(jié)數(shù)(檢驗 調(diào)出頁面的千字 CPU使用情況的報 服務(wù)于用戶請求所用的時間百分 服務(wù)于系統(tǒng)調(diào)用所用的時間百分 需要技巧才能在UNIX系統(tǒng)中內(nèi)存的個別使用。大部分工具(如vmstat和sar)告系統(tǒng)內(nèi)存使用情況,但不報告單個進程的內(nèi)存使用情況。實際物理內(nèi)存的使用不容易獲取的另一個原因是每一個進程被劃分為文本與數(shù)據(jù),文本頁在進程之間共享,而數(shù)據(jù)頁于進程。假如進程被依附于一個共享內(nèi)存段,那么此偏差量必須被減去以便獲得實際的內(nèi)存(由進。當文本頁被共享時,會在所有進程的虛擬內(nèi)存使用中報告。因此,假如你增加盡管如此,你可以假設(shè)當對Oracle系統(tǒng)中的內(nèi)存進行時,所有的進程共享相同的文本頁(也就是Oracle可執(zhí)行文件。假如所有的進程正在使用相同的可執(zhí)行文件,那么所有進程的文本內(nèi)存用量是相同的。剩余的內(nèi)存是由進程使用的內(nèi)存。在UNIX系統(tǒng)中,帶有-l選項的ps命令可以用來確定每一個單獨進程的內(nèi)存使用情況。-l選項在ps輸出的sz列中報告了內(nèi)22-21中的ps來中Oracle進程(前臺和)的內(nèi)存使用情況。sz列報告了進程映像的物理頁面的容量。它包括文本、數(shù)據(jù)和堆??臻g。22-21中的輸出按照szps命令,其中sz列是輸出中的第7此輸出對所有Oracle進程給出了使用的文本+數(shù)據(jù)+堆棧的容量。注意以前提到的srae在Oracl可執(zhí)行文件中使用測量容量令來確定。在獲得文本頁的容量之后,理論ps-ael際虛擬內(nèi)存使用情況。然而,有時ps-el命令中的s列不能報告實際的文本頁容量;它僅報告進程需要的頁面。這是由于有頁面請求算法,在該算法中僅僅最需要的文本頁時,該命令報告的是總的文本頁容量,而不是實際使用的頁容量。在22-21中,由22- 注意如果試圖使用ps以發(fā)現(xiàn)進程的sid,并且在會話層可以完成進一步的。這將在下面的輸出中進行說明。22- 用來查找進程內(nèi)存使用情況的ps單個進程對內(nèi)存的使用情況也可以通過使用V$SESSTAT系統(tǒng)視圖得到。要了解你正在查看的那部分內(nèi)存,需要研究內(nèi)存如何OracleSGA中組織起來。SGA是一個包括共享池、塊緩沖區(qū)和重做日志緩沖區(qū)的共享段。共享池是SGA中的一個區(qū)域,它包含了諸如共享SQL對于正在服務(wù)器上執(zhí)行的每條SQL語句來說,有一個共享部分(共享SQL區(qū))和一個專用部分(SQL區(qū)。執(zhí)行同一段SQL代碼的兩個用戶使用相同的共享SQL區(qū),但是每個用戶有他們各自的SQL區(qū)。共享SQLSQL語句的執(zhí)行計劃。該區(qū)域的大小取決于語句的復(fù)雜性。每一個這樣的SQLV$SQLAREA視圖的sharable_memory列來確定,V$SQLAREA視圖包含了共享池中的所有SQL區(qū)。每一個執(zhí)行相同SQL語句的會話都共用相同的共享SQLSQL區(qū)是一個內(nèi)存區(qū)域,它包含了諸如綁定信息與運行期緩沖區(qū)的數(shù)據(jù)。每一個執(zhí)行SQL語句的會話都有它自己的SQSQLSQL語句的多個會話來說,有一個共享的SQL區(qū)并且每個會話各自擁有的多個SQL區(qū)。SQL區(qū)進一步劃分為一個持久區(qū)和一個運行時間區(qū)。你需要內(nèi)存使用的那部分內(nèi)存區(qū)稱為程序全局區(qū)(PGA。程序全局區(qū)包含單個進程的數(shù)據(jù)和控制信息。程序全局區(qū)還被稱為進程全局區(qū)(ProcessGlobalArea。程序全局區(qū)的在兩種體系結(jié)構(gòu)中,程序全局區(qū)總是包含堆??臻g(stackspace),它是用來會話變在服務(wù)器選項(dedicatedserveroption)中,程序全局區(qū)與用戶的會話有關(guān)的輔助信息;也就是說,在這里SQL區(qū)和其他的會話信息。在多線程選項(multithreaded你能夠程序全局區(qū)的使用情況并估計系統(tǒng)中每個用戶對內(nèi)存的需求??梢允褂肰$SESSA視圖了解對PGA內(nèi)存的使用。statistic#value

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論