- 論壇徽章:
- 59
|
Weblogic內(nèi)存遺漏,不外乎也就兩種情況,一種是虛擬機(jī)內(nèi)存參數(shù)設(shè)置不合理,造成Weblogic運(yùn)行一段時(shí)候后內(nèi)存分配不足,而造成內(nèi)存遺漏的發(fā)生;第二種情況不外乎就是我們的程序?qū)懙牟缓,分配的?nèi)存沒有及時(shí)的釋放而造成內(nèi)存泄漏情況的發(fā)生。
關(guān)于內(nèi)存泄漏問題,我們一般會從應(yīng)用程序出發(fā),去審核代碼,做到代碼級的優(yōu)化,然后再調(diào)整應(yīng)用服務(wù)器(BEA WebLogic8.1)和數(shù)據(jù)庫 (Oracle9i)的參數(shù),最后當(dāng)然是調(diào)整操作系統(tǒng)和網(wǎng)絡(luò)的性能(包括硬件升級)。這是一種MDA的先進(jìn)做法。
2、Goldengate數(shù)據(jù)遷移注意事項(xiàng)及常見問題
這個(gè)我沒有做過,暫時(shí)不知道。
1. 非圖形界面下的安裝
./tuxedo81_aix_32bit.bin -i console 加入 -i console則不需要圖形支持
2.察看版本和patch信息
$TUXDIR/bin/tmadmin -v
3.對ubb文件只做語法檢查(不真正的load成TUXCONFIG 真正tmloadcf -y)
tmloadcf -n ubb
4.tmboot/tmshutdown中的幾個(gè)參數(shù)介紹
-A 只啟動(dòng)/停止Tuxedo管理服務(wù),如BBL
-S 所有服務(wù)被啟動(dòng)/停止
-g grpname 只啟動(dòng)/停止屬于制定組名的服務(wù)
-i svrid 只啟動(dòng)/停止制定ServID的服務(wù)
-s svrname 只啟動(dòng)/停止制定服務(wù)名的服務(wù)
5. tuxedo有關(guān)域(domain)管理的命令
$ dmadmin
>pd -d LocalTUXDomainID 顯示與本地域關(guān)聯(lián)的其他域
>co -d LocalTUXDomainID -R RemoteDomainID 手動(dòng)連接遠(yuǎn)程域
6.如何清除IPC資源
如果你不想用tmshutdown停止或者當(dāng)$TUXCONFIG文件被誤刪除而無法shutdown TUXEDO服務(wù)時(shí),可以嘗試直接刪除當(dāng)前用戶的ipc資源,如下:
ipcs | grep `logname` | awk '{print "ipcrm -"$1,$2}' |sh -x
7.反編譯tuxconfig 生成 ubb文件
a) tmunloadcf 查看當(dāng)前TUXCONFIG中的ubb內(nèi)容
b) export TUXCONFIG=`pwd`/tuxconfig 比較簡單的設(shè)置TUXCONFIG的命令
8.Tuxedo非正常狀態(tài)下的關(guān)閉
1) 執(zhí)行tmshutdown -y,如果shutdown不成功,轉(zhuǎn)入下一步(此時(shí)一般來說,TUXEDO的狀態(tài)已經(jīng)處于
不正常了)。
2)執(zhí)行tmipcrm -y,如果shutdown不成功,轉(zhuǎn)入下一步。
3)要用到AWK,所以要求在Unix下,或者在WINDOWS下裝了Cygwin。
3)執(zhí)行ipcrm `ipcs|grep $USER|awk '{print " -"$1" "$2}'`。
執(zhí)行了3)肯定就可以關(guān)閉掉了。
一般情況下,我也懶得那么麻煩,在非生產(chǎn)機(jī)上經(jīng)常來一個(gè)killall -9,將該用戶所有的進(jìn)程都?xì)⒌簟?br />
9.隱藏顯示服務(wù)
隱藏服務(wù)
unadvertise (unadv) {-q qaddress [-g groupname] [-i srvid] |
-g groupname -i srvid} service
顯示服務(wù)
advertise (adv) {-q qaddress [-g groupname] [-i srvid] | -g groupname -i srvid}
service[:func]
上面兩個(gè)命令只能在單獨(dú)登錄tmadmin時(shí)使用。
重復(fù)登錄tmadmin后出現(xiàn)
TMADMIN_CAT:199: WARN: Cannot become administrator.Limited set of commands available.
提示不能使用上面命令。
10.sh命令直接執(zhí)行tuxedo操作
如
$echo pclt |tmadmin
$echo pq |tmadmin |grep Machine
11.WSL配置參數(shù)
WSL的配置重點(diǎn)要注意其CLOPT中幾個(gè)關(guān)鍵參數(shù)的指定:
-m, -M, -x, WSH啟動(dòng)的最大、最小個(gè)數(shù),及每個(gè)WSH可同時(shí)處理的并發(fā)請求數(shù),
"-M" * "-x" = MAXWSCLIENTS;
-I, 客戶端與服務(wù)器端建立連接的超時(shí)時(shí)間;
-N, 客戶端發(fā)起請求的響應(yīng)超時(shí)時(shí)間;
-T, 客戶端在與服務(wù)器端建立連接后,允許最大的空閑時(shí)間;
-H, 穿防火墻時(shí),防火墻的ip
-p, WSH分配的起始端口
-P, WSH分配的結(jié)束端口。 -p 9901 -P 9915 指定端口范圍 9901-9915
12.UBB文件中MAX。。的配置
MAXWSCLIENTS <= Tuxedo license
MAXSERVERS = SUM (MAX setting of servers)
MAXACCESSERS = (MAXSERVERS+MAXWSCLIENTS) * 117%
2.1 JVM調(diào)優(yōu)
2.1.1 垃圾收集和堆大小
垃圾收集(GC)是指JVM釋放Java堆中不再使用的對象所占用的內(nèi)存的過程,而Java堆(Heap)是指Java應(yīng)用程序?qū)ο笊娴目臻g。堆大小決定了GC的頻度和時(shí)間。堆越大,GC頻度低,速度慢。堆越小,GC頻度高,速度快。所以GC和堆大小是一組矛盾。為了獲取理想的Heap堆大小,需要使用-verbosegc參數(shù)(Sun jdk: -Xloggc:<file>)以打開詳細(xì)的GC輸出。分析GC的頻度和時(shí)間,結(jié)合應(yīng)用最大負(fù)載所需內(nèi)存情況,得出堆的大小。
通常情況下,我們建議使用可用內(nèi)存(除操作系統(tǒng)和其他應(yīng)用程序占用之外的內(nèi)存)70-80%,為避免堆大小調(diào)整引起的開銷,設(shè)置內(nèi)存堆的最小值等于最大值即:-Xms=-Xmx。而為了防止內(nèi)存溢出,建議在生產(chǎn)環(huán)境堆大小至少為256M(Platform至少512M),實(shí)際環(huán)境中512M~1G左右性能最佳,2G以上是不可取的,在調(diào)整內(nèi)存時(shí)可能需要調(diào)整核心參數(shù)進(jìn)程的允許最大內(nèi)存數(shù)。對于sun和hp的jvm,永久域太小(默認(rèn)4M)也可能造成內(nèi)存溢出,應(yīng)增加參-XX:MaxPermSize=128m。建議設(shè)置臨時(shí)域-Xmn的大小為-Xmx的1/4~1/3, SurvivorRatio為8。
為了獲得更好的性能,建議在啟動(dòng)文件設(shè)置WebLogic為產(chǎn)品模式,此時(shí)sun和hp jvm JIT引擎為-server,默認(rèn)情況下打開JIT編譯模式對性能也有幫助。調(diào)整Chunk Size和Chunk Pool Size也可能對系統(tǒng)的吞吐量有提高。此外還需關(guān)閉顯示GC: -XX:+DisableExplicitGC。
當(dāng)然在Intel平臺上使用jRockit(使用參數(shù)-jrockit)無疑大大提高WebLogic性能。
2.1.2 jRockit調(diào)優(yōu)
jRockit支持四種垃圾收集器:分代復(fù)制收集器、單空間并發(fā)收集器、分代并發(fā)收集器和并行收集器。默認(rèn)狀態(tài)下,JRockit使用分代并發(fā)收集器。要改變收集器,可使用-Xgc:<gc-name>,對應(yīng)四個(gè)收集器分其他為gencopy, singlecom, gencon以及parallel。為得到更好的響應(yīng)性能,應(yīng)該使用并發(fā)垃圾回收器:-Xgc:gencon,可使用-Xms和-Xmx設(shè)置堆棧的初始大小和最大值,要設(shè)置護(hù)理域-Xns為-Xmx的10%。而如果要得到更好的性能,應(yīng)該選用并行垃圾回收器:-Xgc: parallel,由于并行垃圾回收器不使用nursery,不必設(shè)置-Xns。
如果你的線程大于100或者在linux平臺下,可以嘗試使用瘦線程模式:-Xthinthread,同時(shí)關(guān)閉Native IO:-Xallocationtype:global。
jRockit 還提供了強(qiáng)大的圖形化監(jiān)控工具Jrockit Management Console。欲詳細(xì)了解JRockit可訪問:http://edocs.bea.com/wljrockit/docs81/index.html。
2.2 Server調(diào)優(yōu)
WebLogic Server的核心組件由監(jiān)聽線程,套接字復(fù)用器和可執(zhí)行線程的執(zhí)行隊(duì)列組成。當(dāng)服務(wù)器由監(jiān)聽線程接收到連接請求后,將對它的連接控制權(quán)交給等待接收請求的套接字復(fù)用器。然后套接字復(fù)用器讀取離開套接字的請求,并將此請求及相關(guān)安全信息或事務(wù)處理環(huán)境一起置入適當(dāng)?shù)膱?zhí)行隊(duì)列中(一般為默認(rèn)的執(zhí)行隊(duì)列)。 當(dāng)有一個(gè)請求出現(xiàn)在執(zhí)行隊(duì)列中時(shí),就會有一個(gè)空閑的執(zhí)行線程從該隊(duì)列中取走發(fā)來的該請求,并返回應(yīng)答,然后等待下一次請求。因此要提高WebLogic的性能,就必須從調(diào)整核心組件性能出發(fā)。
2.2.1 盡量使用本地I/O庫
WebLogic Server有兩套套接字復(fù)用器:Java版和本地庫。采用小型本地庫更有效,盡量激活Enable Native IO(默認(rèn)),此時(shí)UNIX默認(rèn)使用CPUs+1個(gè)線程,Window下為雙倍CPU。如果系統(tǒng)不能加載本地庫,將會拋出java.lang.UnsatisfiedLinkException,此時(shí)只能使用Java套接字復(fù)用器,可以調(diào)整socket readers 百分比,默認(rèn)為33%。該參數(shù)可以在Console Server Tuning Configuration配置欄里設(shè)置。
2.2.2 調(diào)整默認(rèn)執(zhí)行線程數(shù)
理想的默認(rèn)執(zhí)行線程數(shù)是由多方面的因素決定的,比如機(jī)器CPU性能、總線體系架構(gòu)、I/O、操作系統(tǒng)的進(jìn)程調(diào)度機(jī)制、JVM的線程調(diào)度機(jī)制。WebLogic生產(chǎn)環(huán)境下默認(rèn)的線程為25個(gè),隨著CPU個(gè)數(shù)的增加,WebLogic可以近乎線性地提高線程數(shù)。線程數(shù)越多,花費(fèi)在線程切換的時(shí)間也就越多,線程數(shù)越小,CPU可能無法得到充分利用。為獲取一個(gè)理想的線程數(shù),需要經(jīng)過反復(fù)的測試。在測試中,可以以25*CPUs為基準(zhǔn)進(jìn)行調(diào)整。當(dāng)空閑線程較少,CPU利用率比較低時(shí),可以適當(dāng)增加線程數(shù)的大小(每五個(gè)遞增)。對于PC Server 和Window 2000,則最好每個(gè)CPU小于50個(gè)線程, 以CPU利用率為90%左右為佳。由于目前WebLogic執(zhí)行線程沒有縮小線程數(shù)的功能,所以應(yīng)將參數(shù)Threads Increase設(shè)置為0,同時(shí)不應(yīng)改變優(yōu)先級的大小。
2.2.3 調(diào)整連接參數(shù)
WebLogic Server用Accept Backlog參數(shù)規(guī)定服務(wù)器向操作系統(tǒng)請求的隊(duì)列大小,默認(rèn)值為50。當(dāng)系統(tǒng)重載負(fù)荷時(shí),這個(gè)值可能過小,日志中報(bào)Connection Refused,導(dǎo)致有效連接請求遭到拒絕,此時(shí)可以提高Accept Backlog 25%直到連接拒絕錯(cuò)誤消失。對于Portal類型的應(yīng)用,默認(rèn)值往往是不夠的。Login Timeout和SSL Login Timeout參數(shù)表示普通連接和SSL連接的超時(shí)時(shí)間,如果客戶連接被服務(wù)器中斷或者SSL容量大,可以嘗試增加該值。這些參數(shù)可以在Console Server Tuning Configration配置欄里找到。
2.2.4 創(chuàng)建新的執(zhí)行隊(duì)列
創(chuàng)建新的執(zhí)行隊(duì)列有助于解決核心業(yè)務(wù)優(yōu)先、避免交叉阻塞、死鎖和長時(shí)間處理的業(yè)務(wù)等問題。通常會將自己的執(zhí)行隊(duì)列和默認(rèn)的執(zhí)行隊(duì)列設(shè)置不同的優(yōu)先級,這里優(yōu)先級不應(yīng)設(shè)為9或者10。 定義一個(gè)新的執(zhí)行隊(duì)列很容易,利用View Excute Queue選項(xiàng)中的Configure a new Excute Queue鏈接即可定制新的執(zhí)行隊(duì)列。創(chuàng)建新的執(zhí)行隊(duì)列后,用戶需要為應(yīng)用程序的J2EE組件配置分配策略,以便它可以找到新的隊(duì)列。舉個(gè)例子:要將servlet或jsp捆綁到一個(gè)特定的執(zhí)行隊(duì)列,必須替換web.xml文件項(xiàng),將wl-dispatch-policy初始化參數(shù)設(shè)置為自己的執(zhí)行隊(duì)列名。
<servlet>
<servlet-name>servletname</servlet-name>
<jsp-file>/directoryname/deployment.jsp</jsp-file>
<init-param>
<param-name>wl-dispatch-policy</param-name>
<param-value>NewExecuteQueueName</param-value>
</init-param>
</servlet>
我們可以為一個(gè)jsp或者servlet乃至一個(gè)WEB應(yīng)用設(shè)置自己的執(zhí)行隊(duì)列。同時(shí)也可以為EJB設(shè)置自己的執(zhí)行隊(duì)列。對于執(zhí)行時(shí)間比較長的MDB,建議使用自己的執(zhí)行隊(duì)列。
2.3 JDBC調(diào)優(yōu)
2.3.1 調(diào)整連接池配置
JDBC Connection Pool的調(diào)優(yōu)受制于WebLogic Server線程數(shù)的設(shè)置和數(shù)據(jù)庫進(jìn)程數(shù),游標(biāo)的大小。通常我們在一個(gè)線程中使用一個(gè)連接,所以連接數(shù)并不是越多越好,為避免兩邊的資源消耗,建議設(shè)置連接池的最大值等于或者略小于線程數(shù)。同時(shí)為了減少新建連接的開銷,將最小值和最大值設(shè)為一致。
增加Statement Cache Size對于大量使用PreparedStatement對象的應(yīng)用程序很有幫助,WebLogic能夠?yàn)槊恳粋(gè)連接緩存這些對象,此值默認(rèn)為10。在保證數(shù)據(jù)庫游標(biāo)大小足夠的前提下,可以根據(jù)需要提高Statement Cache Size。比如當(dāng)你設(shè)置連接數(shù)為25,Cache Size為10時(shí),數(shù)據(jù)庫可能需要打開25*10=250個(gè)游標(biāo)。不幸的是,當(dāng)遇到與PreparedStatement Cache有關(guān)的應(yīng)用程序錯(cuò)誤時(shí),你需要將Cache Size設(shè)置為0。
盡管JDBC Connection Pool提供了很多高級參數(shù),在開發(fā)模式下比較有用,但大部分在生產(chǎn)環(huán)境下不需調(diào)整。這里建議最好不要設(shè)置測試表, 同時(shí)Test Reserved Connections和Test Released Connections也無需勾上。 當(dāng)然如果你的數(shù)據(jù)庫不穩(wěn)定,時(shí)斷時(shí)續(xù),你就可能需要上述的參數(shù)打開。
最后提一下驅(qū)動(dòng)程序類型的選擇,以O(shè)racle為例,Oracle提供thin驅(qū)動(dòng)和oci驅(qū)動(dòng),從性能上來講,oci驅(qū)動(dòng)強(qiáng)于thin驅(qū)動(dòng),特別是大數(shù)據(jù)量的操作。但在簡單的數(shù)據(jù)庫操作中,性能相差不大,隨著thin驅(qū)動(dòng)的不斷改進(jìn),這一弱勢將得到彌補(bǔ)。而thin驅(qū)動(dòng)的移植性明顯強(qiáng)于oci驅(qū)動(dòng)。所以在通常情況下建議使用thin驅(qū)動(dòng)。而最新驅(qū)動(dòng)器由于WebLogic server/bin目錄下的類包可能不是最新的,請以O(shè)racle網(wǎng)站為準(zhǔn): http://www.oracle.com/technology ... tdocs/jdbc9201.html。
2.4 WEB調(diào)優(yōu)
2.4.1 調(diào)整WEB應(yīng)用描述符
WEB應(yīng)用除代碼之外的調(diào)優(yōu)比較簡單,僅僅是對一些WEB應(yīng)用描述符的調(diào)整。首先關(guān)閉Session Monitoring Enabled,僅僅在Cluster環(huán)境下設(shè)置Session復(fù)制(優(yōu)先使用內(nèi)存復(fù)制),在保證應(yīng)用正常運(yùn)行的情況下,設(shè)置較短的Session超時(shí)時(shí)間。 同時(shí)生產(chǎn)環(huán)境下無需檢查Jsp和servlet:JSPPage Check Secs和Servlet Reload Check Secs均設(shè)為-1,關(guān)閉JSPKeep Generated 和JSPVerbose對性能也有幫助。此外,還可以對jsp進(jìn)行預(yù)編譯,有兩種方法:激活precompile選項(xiàng);使用weblogic.appc事先編譯,建議采用后者。
2.5 JMS調(diào)優(yōu)
1. 增加-Dweblogic.JMSThreadPoolSize=n(至少為5),以提高處理JMS的線程數(shù),在jRockit上增加-XXenablefatspin以減少加鎖沖突;
2. 采用文件存儲策略,將同步寫策略設(shè)置為Direct-Write,同時(shí)在windows平臺上啟用磁盤寫入緩存;
3. 使用分布式目的地時(shí),激活連接工廠Load Balancing Enabled ,Server Affinity Enabled;
4. 為減少服務(wù)器不必要的JMS請求路由,如果多個(gè)目的地之間存在事務(wù),則部署在同一JMS服務(wù)器上,盡量將連接工廠部署到JMS服務(wù)器所在的WebLogic實(shí)例上,集群環(huán)境下,則最好將連接工廠部署到集群中的所有服務(wù)器上,而集群中每個(gè)JMS服務(wù)器和目的地成員盡量使用類似的設(shè)置;
5. 啟用消息分頁存儲功能,以釋放內(nèi)存,可以為JMS服務(wù)器和目的地設(shè)置, 激活Messages Paging Enabled和Bytes Paging Enabled,同時(shí)使用限額防止服務(wù)器耗盡接收消息的所有可用內(nèi)存空間;
6. 在運(yùn)行WebLogic Server進(jìn)程之外的生產(chǎn)者務(wù)必使用流控制, 并增大Send Timeout;
7. 將JMS Server Expiration Scan Interval設(shè)很大的值,能禁止主動(dòng)掃描過期消息;
8. 使用FIFO或者LIFO方式處理目的地消息;
9. MDB的max-beans-in-free-pool不應(yīng)大于最大MDB線程數(shù)(默認(rèn)線程數(shù)/2+1)。
2.6 EJB調(diào)優(yōu)
2.6.1 調(diào)整pool和cache
initial-beans-in-free-pool定義SLSB啟動(dòng)時(shí)實(shí)例的個(gè)數(shù),默認(rèn)為0,可以調(diào)大到正常并發(fā)數(shù)的大小,以減少初始響應(yīng)時(shí)間。max-beans-in-free-pool為最大個(gè)數(shù),默認(rèn)1000對SLSB來說,在頻繁創(chuàng)建和刪除實(shí)例的情況下很有幫助,一般不用調(diào)整,至少設(shè)為默認(rèn)線程數(shù),過大容易造成內(nèi)存溢出。而對Entity Bean來說,由于是匿名的,所以當(dāng)頻繁使用finder、home和create方法時(shí)可以調(diào)大。
對SFSB來說,盡量將max-beans-in-cache參數(shù)設(shè)置得足夠的大,以滿足Bean實(shí)例對最大并發(fā)用戶數(shù)的要求,可以避免有狀態(tài)會話Bean過多的鈍化行為。而idle-timeout-seconds盡量設(shè)置小,如果SFSB不用于存儲Web應(yīng)用會話狀態(tài)可以設(shè)置為0。
對于Entity Bean來說, max-beans-in-cache同樣可以首先采用默認(rèn)值1000,監(jiān)控實(shí)例緩存和鈍化的情況,再做適當(dāng)調(diào)整。
并行策略concurrency-strategy定義了實(shí)體Bean如何管理鎖,有四種策略: Exclusive、Databse、ReadOnly、Optimistic。效率依次提高,可靠性依次降低,盡量避免使用互斥策略,如果Bean無需更新操作,使用只讀策略,更甚的是,如果Bean的內(nèi)容不會改變,可設(shè)置read-timeout-seconds為0,樂觀并行策略時(shí)采用事務(wù)間緩存策略,在entity-cache描述符中將cache-between-transactions元素設(shè)為true。
2.6.2 優(yōu)化事務(wù)隔離級別和事務(wù)屬性
對EJB組件來說,有四種事務(wù)隔離水平:
TRANSACTION-SERIALIZABLE:在處理完成之前拒絕其他處理的讀入、可擴(kuò)展性或插入數(shù)據(jù)操作;
TRANSACTION-REPEATABLE-READ:防止處理修改正在被其他處理調(diào)用的數(shù)據(jù);
TRANSACTOIN-READ-COMMITTED:防止對正在被其他處理修改的數(shù)據(jù)執(zhí)行寫鎖定;
TRANSACTION-READ-UNCOMMITTED:允許處理讀入未受權(quán)的數(shù)據(jù)以及允許在向結(jié)果中添加記錄時(shí)可以忽略處理。
以上隔離水平依次降低,效率和性能依次提高。因此,建議選用滿足在業(yè)務(wù)數(shù)據(jù)完整性要求前提下水平最低的隔離級別。
對于事務(wù)屬性的設(shè)置也是如此,對于刪除、修改和插入操作設(shè)置為Required,而對于只讀操作設(shè)置為Supports或者NotSupports。
2.6.3 其他一些小技巧
1. 利用finders-load-bean的默認(rèn)值true,既可以避免“n+1”的查詢問題,又可以提高系統(tǒng)的性能;
2. 使用delay-updates-until-end-of-tx參數(shù)的默認(rèn)值true,除非應(yīng)用程序?qū)δ承┳兓刑貏e的要求;
3. 應(yīng)用程序在每個(gè)業(yè)務(wù)方法調(diào)用后不需要進(jìn)行存在性檢查,將check-exists-on-method設(shè)定為false,以提高程序的性能;
4. 同一應(yīng)用內(nèi), 將enable-call-by-reference設(shè)置為 true;
5. reentrant設(shè)置為false,避免事先加載子數(shù)據(jù)。
|
|