隨筆 - 14, 文章 - 0, 評(píng)論 - 15, 引用 - 0
          數(shù)據(jù)加載中……

          BEA WebLogic JRockit的使用和性能調(diào)優(yōu)(收藏)

          一.JRockit調(diào)優(yōu)簡(jiǎn)介
          JRockit是一個(gè)自適應(yīng)的JVM,它能夠自動(dòng)調(diào)整自己去適應(yīng)底層硬件,因此對(duì)它的調(diào)優(yōu)主要集中在一些需要人工干預(yù)的參數(shù)上,比如說(shuō):需要?jiǎng)澐侄嗌賀AM給JRockit使用等。JRockit有一組非標(biāo)準(zhǔn)的-X啟動(dòng)選項(xiàng),我們可以用它來(lái)調(diào)節(jié)JVM。JRockit有兩組主要的子系統(tǒng)可以被優(yōu)化--內(nèi)存管理系統(tǒng)(包括垃圾回收)和線程系統(tǒng)。在內(nèi)存管理子系統(tǒng)方面,有很多調(diào)優(yōu)的工作可以做。


          二.Tuning WebLogic JRockit JVM
          1.設(shè)置初始堆尺寸
          可以通過(guò)-Xms:<size>m來(lái)設(shè)置初始堆大小,如果-Xmx的值小于128MB,則-Xms缺省取值為16MB;如果-Xmx設(shè)置大于128MB,則-Xms缺省值為物理內(nèi)存的25%,最大不超過(guò)64M。例子:
          -Xgc:gencon -xms:64m -Xmx:64m myClass
          2.設(shè)置最大堆尺寸
          可以通過(guò)-Xmx:<size>m來(lái)設(shè)置最大堆尺寸。在IA32構(gòu)架下,由于操作系統(tǒng)給每個(gè)進(jìn)程的最大內(nèi)存尋址空間為1.8G,因此最大堆尺寸不能超過(guò)1.8G。在IA64構(gòu)架下,就沒(méi)有1.8G的限制。
          如果你的JAVA應(yīng)用程序在運(yùn)行時(shí)出現(xiàn)了Out of memory的錯(cuò)誤,你就需要調(diào)大最大堆尺寸。如果沒(méi)有設(shè)置最大堆尺寸,則缺省值為:
          1. 如果設(shè)置了-Xgc:gencopy,由最大堆尺寸是min{400, 物理內(nèi)存*75%};
          2. 如果沒(méi)有設(shè)置-Xgc:gencopy,由最大堆尺寸是min{1536, 物理內(nèi)存*75%};
          最好手工把最大堆尺寸設(shè)置為物理內(nèi)存(1024M)的75%:
          -Xgc:gencon -xms:64m -Xmx:768m myClass
          3.設(shè)置Nursery的尺寸
          可以使用-Xns:<size>來(lái)設(shè)置Nursery的尺寸,我們要在保證垃圾回收停頓時(shí)間(garbage collection-pause)盡可能短的同時(shí),盡量加大Nursery的尺寸,這在創(chuàng)建了大量的臨時(shí)對(duì)象時(shí)尤其重要。缺省值為:
          1. 對(duì)于-Xgc:gencopy,缺省的Nursery大小為320KB/CPU,對(duì)于10個(gè)CPU的系統(tǒng)來(lái)說(shuō),Nursery大小為3200KB(3.2M)
          2. 對(duì)于-Xgc:gencon,缺省的Nursery大小為10M/CPU,對(duì)于10個(gè)CPU的系統(tǒng)來(lái)說(shuō),Nursery大小為100M
          4.定義內(nèi)存空間的清理時(shí)機(jī)
          可以使用-Xcleartype:<gc|local|alloc>來(lái)定義已經(jīng)被垃圾回收的內(nèi)存空間在什么時(shí)候可以被清理,支持以下三種方式:
          1. gc,在垃圾回收的同時(shí)清理內(nèi)存;
          2. local,在分配了一塊thread-local區(qū)域時(shí)清理內(nèi)存,僅在把參數(shù)-Xallocationtype設(shè)置成local時(shí)才有用;
          3. alloc,在這塊內(nèi)存被分配給其它對(duì)象時(shí)清理。在IA64上目前還不支持。
          缺省值為:
          1. IA32上缺省值為alloc
          2. IA64上缺省值為gc
          5.定義線程分配的類(lèi)型
          可以使用-Xallocationtype:<global|local>來(lái)定義線程分配的類(lèi)型。
          1. global,在最大堆尺寸比較小時(shí)(小于128M)或者應(yīng)用程序大量使用了線程時(shí)使用。
          2. local,在最大堆尺寸比較大時(shí)(大于128M)或者應(yīng)用程序少量使用了線程時(shí)使用。
          缺省值:
          1. 如果設(shè)置了-Xgc:gencopy,缺省值為global
          2. 如果設(shè)置了-Xgc:siglecon,-Xgc:gencon和-Xgc:parallel,缺省值為local
          6.定義線程棧尺寸
          可以使用-Xss<size>[k|K][m|M]來(lái)定義線程棧大小。最小線程尺寸定義如下:
          1. thin threads:最小線程棧尺寸為8K,缺省為64K;
          2. native threads:最小線程棧尺寸為16K
          如果-Xss設(shè)置小于最小值,則自動(dòng)使用最小值。
          缺省值:
          1. IA32系統(tǒng),WIN32:64K,LINUX32:128K
          2. IA64系統(tǒng),WIN64:320K,LINUX64:1M

          二.Basic Tuning Tips and Techniques
          盡管JRockit提供了一組缺省的OOTB配置選項(xiàng),但最好根據(jù)實(shí)際應(yīng)用情況來(lái)對(duì)JRockit作一些調(diào)整。
          1.決定你要在哪方面調(diào)優(yōu)
          要考慮的因素有:
          1. 要為JRockit分配多少內(nèi)存空間;
          2. 你要調(diào)優(yōu)的目的是什么,是要得到更好的響應(yīng)性還是更好的性能;
          2.設(shè)置堆尺寸
          對(duì)于堆尺寸來(lái)說(shuō),當(dāng)然是越大越好了。如果設(shè)得不夠大,就會(huì)造成Out-of-memory和內(nèi)存分頁(yè)錯(cuò)。如果同時(shí)運(yùn)行了多個(gè)應(yīng)用程序,建議把最小和最大堆尺寸設(shè)置成一樣大。
          3.在高響應(yīng)性方面的調(diào)優(yōu)
          要得到更好的響應(yīng)性能,應(yīng)該設(shè)置
          1. 使用并發(fā)垃圾回收器。-Xgc:gencon
          2. 設(shè)置初始和最大堆大小。-Xms512m,-Xmx768m,由于使用了并發(fā)垃圾回收器,所以堆大小不會(huì)造成長(zhǎng)時(shí)間的等待。
          3. 設(shè)置nursery尺寸。如果用到了大量的臨時(shí)對(duì)象,則需要適當(dāng)?shù)恼{(diào)大nursery尺寸。調(diào)大nursery尺寸會(huì)導(dǎo)致垃圾回收的停頓時(shí)間加長(zhǎng),因此要注意,確保垃圾回收的停頓時(shí)間在可忍受的范圍內(nèi),這個(gè)停頓時(shí)間可以通過(guò)設(shè)置-Xgcpause來(lái)查看。
          4.在高性能方面的調(diào)優(yōu)
          如果要得到更好的性能,你應(yīng)該:
          1. 選用并行垃圾回收器,由于并行垃圾回收器不使用nursery,因此你不必再設(shè)置-Xns,方法是加上-Xgc:parallel
          2. 把初始和最大堆尺寸設(shè)置調(diào)到盡可能的大。方法是-Xms512m, -Xmx768m。
          5.分析垃圾回收和停頓時(shí)間
          1. 使用-Xgcreport生成報(bào)表,顯示垃圾回收的統(tǒng)計(jì)信息,從中可以看出你是不是最有效地使用了垃圾回收器。
          2. 使用-Xverbose:memory來(lái)顯示在運(yùn)行期間每一次垃圾回收的停頓時(shí)間。本選項(xiàng)僅用于調(diào)試,會(huì)產(chǎn)生大量的控制臺(tái)輸出。
          6.調(diào)整線程選項(xiàng)
          當(dāng)大量地使用了線程時(shí)(超過(guò)100個(gè)),需要調(diào)整線程選項(xiàng):
          1. 使用thin線程選項(xiàng)。-Xthinthreads。瘦線程模式在LINUX下非常有效。注意:瘦線程在JRockit中只是一個(gè)試驗(yàn)選項(xiàng),不推薦廣泛使用;
          2. 關(guān)閉本地分配線程的選項(xiàng)。-Xallocationtype:global。每個(gè)本地線程區(qū)都要消耗大約2K的內(nèi)存,如果大量地使用了線程,本地線程不但會(huì)造成內(nèi)存空間浪費(fèi),而且還會(huì)造成堆碎片。使用全局線程機(jī)制會(huì)減少堆碎片,但在內(nèi)存分配方面速度要慢一些。
          7.分析并改善應(yīng)用程序設(shè)計(jì)
          找出瓶頸方法:
          1. 使用Intel VTune工具;
          2. 使用-Xjvmpi:allocs=off,monitors=off,entryexit=off選項(xiàng)。

          三.Command Line Options by Name
          啟動(dòng)JRockit時(shí),可以帶一些-X選項(xiàng),這些選項(xiàng)是非JVM標(biāo)準(zhǔn)的,專(zhuān)門(mén)用于配置JRockit的性能。
          選項(xiàng)
          描述

          -X

          顯示擴(kuò)展Java選項(xiàng)

          -Xallotype

          -Xallocationtype

          可取值global和local,定義使用本地線程還是全局線程。

          -Xbootclasspath

          指定類(lèi)搜索路徑,可以是ZIP和JAR文件,以;或:分隔

          -Xcleartype

          定義內(nèi)存清理時(shí)機(jī),可取值gc, local, alloc。gc表示在垃圾回收時(shí)清理內(nèi)存;local表示時(shí)分配一塊local線程區(qū)時(shí)清理;alloc表示內(nèi)存區(qū)要被分配給其它對(duì)象時(shí)清理

          -Xgc

          選擇要使用的垃圾回收器的類(lèi)型,可取值:

          gencopy:generational copying

          singlecon:single spaced concurrent,單空間并發(fā)

          gencon:generational concurrent

          parallel:parallel

          如果-Xmx小于128M,缺省使用gencopy,否則使用gencon

          -Xgcpause

          打印由垃圾回收器造成的停頓時(shí)間

          -Xgcreport

          打印垃圾回收?qǐng)?bào)表

          -Xjvmpi

          是否允許JVMPI事件,這些事件有:

          entryexit(缺省ON)

          allocs(缺省ON)

          monitors(缺省ON)

          arenasdelete(缺省OFF)

          -Xmanagement

          激活JVM中的管理服務(wù)器,在JVM的管理控制臺(tái)能連接到它之前,必須先激活。

          -Xms

          設(shè)置初始堆大小,單位有K、M、G

          -Xmx

          設(shè)置最大堆大小,單位有K、M、G

          -Xnativethreads

          使用本地線程系統(tǒng),這是缺省選項(xiàng)

          -Xnoclassgc

          禁止對(duì)類(lèi)作垃圾回收

          -Xnohup

          告訴JRockit,忽略CTRL_LOGOFF_EVENT和SIGHUP事件

          -Xns

          設(shè)置nursery尺寸,單位有K、M、G

          -Xss

          設(shè)置線程棧尺寸,單位有K、M、G

          -Xthinthreads

          使用JRockit的高性能線程系統(tǒng),在IA64上不可用。

          -Xverbose

          讓JRockit打印更多的信息,可選的參數(shù)有:

          codegen、cpuinfo、gc、load、memory、Opt

          -Xverify

          作完整的bytecode一級(jí)的校驗(yàn)

          四.用JRockit8.1中的Method Profiler調(diào)優(yōu)WebLogic
          1.關(guān)于Method Profiler工具
          BEA WebLogic JRockit 8.1提供了一個(gè)Profiling工具:Method Profiler來(lái)調(diào)優(yōu)WebLogic應(yīng)用。
          2.利用Method Profiler調(diào)優(yōu)WebLogic應(yīng)用
          JRockit 8.1所帶的Method Profiler工具能夠?qū)⑺性贘Rockit Java虛擬機(jī)上執(zhí)行的成員方法的調(diào)用次數(shù)、執(zhí)行的總時(shí)間和每次調(diào)用的執(zhí)行時(shí)間都統(tǒng)計(jì)出來(lái),如圖1所示。這樣的功能一來(lái)可以讓我們對(duì)跑在WebLogic上的應(yīng)用進(jìn)行tuning(代碼級(jí)的),二來(lái)也大大方便了我們確定系統(tǒng)瓶頸在何處。這也可以說(shuō)是JRockit JVM相對(duì)于其他JVM在功能上的一大優(yōu)勢(shì)。

          在一次對(duì)WebLogic Server 8.1的壓力測(cè)試中,對(duì)一組包含了CMP特性的樣本進(jìn)行壓力測(cè)試時(shí),就利用JRockit的Method Profiler診斷出了系統(tǒng)的瓶頸所在,現(xiàn)介紹如下。CMP這組樣本中原先對(duì)CMP Entity Bean的操作除了用ejbCreate插入一條記錄之外,緊跟著用setName方法設(shè)置其name屬性,即UPDATE其對(duì)應(yīng)數(shù)據(jù)庫(kù)記錄中name域的值,代碼如下:
          public void ejbCreate() //Stateful4CMPBean中的方法
          throws CreateException
          {
          try
          {
          Context ctx = new InitialContext();
          SheepHome home = (SheepHome)ctx.lookup("Sheep");
          Sheep sheep = null;
          int x = getNextId(); // getNextId()也包含對(duì)數(shù)據(jù)庫(kù)的操作
          sheep = home.create(x);
          if(sheep != null)
          {
          sheep.setName("sheep1".concat(String.valueOf(String.valueOf(x))));
          m_strMsg = "create sheep".concat(String.valueOf(String.valueOf(x)));
          } else
          {
          m_strMsg = "The sheep name is not created.";
          }
          }
          catch(Exception e)
          {
          m_strMsg =
          "*** some exception occured! (CMP) ".concat(String.valueOf(String.valueOf(e.getMessage())));
          }
          }
          此時(shí)測(cè)出來(lái)的數(shù)據(jù),TPS平均值非常低,且測(cè)試時(shí)Response Time總是隨著時(shí)間的增長(zhǎng)幾乎呈線性攀升。于是用Method Profiler進(jìn)行診斷:
          (1) 在JRockit的啟動(dòng)參數(shù)中加入-Xmanagement,以便啟動(dòng)JRockit的時(shí)候同時(shí)啟動(dòng)其Management Server。
          (2) 啟動(dòng)JRockit Management Console,并且將其連接到啟動(dòng)了的Management Server上。(在做壓力測(cè)試時(shí)用JRockit Management Console進(jìn)行觀察對(duì)性能的損耗可以忽略不計(jì))
          (3) 在JRockit Management Console中,將ToolsàPreferences菜單中的Mode of operation屬性設(shè)為developer。
          (4) 在Method Profiler屬性頁(yè)中添加你所需要觀察的類(lèi)的成員方法。
          (5) 按Start按鈕讓Method Profiler開(kāi)始進(jìn)行統(tǒng)計(jì)。
          Time/Inv(ns)指標(biāo)的顯示結(jié)果表明Stateful4CMPBean.ejbCreate()代碼所含邏輯成為了系統(tǒng)的瓶頸。結(jié)果又顯示getNextId()和home.create()操作消耗的時(shí)間只占Stateful4CMPBean.ejbCreate()的一小部分,而sheep.setName()操作消耗的時(shí)間卻占了Stateful4CMPBean.ejbCreate()的剩下的(指除去getNextId()和home.create()操作消耗的時(shí)間)絕大部分。
          于是又用Method Profiler作了一系列實(shí)驗(yàn),結(jié)果如下:用1個(gè)用戶(hù)做壓力測(cè)試,sheep.setName()操作消耗的時(shí)間為X,getNextId()操作消耗的時(shí)間為Y,home.create()操作消耗的時(shí)間為Z;用2個(gè)用戶(hù)做壓力測(cè)試,sheep.setName()操作消耗的時(shí)間約為2X,getNextId()操作消耗的時(shí)間約為Y,home.create()操作消耗的時(shí)間約為Z;用3個(gè)用戶(hù)做壓力測(cè)試,sheep.setName()操作消耗的時(shí)間約為3X,getNextId()操作消耗的時(shí)間約為Y,home.create()操作消耗的時(shí)間約為Z。可以比較肯定地判斷,sheep.setName()執(zhí)行的是一個(gè)串行化的邏輯。檢查Oralce中UPDATE的ISOLATION-LEVEL,果然為SERIALIZABLE。
          將sheep.setName("sheep1".concat(String.valueOf(String.valueOf(x)))); 這句代碼刪掉。
          重新測(cè)試,TPS平均值有很大幅度的提高,Response Time在壓力測(cè)試開(kāi)始一段時(shí)間后也趨于平穩(wěn),幾乎呈水平線走勢(shì)。

          posted @ 2005-06-10 16:38 Boris-Java 閱讀(1797) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共14頁(yè): 上一頁(yè) 1 2 3 4 5 6 7 8 9 下一頁(yè) Last 
          主站蜘蛛池模板: 栾城县| 普兰店市| 庆城县| 平遥县| 松阳县| 宁武县| 通化县| 永新县| 新沂市| 洛阳市| 贡觉县| 大同县| 新源县| 澄城县| 福建省| 阿城市| 大连市| 焉耆| 高雄县| 大港区| 巴青县| 邵武市| 台东县| 汝州市| 曲麻莱县| 社旗县| 泊头市| 阳信县| 浪卡子县| 格尔木市| 彭泽县| 简阳市| 朝阳区| 乌拉特后旗| 贵定县| 宣威市| 江孜县| 康乐县| 综艺| 昂仁县| 南川市|