java性能測試與調(diào)優(yōu)案例_第1頁
java性能測試與調(diào)優(yōu)案例_第2頁
java性能測試與調(diào)優(yōu)案例_第3頁
java性能測試與調(diào)優(yōu)案例_第4頁
java性能測試與調(diào)優(yōu)案例_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

目JDK優(yōu) 如何修改默認(rèn)Java調(diào)用的JVM.dll版本 測試實 收集Java堆的優(yōu) Tomcat性能與優(yōu) Tomcat頁 內(nèi)存使用調(diào)整(OutofMemery問題 連接線程數(shù)調(diào)整(cannotconnecttoserver問題 是否是整個連接處理的時間 net收工測 直接寫Socket做測 acceptCount–最大排隊 TomcatNative oracle性能、診斷分析與調(diào) 方 方法1:在LR的Controller中配置監(jiān)視 方法3:使用Oracle企業(yè)管理器查看數(shù)據(jù)庫性 計數(shù) dbblockgets parsecount CPUusedbythis 診斷和優(yōu)化SQL語 Oracle索引問題診斷與優(yōu) p6spy和SQL語 JSP、Servlet性能優(yōu) Servlet常見性能問題分析與優(yōu) Servlet中利用init()方法進(jìn)行高速緩 Servlet壓縮輸 JSP常見性能問題分析與優(yōu) 選擇正確的頁面包含機(jī) PageSession 正確地確定javabean的生命周 控制Session的時 Java代碼性能與性能問題定 內(nèi)存泄漏檢 JVM內(nèi)存泄漏分 認(rèn)識 JVM啟動參數(shù)介 JVM性能瓶 JVM內(nèi)存泄漏實例一-PermGen溢 JVM內(nèi)存泄漏實例二-Heap溢 JVM內(nèi)存泄漏實例三-回收時promotion 實例-JProfile內(nèi)存泄 log4j性能診斷與優(yōu) 代碼效率性能測試與優(yōu) 線程死 線程競 算法效 JDK版本加載速度較快,server版本加載速度較慢但運(yùn)行起來較快。%JAVA_HOME%/jre/bin/如何修改默Java調(diào)用JVM.dll版本javaversionjvm更改默認(rèn) 調(diào)用的jvm.dll,這個由 決定。編里面第一行寫的是-默認(rèn)就是版本,把第二行的-serverKNOWN放到第一行,-server--hotspotALIASED_TO-native-green測試實測試應(yīng)用程序測試目的測試場景主頁面:在《J2EE性能測試》這本書中也得到類似的結(jié)果:JDK1.3HotSpotServer JDK1.3HotSpot926msJDK1.3Classic JDK1.22 IBM JRockit 選擇合適JDK度不同。一般來說,盡可能選擇發(fā)布的穩(wěn)定的JDK版本。的穩(wěn)定的JDK版本相對以前的JDK版本都會做一些bug的修改和性能的優(yōu)化工作。JDK的版本(Sun發(fā)布公司和其它一些公司一直在為提高性能而對javaJava堆的優(yōu)應(yīng)用程序是否發(fā)生了內(nèi)存泄漏,有一個非常優(yōu)秀的工具推薦給大家——Quest公司的JProbe工具,使用它來觀察程序運(yùn)行期的內(nèi)存變化,并可產(chǎn)生內(nèi)存快照,從而分析并定位JDK的版本和廠家決定使用-mx和-ms或-Xmx-Xms。Java堆大小決定了回收的頻度和速度,Java堆越大,回收的頻度越低,速度越慢。同理,Java堆越小,回收的頻度越高,速度越快。要想設(shè)置比較理想的參數(shù),還是需要了解一些基礎(chǔ)知識的。Java堆的最大值不能太大,這樣會造成系統(tǒng)內(nèi)存被頻繁的設(shè)置-Xms等于-XmX估計內(nèi)存中存活對象所占的空間的大小,設(shè)置-Xms等于此值,-Xmx四倍于此值設(shè)置-Xms等于-Xmx1/2設(shè)置-Xms介于-Xmx1/101/4使用默認(rèn)的設(shè)置和-Xmx兩個最重要的參數(shù)外,還有很多可能會用到的參數(shù),這些參數(shù)通常依賴于垃圾收集的算法,所以可能JDK的版本和廠家而有所不同。但這些參數(shù)一般在Web開發(fā)中用的比較少,就不做詳細(xì)介紹了。在實際的應(yīng)用中注意設(shè)置-Xms和-Xmx使其盡可能的優(yōu)Java虛擬機(jī)和垃圾收集算法的機(jī)制了。翻譯的《深入Java虛擬機(jī)》一書。Tomcat性能與優(yōu)D:\PrefTest\案例\Tomcat調(diào)優(yōu)\Tomcat性能利用JDK的JConsole來TomcatJMX接口實施,具體步驟如下:首先,打開tomcat5的bin中的catalina.bat Linuxcatalina.sh -集Tomcat性能數(shù)據(jù),具體代碼如下所示:importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.HashMap;importjava.util.I importjava.util.Map;importjava.util.Set;importimportimportjavax.management.ObjectInstance;importimportjavax.manage importjavax.management.remote.JMXConnector;importjavax.management.remote.JMXServiceURL;publicclassMonitorTomcat*@parampublicstaticvoidmain(String[]{tryStringjmxURL="service:jmx:rmi:///jndi/rmi://06:8999/jmxrmi";//tomcatjmxurlJMXServiceURLserviceURL=newJMXServiceURL(jmxURL);Mapmap=newString[]credentials=newString[]{"monitorRole","QED"};map.put("jmx.remote.credentials",credentials);JMXConnectorconnector=JMXConnectorFactory.connect(serviceURL,map);MBeanServerConnectionmbsc=connector.getMBeanServerConnection(); MBeanInfombInfo=StringattrName="currentThreadCount";//tomcat的線程數(shù)對應(yīng)的屬性值MBeanAttributeInfo[]mbAttributes=mbInfo.getAttributes();for(intj=0;j}SetMBeanset=mbsc.queryMBeans(null,null);System.out.println("MBeanset.size():"+MBeanset.size()); torMBeansetI tor=MBeanset.i while tor.hasNext())ObjectInstanceobjectInstance=(ObjectInstance)MBeansetI ObjectNameobjectName=objectInstance.getObjectName();System.out.println("canonicalName:"+if(canonicalName.equals("Catalina:host=localhost,type=Cluster"))//GetdetailsofclusterMBeansStringcanonicalKeyPropList=}}//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐systemObjectNameruntimeObjName=newObjectName("java.lang:type=Runtime");System.out.println("程序:"+(String)mbsc.getAttribute(runtimeObjName,"VmName"));Datestarttime=newDate((Long)mbsc.getAttribute(runtimeObjName,"StartTime"));SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");Longtimespan=(Long)mbsc.getAttribute(runtimeObjName,"Uptime");

ObjectNameheapObjName=new longmaxMemoryheapMemoryUsage.getMax();longcommitMemory=heap longusedMemory=heapMemoryUsage.getUsed(); mitMemory+"%");//堆使用 mitMemory=nonheap longnonusedMemory=heapMemoryUsage.getUsed(); ObjectNamepermObjName=newObjectName("java.lang:type=MemoryPool,name=Perm MemoryUsage.from((CompositeDataSupport)mbsc.getAttribute(permObjName,"Usage"));longcommitted=p longused=heapMemoryUsage.getUsed();//System.out.println("perm mitted+"%");//持久堆使用//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐Sessionfor(ObjectNameobj:s){ 最大會話數(shù):"+ System.out.println("會話數(shù):"+mbsc.getAttribute(objname,"activeSessions"));}//‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ThreadPool‐ObjectNamethreadpoolObjName=newObjectName("Catalina:type=ThreadPool,*");Set<ObjectName>s2=mbsc.queryNames(threadpoolObjName,null);for(ObjectNameSystem.out.println("最大線程數(shù):"+mbsc.getAttribute(objname,"maxThreads")); 當(dāng)前線程數(shù):"+ 繁忙線程數(shù):"+ }}catch(Exception{}}publicstaticStringformatTimeSpan(longspan){longminseconds=span%1000;span=span/1000;longseconds=span%60;span=span/60;longmins=span%60;span=span/60;longhours=span%24;span=span/24;longdays= }}內(nèi)存使用調(diào)整(OutofMemery問題Tomcat128MB,在較大型的應(yīng)用項目中,這點內(nèi)存是不夠的,需 下,在文 下,在文{tomcat_home}/bin/catalina.shremExecuteTheRequestedCommandsetJAVA_OPTS='-Xms256m-Xmx512m'256MB連接線程數(shù)調(diào)整(cannotconnecttoserver問題""Thisistheumnumberofthreadsallowed.Thisdefinestheupperboundtotheconcurrency,asTomcatwillnotcreateanymorethreadsthanthis.IftherearemorethanmaxThreadsrequests,theywillbequeueduntilthenumberofthreadsdecreases.IncreasingmaxThreadsincreasesthecapabilityofTomcattohandlemoreconnectionsconcurrently.However,threadsuseupsystemresources.Thus,settingaveryhighvaluemightdegradeperformance,andcouldevencauseTomcattocrash.Itisbettertodenysome ingconnections,ratherthataffecttheonesthatarebeingcurrentlyserviced.Thisistheumnumberofidlethreadsallowed.AnyexcessidlethreadsareshutdownbyTomcat.Settingthistoalargevalueisnotgoodforperformance;thedefault(50)usuallyworksformostWebsiteswithanaverageload.ThevalueofmaxSpareThreadsshouldbegreaterthanminSpareThreads,butlessthanmaxThreads.Thisistheminimumnumberofidlethreadsallowed.OnTomcatstartup,thisisalsothenumberofthreadscreatedwhentheConnectorisinitialized.IfthenumberofidlethreadsfallsbelowminSpareThreads,Tomcatcreatesnewthreads.Settingthistoalargevalueisnotgoodforperformance,aseachthreadusesupresources.Thedefault(4)usuallyworksformostWebsiteswithanaverageload.Typically,siteswith“bursty”trafficwouldneedhighervaluesfor正常,當(dāng)超過60個時,居然全部報錯,打開server.xml可以看到如下配置:<Connectorport="8080"redirectPort="8443"/> umnumberofrequestprocessingthreadstobecreatedbythisConnector,whichthereforedeterminesthe umnumberofsimultaneousrequeststhatcanbehandled.Ifnotspecified,thisattributeissetto200.Ifanexecutorisassociatedwiththisconnector,thisattributeisignoredastheconnectorwillexecutetasksusingtheexecutorratherthananinternalthreadpool.這個就產(chǎn)生問題了,打開Tomcat的源碼發(fā)現(xiàn)默認(rèn)值是40,而不200,所以壓力測試時遇到<Connectorport="8080"Tomcat7實驗一、測JSP頁面VU:50RT:VU:50RT:VU:50RT:二、測JPetStore主頁VU:50RT:VU:50RT:ThenumberofmillisecondsthisConnectorwillwait,afteracceptingaconnection,fortherequestURIlinetobepresented.Thedefaultvalueis60000(i.e.60seconds).<!--Defineanon-SSLHTTP/1.1Connectoronport8080--<Connectorport="8080"maxHttpHeaderSize="8192"maxThreads="150"minSpareThreads="25"enableLookups="false"redirectPort="8443"connectionTimeout="2000"disableUploadTimeout="true" net收工測直接用net連上tomcat,如果什么都不輸入,socket很快回斷開,輸入完整GET。。。,能夠獲得輸出。如果不保持輸入,$netlocalhostGET/index.jspHTTP/1.1Connection:Keep-AliveHost:3Content-Length:Socket做測以下是Groovy代碼content='''GET/index.jspHTTP/1.1Connection:Keep-AliveHost:3Content-Length:defSocketsocket=newSocket('localhost',8080)println'iskeepalive?'+socket.getKeepAlive()println'sleep'+sleepTime+'ms.'println'isclosed?'+println'sleep'+sleepTime+'println'writesocketbegin======'writeStream(content,socket.getOutputStream())println'readsocketprintlnreadStream(socket.getInputStream())[0..300]voidwriteStream(content,stream){OutputStreambuf=newBufferedOutputStream(stream);OutputStreamWriterout=newOutputStreamWriter(buf,"UTF-8");printcontent}StringStringbyte[]buffer=newintreadCount=stream.read(buffer);while(readCount!=-1){sResult+=newString(buffer,readCount,"utf-8");readCount=}return}acceptCount–最大排隊Theumqueuelengthfor ingconnectionrequestswhenallpossiblerequestprocessingthreadsareinuse.Anyrequestsreceivedwhenthequeueisfullwillberefused.Thedefaultvalueis100.<Connectorport="8080"maxThreads="800"maxThreads:tomcat起動的最大線程數(shù),即同時處理的任務(wù)個數(shù),默認(rèn)值為200maxThreads如何配cpu,2第一種情況,如果我們的操作是純粹的計算,那么系統(tǒng)響應(yīng)時間的主要限制就是cpu的運(yùn)算能力,此時maxThreads應(yīng)該盡量設(shè)的小,降低同一時間搶cpu的線程個數(shù),可maxThreads應(yīng)該盡量設(shè)的大,這樣才能提高同時處理請求的個數(shù),從tomcat同時處理的請求量會比較大,所以需要關(guān)注一下tomcat的虛擬機(jī)內(nèi)存設(shè)置和linux的openfile限制。*webserver允許的最大連接數(shù)還受制于操作系統(tǒng)的內(nèi)核參數(shù)設(shè)置,通常Windows2000個左右,Linux1000個左右。CentOSSocke最大連接數(shù)ulimit-中的openfilesvisoftnofilehardnofilesoft可以超過的配置數(shù)hard最大過的配置數(shù)nofile對描述符的配置試驗修改softnofilehardnofileAction.c(6):Error-27796:Failedtoconnecttoserver"01:8080":[10060]ConnectiontimedoutControllerConnectionConnectionperSecond圖中看到連接數(shù)偏少(相比起默認(rèn)設(shè)置1024):1、ConnectionsperSecond-NewConnection:28.082ConnectionsperSecond-ConnectionShutdown:28.082ConnectionsperSecond-NewConnection:114.000TomcatNative信息TheAPRbasedApacheTomcatNativelibrarywhichallowsoptimalperformanceinproductionenvironmentswasnotfoundonthejava.library.path:E:\Program 所謂的ApacheTomcatNativelibrary其實叫APR,全稱為:ApachePortableRuntimeandTomcatcanusetheApachePortableRuntimetoprovidesuperiorscalability,performance,andbetterintegrationwithnativeserver.TheApachePortableRuntimeisahighlyportablelibrarythatisattheheartofApacheHTTPServer2.x.APRhasmanyuses,includingaccesstoadvancedIOfunctionality(suchassendfile,epollandOpenSSL),OSlevelfunctionality(randomnumbergeneration,systemstatus,etc),andnativeprocesshandling(sharedmemory,NTpipesandUnixsockets).ThesefeaturesallowsmakingTomcatageneralpurposewebserver,willenablemuchbetterintegrationwithothernativeweb,andoverallmakeJavamuchmoreviableasafullfledgedwebservertformratherthansimplyabackendfocusedtechnology.ApacheTomcatNativelibraryApache為了提升Tomcat的性能搞的一套本地化Socket,Thread,IO組件也就是說它有高級IO功能,操作系統(tǒng)級別的功能調(diào)用,以及本地進(jìn)程處理等等這些Tomcat更像WebServer(Apache那樣),而不是只能用來JSP,也就是說提升單獨的Tomcat作為服務(wù)器的吞吐性能.Windows下安 LoadedAPRbasedApacheTomcatNativelibrarytar–xvfapr-1.2.12.tar.gz

make安裝APR-tar–xvfapr-util-1.2.12.tar.gzmaketomcatnativecdtarzxvftomcat- ./configure--prefix=/tomcat/apr--with-apr=/tomcat/apr–with-java-home=/usr/jdkmakeJAVA_OPTS="$CATALINA_OPTS-Djava.library.path=加在#ExecuteTheRequested 前#vi/etc/profile添加:export6.tomcat#vim信息LoadedApacheTomcatNativelibrary信息APRcapabilities:IPv6[true],sendfiletrue],acceptfiltersfalse],randomtrue].2008-7-810:20:27org.apache.coyote.http11.Http11AprProtocolinit<Connectorport="8081"connectionTimeout="20000"<Connectorport="8081"protocol="HTTP/1.1"redirectPort="8443"/>redirectPort="8443"/>ConnectorNIOHTTPPOOL是輸出一個oWorld。假設(shè)地址是我們依次對四種Connector進(jìn)試,測試的客戶端在另外一臺機(jī)器上用ab命令來完成,測試命令為:ab-c900-n2000,最終的如下表所示(單位:平NIOHTTPPOOL281666692256440默認(rèn)配置。NIO280的,NIOPNIO的基礎(chǔ)上加入線程池,可能是程序處理更復(fù)雜了,因此性能不見得比NIOPOOL方式則波動很大,測試期間和HTTP方式一樣,不時有停滯。Tomcat6.XJCPServlet2.5JSP2.1的規(guī)范,并且包括其它很多有用的功能,使它成為開發(fā)和部署web應(yīng)用和web服務(wù)的堅實平臺。webjava實現(xiàn),tomcatweb開發(fā)者開發(fā)、測試的首選,有很多tomcat作為開發(fā)時候使用,而在部署的時候,把應(yīng)tomcat作為平臺的時候,而并發(fā)用戶connectionrefuse的錯誤。但是很多商業(yè)應(yīng)用部署在tomcat上運(yùn)行卻安然無恙。是ApacheHTTPServer2.x的,它是高度可移植的本地庫,它使用高性能的UXINI/OjavaioAPRJava開發(fā)者而言可能稍稍有點難度,在很多用NIO的技術(shù)來提升tomcat的并發(fā)處理能力。NIOtomcatjavaiojavaNIO的差別。JavaIO操作都是阻塞式的(blockingI/O),socket的編程基礎(chǔ),你會接觸過堵socket則后程序就可以執(zhí)行accept、read、write等操作,一般來說,如果使用堵塞socket,通常我們通常開一個線程acceptsocket,當(dāng)讀完這次socket請求的時候,開一個單獨的線程處理這個socketsocketselect狀,當(dāng)有信號的時候可以通過可以通過多路復(fù)用(Multiplexing)技術(shù)傳遞給一個指定的線程池來處理請求,然后原來的線程繼續(xù)select狀態(tài)。最簡單的多路復(fù)用技術(shù)可以通過java管道(Pipe)來實java管道或者隊列里面,java世界里,現(xiàn)在已經(jīng)有很多NIOGrizzly,ApacheMina等等,如果你對如何編寫高性能的網(wǎng)絡(luò)服務(wù)器有,你可以研讀這些源代碼。webIO(BIO)NIOBIOwebweb請求一個單獨的線程,所以并發(fā)量一旦上去了,線程數(shù)就上去了,CPUBIO不合適高吞吐量、高可伸webNIO則是使用單線程(CPU)或者只使用少量的多線程(CPU)來Socketpipe或者隊列里的請求.OS可以接受TCP的連接,web服務(wù)器就可以處理該請求。大大提高了web服務(wù)器的可伸縮性。redirectPort="8443"/>息,表示NIO已經(jīng)啟動。*由于tomcat的html和解析功能相對其他服務(wù)器如apche等較弱,所以,一般都是集成起來 性能、診斷分析與調(diào)D:\PrefTest\Oracle調(diào)優(yōu)\Oracle性能診斷與調(diào)優(yōu)學(xué)習(xí)筆記方1LRController中配置監(jiān)1ControllerOracle客戶端3、在Controller中配置Oracle連接:Tochangethelengthofeachmonitoringsample(inseconds),thedat\monitors\vmon.cfgfileintheLoadRunnerrootfolder.Thedefaultrateis10seconds.TheminimumsamplingratefortheOracleMonitoris10seconds.Ifyousetthe10secondintervals.添加自定義[V$Monitor];Howmanysecondsforeachdata;NamemustbeuniqueName=存Description=該計數(shù)器返回當(dāng)前存Query=SELECT100*((sum(pins-reloads))/sum(pins))from;Namemustbeunique SUM(CONSISTENT_GETS)),4)*100FROM(SELECTCASEWHENNAME='physicalreads'THENVALUEENDPHYSICAL_READS,CASEWHENNAME='dbblockgets'THENVALUEENDDB_BLOCK_GETS,CASEWHENNAME='consistentgets'THENVALUEENDCONSISTENT_GETSFROMV$SYSSTATWHERENameIN('physicalreads','dbblockgets','consistentgets'));NamemustbeDescription=應(yīng)大于Query=Selectround(sum(pins-reloads)/sum(pins)*100,2)fromv$librarycache;NamemustbeDescription=應(yīng)大于0.85Query=Selectround(sum(gets-getmisses-usage-fixed)/sum(gets)*100,2)fromv$rowcache;NamemustbeuniqueDescription=應(yīng)該小于1%Query=selectround(sum(waits)/sum(gets)*100,2)fromv$rollstat;NamemustbeuniqueDescription=1%Query=selectsum(shrinks)fromv$rollstat,v$rollnamewherev$rollstat.usn=v$rollname.usn;NamemustbeName=表空間的I/O讀總Description=表空間的Query=selectsum(f.phyrds)pyrfromv$filestatf,dba_data_filesdfwheref.file#=df.file_id;NamemustbeName=表空間的I/O塊讀總Description=表空間的Query=selectsum(f.phyblkrd)pbrfromv$filestatf,dba_data_filesdfwheref.file#=df.file_id;NamemustbeuniqueDescription=表空間的I/OQuery=selectsum(f.phywrts)pywfromv$filestatf,dba_data_filesdfwheref.file#=df.file_id方法2:使根據(jù)sitescope幫助文檔,需要把oracle的jdbc驅(qū)動classes12.zip放到<SiteScoperootdirectory>\WEB-INF\lib<SiteScoperootdirectory>\java\lib\ext需注意的是:數(shù)據(jù)庫用戶名必須是DBA。3:使Oracle企業(yè)管理器查看數(shù)據(jù)庫性方法4:使D:\PrefTest\Oracle調(diào)優(yōu)\SpotlightForOracle使用說明計數(shù)Ifthenumberofdiskwritesisnon-zeroforagivensortoperation,thenthisstatisticisincremented.SortsthatrequireI/Otodiskarequiteresourceintensive.TryincreasingthesizeoftheinitializationparameterSORT_AREA_SIZE.Formoreinformation,see"SORT_AREA_SIZE".sorts(memory)andsorts(disk):sorts(memory)是在SORT_AREA_SIZE(因此不需要在磁盤進(jìn)滿足而不得不在磁盤進(jìn)行排序操作的數(shù)量。這兩項統(tǒng)計通常用于計算in-memorysortratioIfthenumberofdiskwritesiszero,thenthesortwasperformedcomple yinmemoryandthisstatisticisincremented.Thisismoreanindicationofsortingactivityintheapplicationworkload.Youcannotdomuchbetterthanmemorysorts,exceptmaybenosortsatall.SortingisusuallycausedbyselectioncriteriaspecificationswithintablejoinSQLoperations.Select*fromv$sysstatwherenamelikeSort(disk):要求IO去臨時表空間的排序Sort(memory):完全在memory中完成的排序數(shù)Sort(rows):被排序的行數(shù)合:sorts(memory)/(sorts(memory)+sorts(disk)selectfromv$sysstata,v$sysstatb,v$sysstatcwhere='sorts(memory)'='sorts(memory)'and='sorts1,2,3,4;createtablettasselect*fromall_objects;Settimingselect*fromttorderby排序診斷和優(yōu)化FROMv$sysstatdisk,v$sysstatmemWHEREmem.NAME='sorts(memory)'ANDdisk.NAME='sortsSort(diskSort(memory)<5如果超過5%,增加sort_area_size的值(調(diào)整PGA)。SELECT*FROM查看bytesprocessed、extrabytesread/written的增量值和cachehitpercentage的值如果cachehitpercentage偏低,則要考慮調(diào)整PGA GlobalArea程序全局區(qū))是一塊包含一個服務(wù)進(jìn)程的數(shù)據(jù)和控制信息的內(nèi)調(diào)整PGA優(yōu)化排序首先查看Oracle的estd_pga_cache_hit_percentageAShit_ratio,ORDERBYtarget_mb;然后調(diào)整altersystemset*在OLTP(聯(lián)機(jī)事務(wù)處理)系統(tǒng)中,典型PGA內(nèi)存設(shè)置應(yīng)該是總內(nèi)存的較小部分(例如)剩下80%分配給SGADSS:PGA_AGGREGATE_TARGET=(total_mem*80%)*dbblockgetsNumberofblocksaccessedinbuffercacheforINSERT,UPDATE,DELETE,andSELECTFORUPDATE.Representblocklogicalreads(fromcache).ThelogicalreadsALWAYSincludethephysicalreads.Lownumberofphysicalreadsispreferable.在Oracle的文檔中有這樣一段dbblockgets:NumberoftimesaCURRENTblockwasconsistentgets:Numberoftimesaconsistentreadwasrequestedforaphysicalreads:Totalnumberofdatablocksreadfromdisk.Thisnumberequalsthevalueof"physicalreadsdirect"plusallreadsintobuffercache.1、DBBlockGets(當(dāng)前請求的塊數(shù)目3、Physicalreads(物理讀、在數(shù)據(jù)庫高速緩存中不存在這邏輯讀指的是Oracle從內(nèi)存讀到的數(shù)據(jù)塊數(shù)量。一般來說是'consistentgets'dbblockgets'。當(dāng)在內(nèi)存中找不到所需的數(shù)據(jù)塊的話就需要從磁盤中獲取,于是就產(chǎn)生了'physicalreads'。select1-((physical.value-direct.value-lobs.value)/logical.value) fromv$sysstatphysical,v$sysstatdirect,v$sysstatlobs,v$sysstatlogicalwhere='physicalreads'='physicalreadsdirect(lob)'and='sessionlogicalreads';BufferCache優(yōu)化慮調(diào)整buffercachehitratio時,需要注意:如果上次增加buffercache的大小以后,沒有對提高h(yuǎn)itratio產(chǎn)生很大效果的話,不要盲目增加buffercache的大小以提高性能。因為對于排序操作或并行讀,oracle是繞過buffercache進(jìn)行的。在調(diào)整buffercache時,盡量避免增加很多的內(nèi)存而只是提高少量hitratio的情況出現(xiàn)。showparameter_sizeparsecountTotalnumberofparsecalls(realparses).Ahardparseisaveryexpensiveoperationintermsofmemoryuse,becauseitrequiresOracletoallocateaworkheapandothermemorystructuresandthenbuildaparsetree.Shouldbeminimized.TheratioofHardParsetoTotalshouldbelessthan20%.sharedpool或雖然在sharedpool但因為兩者存在部分差異而不能被使用時產(chǎn)生硬解析。如果語句已經(jīng)存在于sharedpool并且可以被使用則產(chǎn)生軟解析。當(dāng)語句被使用(即共享)所有數(shù)據(jù)Softparseratio:這項將顯示系統(tǒng)是否有太多硬解析。該值可與原始統(tǒng)計數(shù)據(jù)對比以確確。例如,軟解析率僅為0.2則表示硬解析率太高,不過,如果總解析量(parsecounttotal)偏:1-(parsecount(hard)/parsecount(total)select1-(a.value/b.value)W='parsecount(hard)'='parsecountTheparseprocessincludesthefollowingphases(解析過程包括以下階段CheckingthattheSQLstatementissyntacticallyvalid(thatis,thattheSQLconformstotherulesoftheSQLlanguage,andthatall andoperatorsarevalidandcorrectlyused).CheckingthattheSQLissemanticallyvalid.Thismeansthatallreferencestodatabaseobjects(suchastablesandcolumns)arevalid.Checkingsecurity(thatis,thattheuserhaspermissiontoperformthespecifiedSQLoperationsontheobjectsinvolved).DetermininganexecutionnfortheSQLstatement.TheexecutionndescribestheseriesofstepsthatOracleperformsinordertoaccessandupdatethedatainvolved.Parsingcanbeanexpensiveoperation.ItsoverheadisoftenmaskedbythegreateroverheadofhighI/Orequirements.However,eliminatingunnecessaryparsingisalwaysdesirable.Theparse/executeratioreflectstheratioofparsecallstoexecutecalls.Becauseparsingisanexpensiveoperation,itisbettertoparsestatementsonceandthenexecutethemmanytimes.Highparseratios(greaterthan20%)canresultfromthefollowingIfli ls,ratherthanbindvariables,areusedasqueryparameters,theSQLmustbere-parsedoneveryexecution.Youshouldusebindvariableswheneverpossible,unlessthereisapressingreasonforusingcolumnhistograms.SomedevelopmenttoolsortechniquesresultinSQLcursorsbeingdiscardedafterexecution.Ifacursorisdiscarded,thentheparseisrequiredbeforethestatementcanbere-executed.Oraclesql的處理過程1、語法檢查(syntax2、語義檢查(semantic4、執(zhí)行sql,返回結(jié)果(executeandreturn)Oracle利用內(nèi)部的hashsqlhashlibrarycache里查找是否存在該hash值;sql與cache查找不能被充分共享利用的SQL語句(查詢LibraryCache中執(zhí)行次數(shù)偏低的SQL語句SELECTsql_textFROMv$sqlareaWHEREexecutions<5ORDERBYparseSELECTsql_text,parse_calls,executionsFROMv$sqlareaORDERBYsharedpoolsize,通過調(diào)整SharedPool來調(diào)整LibraryCache,invalidations的值也應(yīng)該接近0selectnamespace,gethitratio,pinhitratio,reloads,invalidationsfromv$librarycache;SELECTgethitratioFROMv$librarycacheWHEREnamespace='SQLSELECTsql_text,users_executing,executions,loadsFROM進(jìn)一步查詢該SQL的完整信息SELECT*FOMv$sqltextWHEREsql_textLIKE'SELECT*FROMhr.employeesWHERE診斷Selectsum(pins)"executions",sum(reloads)"cachemisses",sum(reloads)/sum(pins)fromreloads/pins>1%有兩種可能,一種是librarycache空間不足,一種是sql中的對象不合法查看某個session的hardparse個數(shù)selecta.sid,a.valuefromv$sesstata,v$sessionb,v$statnamecwherea.sid=b.sidanda.statistic#=c.statistic#anda.sid=137and='parsecount(hard)';SELECTshared_pool_size_for_estimateASpool_size,estd_lc_size,estd_lc_time_saved 估計librarycache的大小 調(diào)優(yōu)SQL>CREATE m(xSQL>CREATEORRECEPROCEDUREproc1ExecuteENDLOOP;/ExecuteENDLOOP;/SQL>SETTIMINGSQL>execElapsed:00:00:08.93SQL>selectcount(*)fromSQL>TRUNCATETABLETabletruncated.SQL>execproc1;Elapsed:00:00:01.85SQL>selectcount(*)from2、修改cursor_sharing參數(shù)為similar,讓類似的SQL語句不做 CURSOR_SHARING=SIMILAR來強(qiáng)制ORACLE使用綁定變量ShowparameterAltersystemset實驗cursor_sharingstringEXACTSQL>select*fromtestwhereobject_id=1;norowsselectedSQL>selectsql_text,parse_callsfromv$sqlareawheresql_textlike'select*fromtest%';select*fromtestwhereobject_id=:"SYS_B_0"2select*fromtestwhereobject_id=11SQL>altersystemflushshared_pool;Systemaltered.SQL>altersystemflushshared_pool;Systemaltered.SQL>altersessionset SessionSQL>select*fromtestwhereobject_id=1;norowsselectedSQL>selectsql_text,parse_callsfromv$sqlareawheresql_textlike'select*fromtest%';select*fromtestwhereobject_id=:"SYS_B_0"1SQL>select*fromtestwhereobject_id=2;norowsselectedSQL>selectsql_text,parse_callsfromv$sqlareawheresql_textlike'select*fromtest%';select*fromtestwhereobject_id=:"SYS_B_0"2CPUusedbythisAmountofCPUtime(intensofmilliseconds)usedbyasessionfromthetimeausercallstartsuntilitends.Ifausercallcompleteswithin10milliseconds,thestart-andend-usercalltimesarethesameforpurposesofthisstatistic,and0millisecondsareaddedParseCPUtototalCPUratio:該項顯示總的CPU花費(fèi)在執(zhí)行及解析上的比率。如果這項比率:1-(parsetimecpu/CPUusedbythisselect1-(a.value/b.value)where='parsetimecpu'and='CPUusedbythissession';V$SYSSTATshowsOracleCPUusageforallsessions.Thestatistic"CPUusedbythissession"showstheaggregateCPUusedbyallsessions.V$SESSTATshowsOracleCPUusagepersession.YoucanusethisviewtodeterminewhichparticularsessionisusingthemostCPU.Ifyoucan,determinewhytheprocessesusesomuchCPUtimeandattempttotunethem.Possibleareastoresearchinclude,butarenotlimitedto,thefollowing:ReadConsistencyWaitDetectionLatch診斷找使用CPU多的用戶fromv$sessiona,v$processb,v$sesstatcwherec.statistic#=12andc.sid=a.sidanda.paddr=b.addrorderbyvalue*12是cpuusedbythis再找出使用CPU多的SQL查找指定SPID正在執(zhí)行的SQL語句 P.pidpid,S.sidsid,P.spidspid,S.usernameusername,S.osuserosname,P.serial#WHEREP.addr=s.paddrANDS.sql_address=a.address 或者指定SID查看正在執(zhí)行的SQL語句SELECTP.pidpid,S.sidsid,P.spidspid,S.usernameusername,S.osuserosname,P.serial#WHEREP.addr=s.paddrANDS.sql_address=a.address ANDs.sid=診斷和優(yōu)SQLPL/SQL指定某個Session的SQL語句selectSID,SERIAL#,USERNAME,OSUSER,MACHINE,TERMINAL,PROGRAMfrom 然后利用DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION包來特定的進(jìn)程Oracle提交的SQL語句execute execute 在Spotlight中執(zhí)行session的SQL語句,并查看執(zhí)行計劃還可以利用SQLTuning的調(diào)優(yōu)建議功能D:\PrefTest\案例\oracle性能調(diào)優(yōu)\SQL優(yōu)化 索引問題診斷與優(yōu)UsageofFunctions(where關(guān)鍵字后要盡量避免使用函數(shù)UsingfunctionsinthewhereclausesuppressestheuseofSELECT*FROMdwtable2WHEREto_number(empno)=783;Elapsed:00:00:00.15ThisquerycouldbewrittenmoreefficientlySELECT*FROMdwtable2WHERE實createtables1asselect*fromSH.SALES;createtables2asselect*fromsettimingselect*froms1whereprod_id=1;select*froms2whereprod_id=1;索引性能測試與診斷1、查看數(shù)據(jù)庫Index信息SELECTA.OWNER, A.TABLESPACE_NAME,A.UNIQUENESSFROMDBA_INDEXESA,DBA_IND_COLUMNSB,DBA_TABLESCWHEREA.OWNER=UPPER('hr')ANDA.OWNER=C.OWNERANDA.TABLE_NAME=B.TABLE_NAME 2、查出沒index的表FROMALL_TABLESWHEREOWNERNOTIN('SYS','SYSTEM','OUTLN','DBSNMP')ANDOWNER=FROMALL_INDEXESWHEREOWNERNOTIN3、查出建立了過index的表 FROMALL_INDEXESWHEREOWNERNOTIN('SYS','SYSTEM','OUTLN','DBSNMP')ANDOWNER=HAVINGCOUNT(*)>('4')重;建議每張表不超過5個索引。實驗createtabletable1asselect*fromSH.SALES;createtabletable2asselect*fromSELECTcount(*)FROMtable1whereprod_id=30;settimingupdatetable1setcust_id=1whereprod_id=30;updatetable2setcust_id=1whereprod_id=30;4、找出全表掃描(FullScan)SidThefollowingqueryreportshowmanyfulltablescansaretakingce:SELECTname,valueFROMWHEREnameLIKE'%tableORDERBYThevaluesrelatingtothefulltablescanstablescans(longtables)-ascanofatablethathasmorethanfivedatabaseblockstablescans(shorttables)-acountoffulltablescanswithfiveorfewerblocksIfthenumberoflongtablescansissignificant,thereisastrongpossibilitythatSQLstatementsinyourapplicationneedtuningorindexesneedtobeadded.Ifyoucanidentifytheuserswhoareexperiencingthefulltablescans,youcanfindoutwhattheywererunningtocausethesescans.Belowisascriptthatallowsyoutodothis: || || ||')'"UserSUM(DECODE(NAME,'tablescans(shorttables)',VALUE))"ShortScans",SUM(DECODE(NAME,'tablescans(longtables)',VALUE))"LongScans", FROMv$sessionss,v$sesstatse,v$statname WHEREse.statistic#= AND(NAMELIKE'%tablescans(short ORNAMELIKE'%tablescans(long ORNAMELIKE'%tablescanrows ANDse.sid= ANDss.usernameISNOT GROUPBY || || ||')D:\PrefTest\案例\oracle性能調(diào)優(yōu)\Oracle索引問題診斷與優(yōu)p6spy和SQL語D:\PrefTest\案例\p6spy1、把P6Spy的jar包p6spy.jar放到CLASSPATH中,如果是WebYourWebApp/WEB- 、把perties放到CLASSPATH目錄下,如果是WebYourWebApp/WEB- 、修改你應(yīng)用系統(tǒng)中的數(shù)據(jù)庫驅(qū)動名稱 P6Spy的驅(qū)動程序名 其它的全部使用默認(rèn)值,暫時先都不用修4pertiesrealdriver,把它的值改為你的應(yīng)用系統(tǒng)的真正 下的spy.log里看到SQLSQLJSP、Servlet性能優(yōu)D:\PrefTest\案例\servlet性能優(yōu) 常見性能問題分析與優(yōu)Servlet中利用init()方法進(jìn)行高速servlet大大地提高系統(tǒng)性能,例如下面的Servlet代碼:publicclassTestInit2extendsHttpServlet //加載JDBC驅(qū)StringdbURL="jdbc:sqlserver://localhost:1433;DatabaseName=Northwind"; StringuserName="sa"; StringuserPwd=""; ConnectiondbConn;Statementstmt=null;ResultSetrs=null;{}publicvoidtry{{}}publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{PrintWriterout=response.getWriter();try{rsstmt.executeQuery"select*fromNorthwind.dbo.Orders得到結(jié)果集out.println("out.printlnrs.getString("orderid取出列值out.println("");}out.println("}catch(Exception{}}publicvoidinit()throws{trytry{{}stmt=dbConn.createStatement();//創(chuàng)建}catch(ClassNotFoundException{{}}}要快點:0.465VS0.591initServletdoGet中連接數(shù)據(jù)庫、執(zhí)行查詢語句,這樣每次請求Servlet都將執(zhí)行這些代碼,耗費(fèi)大量資源:publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringdriverName=" //加載StringdbURLjdbc:sqlserver://localhost:1433; StringuserName="sa"; StringuserPwd=""; ConnectionStatementstmt=ResultSetrs=trystmt=dbConn.createStatement();//創(chuàng)建rsstmt.executeQuery"select*fromNorthwind.dbo.Orders得到結(jié)果集out.println("out.printlnrs.getString("orderid取出列值out.println("");}out.println("}catch(Exception{e.printStackTrace();}}Servlet壓縮輸縮大概可以節(jié)省40%左右的流量。Stringc=ifc".equals(c))壓縮輸CompressionResponsecResponse=newCompress

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論