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

下載本文檔

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

文檔簡(jiǎn)介

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論