亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 中間件WebLogic/Tuxedo/GoldenGate的排錯(cuò)與優(yōu)化(獲獎(jiǎng)名單已公布) [打印本頁(yè)]

作者: 無(wú)風(fēng)之谷    時(shí)間: 2012-02-14 14:41
標(biāo)題: 中間件WebLogic/Tuxedo/GoldenGate的排錯(cuò)與優(yōu)化(獲獎(jiǎng)名單已公布)

獲獎(jiǎng)名單已公布,詳情請(qǐng)看:http://www.72891.cn/thread-3691083-1-1.html

中間件,前后端工程師都相當(dāng)熟知的名詞。它的高性能讓?xiě)?yīng)用如虎添翼,但是由于應(yīng)用承受著各種壓力,其中所帶來(lái)的問(wèn)題也讓廣大運(yùn)維工程師們頭疼不已。如:基于JVM的中間件WebLogic時(shí)常有出現(xiàn)的內(nèi)存問(wèn)題,怎樣合理的控制IPC資源玩轉(zhuǎn)Tuxedo。
     工程師聚焦的另一個(gè)關(guān)鍵詞是調(diào)優(yōu)。怎么樣在有限的硬件環(huán)境下發(fā)揮出中間件最高的性能,讓?xiě)?yīng)用與服務(wù)器相得益彰。
     帶著這些問(wèn)題,我們邀請(qǐng)到了《叱咤風(fēng)云:企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)》的作者,為大家答疑解惑,共同揭開(kāi)中間件神秘可愛(ài)的另一面。

討論話(huà)題:

1、WebLogic內(nèi)存溢出專(zhuān)題探討
2、Goldengate數(shù)據(jù)遷移注意事項(xiàng)及常見(jiàn)問(wèn)題
3、Tuxedo中IPC相關(guān)故障探討
4、常見(jiàn)的中間件調(diào)優(yōu)手段

活動(dòng)時(shí)間:2012年2月14日-2012年2月29日

邀請(qǐng)嘉賓:
戴冠平:1998年清華大學(xué)碩士學(xué)位畢業(yè),曾供職于中國(guó)科學(xué)院軟件研究所,此后在BEA公司陸續(xù)擔(dān)任售后技術(shù)支持專(zhuān)家,中國(guó)區(qū)售后技術(shù)熱線(xiàn)部門(mén)經(jīng)理。擁有10多年的國(guó)內(nèi)頂尖的中間件技術(shù)應(yīng)用的寶貴經(jīng)驗(yàn),在中國(guó)區(qū)的大型客戶(hù)群中亦享有很高的聲譽(yù)。

譚寬:中間件工程師,曾多次為大型國(guó)家機(jī)關(guān)和電信部門(mén)進(jìn)行WebLogic等中間件的調(diào)優(yōu)實(shí)施以及故障排除,現(xiàn)場(chǎng)經(jīng)驗(yàn)豐富,現(xiàn)就職于聯(lián)動(dòng)北方科技有限公司。

活動(dòng)獎(jiǎng)勵(lì):
    針對(duì)以上任意一個(gè)問(wèn)題跟帖回答,我們會(huì)在討論結(jié)束后,隨機(jī)抽選10名網(wǎng)友贈(zèng)送《Tuxedo企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)》、《WebLogic企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)》、《GoldenGate企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)》三本書(shū)中任意一本作為獎(jiǎng)勵(lì)。

《叱咤風(fēng)云:GoldenGate企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)》
第三章:  http://wenku.it168.com/d_000105899.shtml
第九章:  http://wenku.it168.com/d_000105900.shtml
第十章:  http://wenku.it168.com/d_000105901.shtml
第十一章:http://wenku.it168.com/d_000105902.shtml


《叱咤風(fēng)云:Tuxedo企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)》
第七章:http://wenku.it168.com/d_000105839.shtml
第九章:http://wenku.it168.com/d_000105842.shtml
第十章:http://wenku.it168.com/d_000105843.shtml


《叱咤風(fēng)云:WebLogic企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)》
第三章:http://wenku.it168.com/d_000105831.shtml
第七章:http://wenku.it168.com/d_000105832.shtml
第八章:http://wenku.it168.com/d_000105833.shtml


作者: T-Bagwell    時(shí)間: 2012-02-14 14:44
好活動(dòng)
支持
作者: king_819    時(shí)間: 2012-02-14 14:54
這個(gè)就比較有針對(duì)性了,支持下!
作者: gilet    時(shí)間: 2012-02-14 15:05
支持
weblogic和oracle goldengate我們都有,就是研究不深
作者: 無(wú)風(fēng)之谷    時(shí)間: 2012-02-14 15:18
回復(fù) 4# gilet


    呵呵 可以分享下生產(chǎn)中的經(jīng)驗(yàn)嘛
作者: gilet    時(shí)間: 2012-02-14 15:33
回復(fù) 5# 無(wú)風(fēng)之谷


    weblogic內(nèi)存溢出這個(gè)問(wèn)題,怎么調(diào)都有
作者: 三人行必有吾師    時(shí)間: 2012-02-14 16:58
大家好, 我是本套書(shū)編著的作者戴冠平。首先歡迎大家光臨此貼,非常感激! 能有機(jī)會(huì)和大家這么近的一起交流中間件方面的技術(shù)問(wèn)題,是我的榮幸;如果我們大家彼此再能多少有所受益和提高,更是朋友間的幸事。

盡職多年,累積偶成;常懷感恩之心,難忘良師益友。值此機(jī)會(huì),首先非常感謝ChinaUnix這么好的一個(gè)平臺(tái),為我為大家提供了這么好的一個(gè)機(jī)會(huì);也要感謝清華大學(xué)出版社,認(rèn)可并出版發(fā)行了這套叢書(shū);自然,也非常感謝在本書(shū)編著過(guò)程中,給予了各方面大力支持和協(xié)助的諸位新老同事朋友;衷心謝謝你們!

祝好,順祝商祺,
---戴冠平 敬呈
作者: 三人行必有吾師    時(shí)間: 2012-02-14 17:06
gilet 發(fā)表于 2012-02-14 15:33
回復(fù) 5# 無(wú)風(fēng)之谷


內(nèi)存溢出問(wèn)題屬于比較常見(jiàn),一般的OOM級(jí)別問(wèn)題還相對(duì)好處理一些,諸如Heap分配不夠,Permanent區(qū)不夠,對(duì)象泄漏,AIX上的內(nèi)存碎片等等;要是趕上類(lèi)似"Cannot create native thread"等本地內(nèi)存泄漏,會(huì)更頭疼一些,也需要對(duì)VM實(shí)現(xiàn)深入了解更多一些。
作者: clg1990    時(shí)間: 2012-02-14 17:25
進(jìn)來(lái)支持一下
作者: clg1990    時(shí)間: 2012-02-14 17:26
支持一個(gè)


        http://www.guilige.com
作者: imshunzi    時(shí)間: 2012-02-14 17:43
不錯(cuò),可以好好學(xué)習(xí)學(xué)習(xí)。
作者: 敘利亞    時(shí)間: 2012-02-14 20:34
本帖最后由 敘利亞 于 2012-02-14 21:40 編輯

終于看到您出書(shū)了,支持下
作者: 敘利亞    時(shí)間: 2012-02-14 20:37
本帖最后由 敘利亞 于 2012-02-14 21:44 編輯

回復(fù) 7# 三人行必有吾師


不好意思,貼子點(diǎn)擊發(fā)出了兩次
作者: tdy218    時(shí)間: 2012-02-14 21:35
一般般,而且內(nèi)容偏舊,尤其是WebLogic & Tuxedo,GG中甚至有點(diǎn)兒模棱兩可的東西,而且操作居多,又不是搞開(kāi)發(fā)的,就Oracle放出來(lái)一點(diǎn)兒東西(Oracle那幫做實(shí)施的也都是售前出身),都不懂底層的東西,嗨!
作者: 三人行必有吾師    時(shí)間: 2012-02-14 21:54
本帖最后由 三人行必有吾師 于 2012-02-14 21:55 編輯

回復(fù) 14# tdy218

謝謝并尊重您的意見(jiàn),正如本書(shū)后記所言:

"如果能拋磚引玉,帶給大家思路和啟迪,則足以欣慰。就象我們回溯歷史經(jīng)歷和切身之事時(shí), 經(jīng)常感覺(jué)自身的渺小. 就如同地球之比于宇宙,小得象太平洋上的一粒塵埃。而這個(gè)世界上,最接近永遠(yuǎn)不變的,恰恰是“變化”本身。隨著產(chǎn)品的更新,新技術(shù)的出現(xiàn),以及廠商之間的商業(yè)整合,很多具體的技術(shù)細(xì)節(jié)都會(huì)隨之而來(lái)發(fā)生變化,屆時(shí)也會(huì)跟隨有相應(yīng)的修訂;但其中涉及的基本概念和技術(shù)思路,卻是相通的;道為本,術(shù)為末,始能根深葉茂。"

其實(shí),雖然我自己十多年從事的都是售后工作,但對(duì)于那些售前工程師的條理表達(dá),良好Sense,以及對(duì)客戶(hù)潛在需求的高效定位和挖掘,還是一直心存敬佩;

堅(jiān)信咱們每個(gè)職業(yè)都會(huì)閃光,對(duì)吧?


   
作者: 佛利薩    時(shí)間: 2012-02-15 08:51
不錯(cuò)的活動(dòng),支持。
作者: yczhou8866    時(shí)間: 2012-02-15 08:55
支持
作者: 好小一只菜鳥(niǎo)    時(shí)間: 2012-02-15 09:28
還不錯(cuò)  關(guān)注一下  
作者: Mrbaifly    時(shí)間: 2012-02-15 09:35
很好,感謝戴老師為我們解答疑惑,大力支持一下!
作者: 冷翎月    時(shí)間: 2012-02-15 09:40
雖然那三本書(shū)還沒(méi)有仔細(xì)閱讀過(guò),也不好評(píng)價(jià)其好壞,但對(duì)新手來(lái)說(shuō)還是值得好好學(xué)習(xí)下的
作者: Mrbaifly    時(shí)間: 2012-02-15 09:46
很好,感謝戴老師為我們解答疑惑,大力支持一下!
作者: zhaopingzi    時(shí)間: 2012-02-15 09:51
請(qǐng)問(wèn)樓主OOM級(jí)別級(jí)別如何處理?
作者: dream0110    時(shí)間: 2012-02-15 09:52
好活動(dòng),支持!
作者: chenyx    時(shí)間: 2012-02-15 10:00
好活動(dòng),支持一下.對(duì)中間件不熟悉
作者: 三人行必有吾師    時(shí)間: 2012-02-15 10:26
回復(fù) 22# zhaopingzi

謝謝提問(wèn),這個(gè)問(wèn)題涵蓋的范圍有些大,所以在《WebLogic實(shí)戰(zhàn)》連續(xù)的第16/17/18章都是相關(guān)內(nèi)容。

總體而言,幾個(gè)注意要點(diǎn):
1. 最簡(jiǎn)單的,JVM本身開(kāi)的空間即不夠,可以調(diào)節(jié)起始值-Xms和最大值-Xmx;32位的經(jīng)常還需要調(diào)節(jié)操作系統(tǒng)參數(shù)才能將分配給JVM的內(nèi)存擴(kuò)上去;不過(guò)這里面有些雜七雜八的小技巧:
(1) 在一般的JDK實(shí)現(xiàn)中,在生產(chǎn)環(huán)境多將兩個(gè)值設(shè)成一樣以提高性能;
(2) 但在IBM的AIX生產(chǎn)環(huán)境下,反而需要設(shè)成不一樣來(lái)優(yōu)化內(nèi)存碎片,因?yàn)樗膶?shí)現(xiàn)不是基于標(biāo)準(zhǔn)的代的概念,而是P簇/K簇這樣的思路;
(3) 在HP的UX環(huán)境下,通常隨著這兩個(gè)參數(shù)不同,會(huì)自適應(yīng)觸發(fā)出不同的進(jìn)程模式,所謂q3p,q4p等,可用最大Heap空間大小是變動(dòng)的。

2. 另外,在大多數(shù)JDK實(shí)現(xiàn)中,一般會(huì)保留一個(gè)相關(guān)的各種Class的代碼段,通常所說(shuō)的Permanent區(qū)域,也可能是這個(gè)不夠;因?yàn)樗粎⑴c垃圾回收,所以需要給出足夠的空間;

3. 再者,由于JVM顧名思義,是虛擬機(jī),所以不會(huì)象硬件CPU一樣,有ALU,有AX/BX/PC等諸多寄存器和運(yùn)算器,所以其映射為一個(gè)個(gè)Frame幀來(lái)模擬,如果Frame鏈的空間不夠,多半會(huì)體現(xiàn)在堆棧溢出上;

4. 當(dāng)然,最常見(jiàn)的還是內(nèi)存泄漏,需要捕獲內(nèi)存鏡像(多次最好),比如JDK自帶的命令Jmap等,然后用工具分析,MAT/HA等,這個(gè)需要實(shí)際處理的經(jīng)驗(yàn),就象醫(yī)生看X光片一樣:
(1) 找內(nèi)存占用最大的幾個(gè)部分;
(2) 找內(nèi)存占用變化最大的幾個(gè)部分;

5. 還有比較隱藏比較深的,比如內(nèi)存碎片,雖然整個(gè)Heap的空余空間綽綽有余,但還是報(bào)內(nèi)存不夠,主要起因于空閑內(nèi)存空間不連續(xù),就象以前硬盤(pán)小做磁盤(pán)整理時(shí),星星點(diǎn)點(diǎn)的紅色區(qū)域無(wú)法移動(dòng)一樣;

6. 此外,象JMS/EJB等,或者應(yīng)用上,大規(guī)模的對(duì)象申請(qǐng)和占用,都會(huì)容易觸發(fā)該類(lèi)問(wèn)題,在GIS系統(tǒng),基于WLI/OSB的工作流和業(yè)務(wù)系統(tǒng)都容易碰到。

   
作者: Bacon_Lee    時(shí)間: 2012-02-15 13:34
好活動(dòng),支持啊~~
作者: jqm2009    時(shí)間: 2012-02-15 13:42
【常見(jiàn)的中間件調(diào)優(yōu)手段】
1、在什么情況下,我調(diào)整AdminServer的啟動(dòng)參數(shù)能夠達(dá)到性能優(yōu)化的目的?比如說(shuō),當(dāng)AdminServer管理的節(jié)點(diǎn)服務(wù)器數(shù)很多?要部署的應(yīng)用很大?
2、當(dāng)我在console中,對(duì)某個(gè)節(jié)點(diǎn)服務(wù)器執(zhí)行shutdown操作時(shí),節(jié)點(diǎn)遲遲不能被停掉,后臺(tái)log中會(huì)打出一些thread dump日志,這是什么原因?
3、我的環(huán)境是AdminServer通過(guò)node manager對(duì)節(jié)點(diǎn)服務(wù)器進(jìn)行管理,對(duì)應(yīng)后臺(tái)的.out為標(biāo)注輸出日志,如果節(jié)點(diǎn)服務(wù)器一直運(yùn)行,該.out日志會(huì)持續(xù)不斷增大,如何對(duì)weblogic的日志進(jìn)行優(yōu)化?


作者: 三人行必有吾師    時(shí)間: 2012-02-15 14:41
本帖最后由 三人行必有吾師 于 2012-02-15 15:03 編輯

回復(fù) 27# jqm2009

謝謝,這些在書(shū)中相關(guān)章節(jié)部分都有涉及。

總體來(lái)看,貴方應(yīng)該采用的是多個(gè)WebLogic實(shí)例組合工作的模式,而不是單實(shí)例Standalone(即就一個(gè)單Admin Server,并在其上部署所有應(yīng)用);這種情境下,業(yè)務(wù)主要跑在Managed Server上,Admin Server更偏向于管理功能和監(jiān)控接口。這時(shí),對(duì)于Admin Server調(diào)優(yōu)的目標(biāo)要很明確,不是按照常規(guī)網(wǎng)路上的文章,所謂優(yōu)化線(xiàn)程,優(yōu)化連接池等等;而是要去優(yōu)化各服務(wù)器間的通訊和同步,防止Admin Server和各個(gè)Managed Server之間的阻滯,以及各個(gè)實(shí)例間同步的消耗;以前在極端情況下,真實(shí)的大型客戶(hù)系統(tǒng),由于前面F5的分發(fā)紊亂,Sesssion來(lái)回復(fù)制和遷移,導(dǎo)致每個(gè)實(shí)例一半的CPU都耗在同步上了,整個(gè)系統(tǒng)響應(yīng)遲滯或不能正?焖俚侨;

可以:
(1) 給小的內(nèi)存和線(xiàn)程資源,避免過(guò)多的浪費(fèi)和內(nèi)耗,畢竟不怎么跑業(yè)務(wù);
(2) 采用Multicast,而不是Unicast,因?yàn)榫钟蚓W(wǎng)上Multicast充份利用了以太網(wǎng)總線(xiàn)機(jī)制載波監(jiān)聽(tīng)的特點(diǎn),一組數(shù)據(jù)單點(diǎn)發(fā)布,其余各節(jié)點(diǎn)并行收到(IGMP隧道技術(shù)暫不在此討論之列);用Unicast,其實(shí)就是個(gè)輪詢(xún),內(nèi)部寫(xiě)了個(gè)循環(huán),點(diǎn)對(duì)點(diǎn)挨個(gè)通訊一遍;
(3) 如果都在防火墻后,可以關(guān)閉Server之間的加密,比如t3s協(xié)議,比如Server間證書(shū)校驗(yàn);
(4) 所有可以?xún)?yōu)化RJVM通訊的地方;比如控制臺(tái)上關(guān)于協(xié)議那一頁(yè)的參數(shù);

還有,應(yīng)用大小,對(duì)于從Admin Server發(fā)布到Managed Server的Stage模式,的確是會(huì)比較敏感;如果有條件,可以用non-stage或external-stage,否則光系統(tǒng)啟動(dòng)就得半天,忙著拷數(shù)據(jù)啊。我記得以前有個(gè)大客戶(hù),用Portal門(mén)戶(hù),而且?guī)募蛨D片上載功能的,發(fā)現(xiàn)系統(tǒng)越跑越慢,一年后啟動(dòng)一次要半個(gè)小時(shí);結(jié)果一跟蹤一看,歷史圖片文件都上N多了,啟動(dòng)時(shí)一直不斷的從Admin Server在往Managed Server上發(fā)布呢

至于通過(guò)Node Manager,節(jié)點(diǎn)宕掉緩慢,一般有還在同步各Server間的狀態(tài),包括JNDI信息的;還有就是這個(gè)Managed Server自己運(yùn)行狀況出問(wèn)題了,我估計(jì)那個(gè)Thread Dump是一些異常堆棧吧?需要看到這個(gè),就比較明確了。一般而言,除非是主動(dòng)觸發(fā)了Thread Dump,或者內(nèi)存方面的問(wèn)題Managed Server掛掉了,JVM不會(huì)自己打出個(gè)完整的Thread Dump清單出來(lái)。如果真是down不下來(lái),而其日志里又有完整的Thread Dump,很多情況下這個(gè)Managed Server已經(jīng)提前掛了,而其中OOM的比率又比較高。

至于日志文件,看來(lái)不是指WebLogic自己的Server日志和Domain日志,那兩個(gè)可以調(diào)節(jié)滾動(dòng)機(jī)制的,比如按時(shí)間滾動(dòng),或者按大小滾動(dòng),保留多少個(gè),等等。。。也可以調(diào)整日志輸出級(jí)別來(lái)調(diào)整日志輸出量的大;應(yīng)該是指把標(biāo)準(zhǔn)錯(cuò)誤,標(biāo)準(zhǔn)輸出到文件的輸出日志,通常寫(xiě)法為"2>&1 1>xxx.out”,這個(gè)屬于操作系統(tǒng)層面管理的,比較好的做法是,寫(xiě)個(gè)腳本定時(shí)備份和清理即可,比較簡(jiǎn)單,用“>”清空;“>>”追加。
作者: jqm2009    時(shí)間: 2012-02-15 15:09
非常感謝您的解答。
我們的環(huán)境使用的是的JDK是jrockit-jdk1.6.0_20-R28.1.0-4.0.1,在啟動(dòng)腳本中是這樣配置的MEM_ARGS="-Xms4096M -Xmx4096M -Xgc:gencon -Xns512M " ,不知道您推薦的怎樣的參數(shù)配置?
作者: 三人行必有吾師    時(shí)間: 2012-02-15 15:58
本帖最后由 三人行必有吾師 于 2012-02-15 16:04 編輯

回復(fù) 29# jqm2009

您好:謝謝!

如果僅就內(nèi)存參數(shù)的討論范圍而言,這個(gè)值用在一個(gè)Managed Server上可能是合適的,但如果用在一個(gè)沒(méi)有部署什么應(yīng)用的Admin Server上就實(shí)在是浪費(fèi)了。。。因?yàn)槟切﹨?shù)里指定了初始最小和最大的Heap相等是4G;用了普通的分代并行算法,Nursery大小為512兆(其實(shí)就是Young區(qū));

如果是個(gè)單純干凈的Admin Server,給1G甚至更小就足夠了,即-Xms1024M, -Xmx1024M

   
作者: 酸意上心頭    時(shí)間: 2012-02-15 16:13
路過(guò),看貼!
作者: 委內(nèi)瑞拉    時(shí)間: 2012-02-15 16:14
活動(dòng)不錯(cuò),可以學(xué)到很多知識(shí)支持一下~~
作者: masymsn    時(shí)間: 2012-02-15 18:06
好東西~~支持支持~
作者: heizhiya    時(shí)間: 2012-02-15 18:29
頂一個(gè)
作者: heizhiya    時(shí)間: 2012-02-15 18:30
游戲說(shuō)里有最新所有游戲的開(kāi)服信息? http://new.youxishuo.com
作者: heizhiya    時(shí)間: 2012-02-15 18:34
頂一個(gè)
作者: heizhiya    時(shí)間: 2012-02-15 18:35
頂一個(gè)
作者: InfoSVC    時(shí)間: 2012-02-15 18:59
先支持一下
在學(xué)習(xí)一下
作者: 敘利亞    時(shí)間: 2012-02-15 21:13
本帖最后由 敘利亞 于 2012-02-15 21:23 編輯

回復(fù) 14# tdy218

不好意思,發(fā)重復(fù)了
作者: 敘利亞    時(shí)間: 2012-02-15 21:18
本帖最后由 敘利亞 于 2012-02-15 21:19 編輯
tdy218 發(fā)表于 2012-02-14 21:35
一般般,而且內(nèi)容偏舊,尤其是WebLogic & Tuxedo,GG中甚至有點(diǎn)兒模棱兩可的東西,而且操作居多,又不是搞開(kāi) ...



嗨,這位大蝦,我對(duì)Weblogic方面一直都比較關(guān)注,可惜現(xiàn)在各個(gè)渠道都還無(wú)法買(mǎi)到Weblogic這本書(shū)一睹,只能先看到另外兩本,請(qǐng)問(wèn)您是從哪里買(mǎi)到這本書(shū)的,分享下?能做到先讀為快,羨慕呀    
作者: tdy218    時(shí)間: 2012-02-15 22:55
回復(fù) 40# 敘利亞


    網(wǎng)上不是貼出來(lái)幾頁(yè)嘛,別買(mǎi)中文的了,直接買(mǎi)英文的;蛘吒纱嗑涂磂-docs + weblogic.jar中的源代碼。
作者: 敘利亞    時(shí)間: 2012-02-15 23:53
回復(fù) 41# tdy218


    哦,我以為您已經(jīng)看到過(guò)了,英文+原代碼就算了,要我有那水平早出國(guó)混去了。我還是再等等吧,買(mǎi)個(gè)中文的 :em39b:
作者: Shell_HAT    時(shí)間: 2012-02-16 09:30
FAQ: OutOfMemory in WebLogic

From time to time I see questions like this:

Q: "We are seeing OutOfMemory error in the WebLogic log, after that our app becomes inaccessible. The application is not under heavy load. In fact, we can see it even if the server is idle. WebLogic performance console shows that there is plenty of heap available. What's wrong?".

A: Given the symptoms above, the most likely cause of the problem is that the default size of the heap allocated by JVM for long living objects is often too small for a J2EE application is general and for one under WebLogic in particular. Weblogic uses caching a lot, so if you've got many EJBs, there will be plenty of long living object, and they may not fit into perm heap.

To fix this problem, you need to increase MaxPermSize JVM parameter. Go to WebLogic startup script and add -XMaxPermSize=64m or -XMaxPermSize=128m to JVM startup parameters. If you don't have an application memory leak, this change should take care about the problem.

Q: But how do I know if it's not an app memory leak?

A: The first symptom of the app memory leak is that in addition to OutOfMemory, you will see that the memory graph in WebLogic performance console hits the top, and forcing GC doesn't change anything. Fixing this problem is relatively easy. Get a good profiler tool, like OptimizeIt of JProfiler, and run a load test while memory profiling is enabled. Set up a filter to see only your classes and fined ones taking most of memory. It's likely that the same objects will have largest instance counts.

Tips for setting up a profiler.

First, set the JVM memory to as minimum as possible. If you expect WebLogic to run with 1Gb of JVM heap, set it to much lower values at which app can run. It can be 32M, 64M, depending on the app. Is sounds odd, but the reason is that the memory profiler catches JVM GC activities, and as there will be much more object in 1GB than in 64Mb, that GC under profiler will be dead slow, it can be hours, virtually. Set memory to as low as possible.

Second, turn off anything except the memory profiling. Memory profiling itself is slow, so you will want yo avoid any additional overhead in this case. Performance profiling is to be turned off in any case.
作者: 三人行必有吾師    時(shí)間: 2012-02-16 09:35
樓上各位朋友好,非常感謝大家的光臨,一并謝過(guò)。

關(guān)于書(shū),我這廂已經(jīng)和出版社聯(lián)系確認(rèn)過(guò),本套三本均已公開(kāi)發(fā)行;因?yàn)榱魍〞r(shí)有自己的流程和周期,上架的時(shí)候的確會(huì)有快慢,但無(wú)論如何,近日應(yīng)該是都能展列并被大家搜到見(jiàn)到購(gòu)到。

再次誠(chéng)懇感謝給予我支持的各位新老朋友!
作者: Shell_HAT    時(shí)間: 2012-02-16 10:22
以前做WebSphere的一些經(jīng)驗(yàn):

遇到比較多的問(wèn)題是OOM和high CPU,除此之外還有很多其它問(wèn)題,IBM官方網(wǎng)站把它們分類(lèi)整理了一下:
http://www-01.ibm.com/support/docview.wss?uid=swg21145599

以O(shè)OM為例,一般的分析問(wèn)題步驟是這樣的:
http://www-01.ibm.com/support/docview.wss?uid=swg21145349

1、增大 Maximum Java Heap Value (-Xmx)

2、啟用 Verbose GC,由于使用的JDK不同,在Solaris和HP-UX上還需要一些特別的參數(shù)設(shè)置,詳見(jiàn):
http://www-01.ibm.com/support/docview.wss?uid=swg21114927

3、增加 MaxPermSize 和 MaxNewSize,把它們分別設(shè)為 max heap 的四分之一

4、用IBM提供的腳本runISALite.sh收集日志

注:步驟1~3也是性能調(diào)優(yōu)的重要部分,IBM的技術(shù)支持團(tuán)隊(duì)通常會(huì)建議客戶(hù)進(jìn)行這些設(shè)置。

http://blog.chinaunix.net/uid-17176286-id-3074364.html
作者: 三人行必有吾師    時(shí)間: 2012-02-16 10:33
回復(fù) 45# Shell_HAT

謝謝您,分享IBM WebSphere上的經(jīng)驗(yàn)和資料


   
作者: zorrohu    時(shí)間: 2012-02-16 11:07
好活動(dòng),支持

weblogic內(nèi)存溢出時(shí),觀察GC也是一種手段,但大型企業(yè)都未配置-verbose:gc,調(diào)優(yōu)時(shí)可以作為參考
作者: unknsnow    時(shí)間: 2012-02-16 11:21
這個(gè)好,路過(guò)此地,學(xué)習(xí)學(xué)習(xí)。
作者: Shell_HAT    時(shí)間: 2012-02-16 11:26
回復(fù) 47# zorrohu


大型應(yīng)用里面如果開(kāi)啟VerboseGC,日志長(zhǎng)的太快了,一個(gè)小時(shí)就是幾G、幾十G,所以一般只在出現(xiàn)問(wèn)題需要分析的時(shí)候才開(kāi)啟。
作者: 好小一只菜鳥(niǎo)    時(shí)間: 2012-02-16 12:18
雖然沒(méi)學(xué)過(guò)  但是這個(gè)東西還是先關(guān)注一下  萬(wàn)一以后用的著呢
昨天去書(shū)店看了一下  確實(shí)還沒(méi)有看到weblogic這本書(shū)
作者: tdy218    時(shí)間: 2012-02-16 20:56
Shell_HAT 發(fā)表于 2012-02-16 11:26
回復(fù) 47# zorrohu


1個(gè)小時(shí)幾G?  {:2_167:}

暈子一個(gè)
作者: manULinux    時(shí)間: 2012-02-17 21:40
本帖最后由 manULinux 于 2012-02-17 21:41 編輯

干了快3年了一值是前后臺(tái) 文檔一條龍。呵呵。
作者: renxiao2003    時(shí)間: 2012-02-17 21:54
1、WebLogic內(nèi)存溢出專(zhuān)題探討

Weblogic內(nèi)存遺漏,不外乎也就兩種情況,一種是虛擬機(jī)內(nèi)存參數(shù)設(shè)置不合理,造成Weblogic運(yùn)行一段時(shí)候后內(nèi)存分配不足,而造成內(nèi)存遺漏的發(fā)生;第二種情況不外乎就是我們的程序?qū)懙牟缓,分配的?nèi)存沒(méi)有及時(shí)的釋放而造成內(nèi)存泄漏情況的發(fā)生。
關(guān)于內(nèi)存泄漏問(wèn)題,我們一般會(huì)從應(yīng)用程序出發(fā),去審核代碼,做到代碼級(jí)的優(yōu)化,然后再調(diào)整應(yīng)用服務(wù)器(BEA WebLogic8.1)和數(shù)據(jù)庫(kù) (Oracle9i)的參數(shù),最后當(dāng)然是調(diào)整操作系統(tǒng)和網(wǎng)絡(luò)的性能(包括硬件升級(jí))。這是一種MDA的先進(jìn)做法。
2、Goldengate數(shù)據(jù)遷移注意事項(xiàng)及常見(jiàn)問(wèn)題

這個(gè)我沒(méi)有做過(guò),暫時(shí)不知道。
3、Tuxedo中IPC相關(guān)故障探討

1. 非圖形界面下的安裝
./tuxedo81_aix_32bit.bin -i console 加入 -i console則不需要圖形支持

2.察看版本和patch信息
$TUXDIR/bin/tmadmin -v

3.對(duì)ubb文件只做語(yǔ)法檢查(不真正的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文件被誤刪除而無(wú)法shutdown TUXEDO服務(wù)時(shí),可以嘗試直接刪除當(dāng)前用戶(hù)的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 比較簡(jiǎn)單的設(shè)置TUXCONFIG的命令

8.Tuxedo非正常狀態(tài)下的關(guān)閉
1) 執(zhí)行tmshutdown -y,如果shutdown不成功,轉(zhuǎn)入下一步(此時(shí)一般來(lái)說(shuō),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)常來(lái)一個(gè)killall -9,將該用戶(hù)所有的進(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ā)請(qǐng)求數(shù),
"-M" * "-x" = MAXWSCLIENTS;
-I, 客戶(hù)端與服務(wù)器端建立連接的超時(shí)時(shí)間;
-N, 客戶(hù)端發(fā)起請(qǐng)求的響應(yīng)超時(shí)時(shí)間;
-T, 客戶(hù)端在與服務(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%


4、常見(jiàn)的中間件調(diào)優(yōu)手段

2.1 JVM調(diào)優(yōu)
2.1.1 垃圾收集和堆大小
  垃圾收集(GC)是指JVM釋放Java堆中不再使用的對(duì)象所占用的內(nèi)存的過(guò)程,而Java堆(Heap)是指Java應(yīng)用程序?qū)ο笊娴目臻g。堆大小決定了GC的頻度和時(shí)間。堆越大,GC頻度低,速度慢。堆越小,GC頻度高,速度快。所以GC和堆大小是一組矛盾。為了獲取理想的Heap堆大小,需要使用-verbosegc參數(shù)(Sun jdk: -Xloggc:<file>)以打開(kāi)詳細(xì)的GC輸出。分析GC的頻度和時(shí)間,結(jié)合應(yīng)用最大負(fù)載所需內(nèi)存情況,得出堆的大小。
通常情況下,我們建議使用可用內(nèi)存(除操作系統(tǒng)和其他應(yīng)用程序占用之外的內(nèi)存)70-80%,為避免堆大小調(diào)整引起的開(kāi)銷(xiā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ù)。對(duì)于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)情況下打開(kāi)JIT編譯模式對(duì)性能也有幫助。調(diào)整Chunk Size和Chunk Pool Size也可能對(duì)系統(tǒng)的吞吐量有提高。此外還需關(guān)閉顯示GC: -XX:+DisableExplicitGC。

  當(dāng)然在Intel平臺(tái)上使用jRockit(使用參數(shù)-jrockit)無(wú)疑大大提高WebLogic性能。

2.1.2 jRockit調(diào)優(yōu)
  jRockit支持四種垃圾收集器:分代復(fù)制收集器、單空間并發(fā)收集器、分代并發(fā)收集器和并行收集器。默認(rèn)狀態(tài)下,JRockit使用分代并發(fā)收集器。要改變收集器,可使用-Xgc:<gc-name>,對(duì)應(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。

  如果你的線(xiàn)程大于100或者在linux平臺(tái)下,可以嘗試使用瘦線(xiàn)程模式:-Xthinthread,同時(shí)關(guān)閉Native IO:-Xallocationtype:global。

  jRockit 還提供了強(qiáng)大的圖形化監(jiān)控工具Jrockit Management Console。欲詳細(xì)了解JRockit可訪問(wèn):http://edocs.bea.com/wljrockit/docs81/index.html。




2.2 Server調(diào)優(yōu)
  WebLogic Server的核心組件由監(jiān)聽(tīng)線(xiàn)程,套接字復(fù)用器和可執(zhí)行線(xiàn)程的執(zhí)行隊(duì)列組成。當(dāng)服務(wù)器由監(jiān)聽(tīng)線(xiàn)程接收到連接請(qǐng)求后,將對(duì)它的連接控制權(quán)交給等待接收請(qǐng)求的套接字復(fù)用器。然后套接字復(fù)用器讀取離開(kāi)套接字的請(qǐng)求,并將此請(qǐng)求及相關(guān)安全信息或事務(wù)處理環(huán)境一起置入適當(dāng)?shù)膱?zhí)行隊(duì)列中(一般為默認(rèn)的執(zhí)行隊(duì)列)。 當(dāng)有一個(gè)請(qǐng)求出現(xiàn)在執(zhí)行隊(duì)列中時(shí),就會(huì)有一個(gè)空閑的執(zhí)行線(xiàn)程從該隊(duì)列中取走發(fā)來(lái)的該請(qǐng)求,并返回應(yīng)答,然后等待下一次請(qǐng)求。因此要提高WebLogic的性能,就必須從調(diào)整核心組件性能出發(fā)。

2.2.1 盡量使用本地I/O庫(kù)
WebLogic Server有兩套套接字復(fù)用器:Java版和本地庫(kù)。采用小型本地庫(kù)更有效,盡量激活Enable Native IO(默認(rèn)),此時(shí)UNIX默認(rèn)使用CPUs+1個(gè)線(xiàn)程,Window下為雙倍CPU。如果系統(tǒng)不能加載本地庫(kù),將會(huì)拋出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í)行線(xiàn)程數(shù)
  理想的默認(rèn)執(zhí)行線(xiàn)程數(shù)是由多方面的因素決定的,比如機(jī)器CPU性能、總線(xiàn)體系架構(gòu)、I/O、操作系統(tǒng)的進(jìn)程調(diào)度機(jī)制、JVM的線(xiàn)程調(diào)度機(jī)制。WebLogic生產(chǎn)環(huán)境下默認(rèn)的線(xiàn)程為25個(gè),隨著CPU個(gè)數(shù)的增加,WebLogic可以近乎線(xiàn)性地提高線(xiàn)程數(shù)。線(xiàn)程數(shù)越多,花費(fèi)在線(xiàn)程切換的時(shí)間也就越多,線(xiàn)程數(shù)越小,CPU可能無(wú)法得到充分利用。為獲取一個(gè)理想的線(xiàn)程數(shù),需要經(jīng)過(guò)反復(fù)的測(cè)試。在測(cè)試中,可以以25*CPUs為基準(zhǔn)進(jìn)行調(diào)整。當(dāng)空閑線(xiàn)程較少,CPU利用率比較低時(shí),可以適當(dāng)增加線(xiàn)程數(shù)的大小(每五個(gè)遞增)。對(duì)于PC Server 和Window 2000,則最好每個(gè)CPU小于50個(gè)線(xiàn)程, 以CPU利用率為90%左右為佳。由于目前WebLogic執(zhí)行線(xiàn)程沒(méi)有縮小線(xiàn)程數(shù)的功能,所以應(yīng)將參數(shù)Threads Increase設(shè)置為0,同時(shí)不應(yīng)改變優(yōu)先級(jí)的大小。

2.2.3 調(diào)整連接參數(shù)
  WebLogic Server用Accept Backlog參數(shù)規(guī)定服務(wù)器向操作系統(tǒng)請(qǐng)求的隊(duì)列大小,默認(rèn)值為50。當(dāng)系統(tǒng)重載負(fù)荷時(shí),這個(gè)值可能過(guò)小,日志中報(bào)Connection Refused,導(dǎo)致有效連接請(qǐng)求遭到拒絕,此時(shí)可以提高Accept Backlog 25%直到連接拒絕錯(cuò)誤消失。對(duì)于Portal類(lèi)型的應(yīng)用,默認(rèn)值往往是不夠的。Login Timeout和SSL Login Timeout參數(shù)表示普通連接和SSL連接的超時(shí)時(shí)間,如果客戶(hù)連接被服務(wù)器中斷或者SSL容量大,可以嘗試增加該值。這些參數(shù)可以在Console Server Tuning Configration配置欄里找到。

2.2.4 創(chuàng)建新的執(zhí)行隊(duì)列
  創(chuàng)建新的執(zhí)行隊(duì)列有助于解決核心業(yè)務(wù)優(yōu)先、避免交叉阻塞、死鎖和長(zhǎng)時(shí)間處理的業(yè)務(wù)等問(wèn)題。通常會(huì)將自己的執(zhí)行隊(duì)列和默認(rèn)的執(zhí)行隊(duì)列設(shè)置不同的優(yōu)先級(jí),這里優(yōu)先級(jí)不應(yīng)設(shè)為9或者10。 定義一個(gè)新的執(zhí)行隊(duì)列很容易,利用View Excute Queue選項(xiàng)中的Configure a new Excute Queue鏈接即可定制新的執(zhí)行隊(duì)列。創(chuàng)建新的執(zhí)行隊(duì)列后,用戶(hù)需要為應(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ì)列。對(duì)于執(zhí)行時(shí)間比較長(zhǎng)的MDB,建議使用自己的執(zhí)行隊(duì)列。

2.3 JDBC調(diào)優(yōu)
2.3.1 調(diào)整連接池配置
  JDBC Connection Pool的調(diào)優(yōu)受制于WebLogic Server線(xiàn)程數(shù)的設(shè)置和數(shù)據(jù)庫(kù)進(jìn)程數(shù),游標(biāo)的大小。通常我們?cè)谝粋(gè)線(xiàn)程中使用一個(gè)連接,所以連接數(shù)并不是越多越好,為避免兩邊的資源消耗,建議設(shè)置連接池的最大值等于或者略小于線(xiàn)程數(shù)。同時(shí)為了減少新建連接的開(kāi)銷(xiāo),將最小值和最大值設(shè)為一致。

  增加Statement Cache Size對(duì)于大量使用PreparedStatement對(duì)象的應(yīng)用程序很有幫助,WebLogic能夠?yàn)槊恳粋(gè)連接緩存這些對(duì)象,此值默認(rèn)為10。在保證數(shù)據(jù)庫(kù)游標(biāo)大小足夠的前提下,可以根據(jù)需要提高Statement Cache Size。比如當(dāng)你設(shè)置連接數(shù)為25,Cache Size為10時(shí),數(shù)據(jù)庫(kù)可能需要打開(kāi)25*10=250個(gè)游標(biāo)。不幸的是,當(dāng)遇到與PreparedStatement Cache有關(guān)的應(yīng)用程序錯(cuò)誤時(shí),你需要將Cache Size設(shè)置為0。

  盡管JDBC Connection Pool提供了很多高級(jí)參數(shù),在開(kāi)發(fā)模式下比較有用,但大部分在生產(chǎn)環(huán)境下不需調(diào)整。這里建議最好不要設(shè)置測(cè)試表, 同時(shí)Test Reserved Connections和Test Released Connections也無(wú)需勾上。 當(dāng)然如果你的數(shù)據(jù)庫(kù)不穩(wěn)定,時(shí)斷時(shí)續(xù),你就可能需要上述的參數(shù)打開(kāi)。

  最后提一下驅(qū)動(dòng)程序類(lèi)型的選擇,以O(shè)racle為例,Oracle提供thin驅(qū)動(dòng)和oci驅(qū)動(dòng),從性能上來(lái)講,oci驅(qū)動(dòng)強(qiáng)于thin驅(qū)動(dòng),特別是大數(shù)據(jù)量的操作。但在簡(jiǎn)單的數(shù)據(jù)庫(kù)操作中,性能相差不大,隨著thin驅(qū)動(dòng)的不斷改進(jìn),這一弱勢(shì)將得到彌補(bǔ)。而thin驅(qū)動(dòng)的移植性明顯強(qiáng)于oci驅(qū)動(dòng)。所以在通常情況下建議使用thin驅(qū)動(dòng)。而最新驅(qū)動(dòng)器由于WebLogic server/bin目錄下的類(lèi)包可能不是最新的,請(qǐng)以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)比較簡(jiǎn)單,僅僅是對(duì)一些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)境下無(wú)需檢查Jsp和servlet:JSPPage Check Secs和Servlet Reload Check Secs均設(shè)為-1,關(guān)閉JSPKeep Generated 和JSPVerbose對(duì)性能也有幫助。此外,還可以對(duì)jsp進(jìn)行預(yù)編譯,有兩種方法:激活precompile選項(xiàng);使用weblogic.appc事先編譯,建議采用后者。

2.5 JMS調(diào)優(yōu)
  1. 增加-Dweblogic.JMSThreadPoolSize=n(至少為5),以提高處理JMS的線(xiàn)程數(shù),在jRockit上增加-XXenablefatspin以減少加鎖沖突;
  2. 采用文件存儲(chǔ)策略,將同步寫(xiě)策略設(shè)置為Direct-Write,同時(shí)在windows平臺(tái)上啟用磁盤(pán)寫(xiě)入緩存;
  3. 使用分布式目的地時(shí),激活連接工廠Load Balancing Enabled ,Server Affinity Enabled;
  4. 為減少服務(wù)器不必要的JMS請(qǐng)求路由,如果多個(gè)目的地之間存在事務(wù),則部署在同一JMS服務(wù)器上,盡量將連接工廠部署到JMS服務(wù)器所在的WebLogic實(shí)例上,集群環(huán)境下,則最好將連接工廠部署到集群中的所有服務(wù)器上,而集群中每個(gè)JMS服務(wù)器和目的地成員盡量使用類(lèi)似的設(shè)置;
  5. 啟用消息分頁(yè)存儲(chǔ)功能,以釋放內(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)掃描過(guò)期消息;
  8. 使用FIFO或者LIFO方式處理目的地消息;
  9. MDB的max-beans-in-free-pool不應(yīng)大于最大MDB線(xiàn)程數(shù)(默認(rèn)線(xià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對(duì)SLSB來(lái)說(shuō),在頻繁創(chuàng)建和刪除實(shí)例的情況下很有幫助,一般不用調(diào)整,至少設(shè)為默認(rèn)線(xiàn)程數(shù),過(guò)大容易造成內(nèi)存溢出。而對(duì)Entity Bean來(lái)說(shuō),由于是匿名的,所以當(dāng)頻繁使用finder、home和create方法時(shí)可以調(diào)大。

  對(duì)SFSB來(lái)說(shuō),盡量將max-beans-in-cache參數(shù)設(shè)置得足夠的大,以滿(mǎn)足Bean實(shí)例對(duì)最大并發(fā)用戶(hù)數(shù)的要求,可以避免有狀態(tài)會(huì)話(huà)Bean過(guò)多的鈍化行為。而idle-timeout-seconds盡量設(shè)置小,如果SFSB不用于存儲(chǔ)Web應(yīng)用會(huì)話(huà)狀態(tài)可以設(shè)置為0。

  對(duì)于Entity Bean來(lái)說(shuō), max-beans-in-cache同樣可以首先采用默認(rèn)值1000,監(jiān)控實(shí)例緩存和鈍化的情況,再做適當(dāng)調(diào)整。

  并行策略concurrency-strategy定義了實(shí)體Bean如何管理鎖,有四種策略: Exclusive、Databse、ReadOnly、Optimistic。效率依次提高,可靠性依次降低,盡量避免使用互斥策略,如果Bean無(wú)需更新操作,使用只讀策略,更甚的是,如果Bean的內(nèi)容不會(huì)改變,可設(shè)置read-timeout-seconds為0,樂(lè)觀并行策略時(shí)采用事務(wù)間緩存策略,在entity-cache描述符中將cache-between-transactions元素設(shè)為true。

2.6.2 優(yōu)化事務(wù)隔離級(jí)別和事務(wù)屬性
  對(duì)EJB組件來(lái)說(shuō),有四種事務(wù)隔離水平:

TRANSACTION-SERIALIZABLE:在處理完成之前拒絕其他處理的讀入、可擴(kuò)展性或插入數(shù)據(jù)操作;
TRANSACTION-REPEATABLE-READ:防止處理修改正在被其他處理調(diào)用的數(shù)據(jù);
TRANSACTOIN-READ-COMMITTED:防止對(duì)正在被其他處理修改的數(shù)據(jù)執(zhí)行寫(xiě)鎖定;
TRANSACTION-READ-UNCOMMITTED:允許處理讀入未受權(quán)的數(shù)據(jù)以及允許在向結(jié)果中添加記錄時(shí)可以忽略處理。
   以上隔離水平依次降低,效率和性能依次提高。因此,建議選用滿(mǎn)足在業(yè)務(wù)數(shù)據(jù)完整性要求前提下水平最低的隔離級(jí)別。

  對(duì)于事務(wù)屬性的設(shè)置也是如此,對(duì)于刪除、修改和插入操作設(shè)置為Required,而對(duì)于只讀操作設(shè)置為Supports或者NotSupports。

2.6.3 其他一些小技巧
  1. 利用finders-load-bean的默認(rèn)值true,既可以避免“n+1”的查詢(xún)問(wèn)題,又可以提高系統(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ù)。



作者: manULinux    時(shí)間: 2012-02-17 22:14
4、常見(jiàn)的中間件調(diào)優(yōu)手段
談?wù)勥@個(gè)吧 。
基本上是
1 log 輸入 tail -f 看文件日志。
2 調(diào)用 cl32 調(diào)用tuxedo  程序。
3 觀察日志。與返回結(jié)果。
1)如果程序core  使用file core 可以看到是哪個(gè)程序產(chǎn)生的core 文件,如果是你當(dāng)前的程序
那么直接
$>gdb -o core
gdb> where
看堆棧情況。觀察哪個(gè)地方出現(xiàn)文件。  
2)如果是調(diào)用SQL 報(bào)錯(cuò)基本上輸入會(huì)加上 SQLCODE 打印, SQL是否出現(xiàn)問(wèn)題。哪行打印的可以使用log4c
如果是可以使用
$>oerr ora  ( SQLCODE值)
查看什么原因?qū)е碌腟QL問(wèn)題。
4 程序邏輯問(wèn)題當(dāng)然這個(gè)跟具體的業(yè)務(wù)要求了。 修改文件 保存,編譯,返回第2步驟 LOOP(直到業(yè)務(wù)邏輯正確,程序運(yùn)行正常,可以寫(xiě)測(cè)試報(bào)告了呵呵。)

注意:
善用 輸出信息
1 必要的輸入是要有的。 關(guān)鍵是如果你的程序部署到生產(chǎn)上,用戶(hù)投訴讓你查個(gè)問(wèn)題。你找不到錯(cuò)誤輸出信息。那完了。
2 不要加過(guò)多的輸出,弄的幾乎把每個(gè)步驟都打印出來(lái)。 多大的空間能夠呀。有些業(yè)務(wù)幾乎是沒(méi)秒10多個(gè)進(jìn)來(lái)在加那么多沒(méi)有必要的東西。查個(gè)問(wèn)題的多費(fèi)勁呀。當(dāng)然調(diào)試GDB是不太好用的可以詳細(xì)加輸出,但調(diào)試完通過(guò)后請(qǐng)讓你的程序干凈些。
可讀性
公司一般會(huì)要求編碼格式,不過(guò)基本上是Ctrl+c Ctrl+v  改改就完了。 有的連自己為什么這么寫(xiě)都不清楚,以后別人維護(hù)起來(lái)你讓不讓人活了。(有點(diǎn)個(gè)人情緒。沒(méi)辦法。來(lái)氣。受害者。) 試過(guò)各類(lèi)的格式工具對(duì)tuxedo 的支持都不是很理想。一直想寫(xiě)個(gè)工具,對(duì)tuxedo 和jsp 想這些特殊的程序 進(jìn)行格式化優(yōu)化工具。(還在完善中......)。
性能
1 SQL  SQL直接行影響 tuxedo 程序能能,主鍵,索引, exists ,  類(lèi)型,等等,各個(gè)方面影響 程序的性能。說(shuō)以寫(xiě)好tuxedo 程序首先的寫(xiě)好SQL。
2 就是C語(yǔ)言的編程能力, 變量初始化。 避免溢出,程序core 掉。 多余的變量去掉。
使用DECODE函數(shù)來(lái)減少處理時(shí)間
        使用DECODE函數(shù)可以避免重復(fù)掃描相同記錄或重復(fù)連接相同的表.
        示例:
        SELECT COUNT(*),SUM(SAL)
        FROM EMP
        WHERE DEPT_NO = 0020
        AND ENAME LIKE ‘SMITH%';
       
        SELECT COUNT(*),SUM(SAL)
        FROM EMP
        WHERE DEPT_NO = 0030
        AND ENAME LIKE ‘SMITH%';
       
        可以用DECODE函數(shù)高效地得到相同結(jié)果
        SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,
        COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,
        SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
        SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
        FROM EMP
        WHERE ENAME LIKE ‘SMITH%';
       
        類(lèi)似的,DECODE函數(shù)也可以運(yùn)用于GROUP BY 和ORDER BY子句中
建議用UNION替換OR (適用于索引列)
        通常情況下, 用UNION替換WHERE子句中的OR將會(huì)起到較好的效果. 對(duì)索引列使用OR將造成全表掃描. 注意, 以上規(guī)則只針對(duì)多個(gè)索引列有效. 如果有column沒(méi)有被索引, 查詢(xún)效率可能會(huì)因?yàn)槟銢](méi)有選擇OR而降低.
        在下面的例子中, LOC_ID 和REGION上都建有索引.
高效:
        SELECT LOC_ID , LOC_DESC , REGION
        FROM LOCATION
        WHERE LOC_ID = 10
        UNION
        SELECT LOC_ID , LOC_DESC , REGION
        FROM LOCATION
        WHERE REGION = “MELBOURNE”
       
低效:
        SELECT LOC_ID , LOC_DESC , REGION
        FROM LOCATION
        WHERE LOC_ID = 10 OR REGION = “MELBOURNE”
        注意:
        WHERE KEY1 = 10 (返回最少記錄)
        OR KEY2 = 20 (返回最多記錄)
        ORACLE 內(nèi)部將以上轉(zhuǎn)換為
        WHERE KEY1 = 10 AND
        ((NOT KEY1 = 10) AND KEY2 = 20)
建議 如何刪除重復(fù)記錄
        高效的刪除重復(fù)記錄方法 (因?yàn)槭褂昧薘OWID)
        DELETE FROM EMP E
        WHERE E.ROWID > (SELECT MIN(X.ROWID)
        FROM EMP X
        WHERE X.EMP_NO = E.EMP_NO);
建議 用TRUNCATE替代DELETE全表
        當(dāng)刪除表中的所有記錄時(shí),如果不需要恢復(fù),建議使用TRUNCATE而不是DELETE ALL,既不占用回滾段,也能加快速度。
建議 多使用COMMIT
        在程序中盡量避免特大事務(wù),多使用COMMIT, 這樣程序的性能得到提高,也會(huì)因?yàn)镃OMMIT所釋放的資源而減少。
        當(dāng)然要注意,COMMIT次數(shù)也不能太頻繁,頻繁同樣會(huì)增加數(shù)據(jù)庫(kù)負(fù)擔(dān)。
建議 用Where子句替換HAVING子句
        避免使用HAVING子句, HAVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾. 這個(gè)處理需要排序,總計(jì)等操作. 如果能通過(guò)WHERE子句限制記錄的數(shù)目,那就能減少這方面的開(kāi)銷(xiāo).
        示例:
低效:
        SELECT REGION,AVG(LOG_SIZE)
        FROM LOCATION
        GROUP BY REGION
        HAVING REGION != ‘SYDNEY'
        AND REGION != ‘PERTH'
       
高效:
        SELECT REGION,AVG(LOG_SIZE)
        FROM LOCATION
        WHERE REGION != ‘SYDNEY'
        AND REGION != ‘PERTH'
        GROUP BY REGION
建議 用EXISTS替代IN
        在許多基于基礎(chǔ)表的查詢(xún)中,為了滿(mǎn)足一個(gè)條件,往往需要對(duì)另一個(gè)表進(jìn)行聯(lián)接.在這種情況下, 使用EXISTS(或NOT EXISTS)通常將提高查詢(xún)的效率.
        示例:
低效:
        SELECT *
        FROM EMP (基礎(chǔ)表)
        WHERE EMPNO > 0
        AND DEPTNO IN (SELECT DEPTNO
        FROM DEPT
        WHERE LOC = ‘MELB')
       
高效:
        SELECT *
        FROM EMP (基礎(chǔ)表)
        WHERE EMPNO > 0
        AND EXISTS (SELECT ‘X'
        FROM DEPT
        WHERE DEPT.DEPTNO = EMP.DEPTNO
        AND LOC = ‘MELB')
建議 用NOT EXISTS替代NOT IN
        無(wú)論在哪種情況下,NOT IN都是最低效的 (因?yàn)樗鼘?duì)子查詢(xún)中的表執(zhí)行了一個(gè)全表遍歷).可以把它改寫(xiě)成外連接(Outer Joins)或NOT EXISTS.
        示例:
        SELECT …
        FROM EMP
        WHERE DEPT_NO NOT IN (SELECT DEPT_NO
        FROM DEPT
        WHERE DEPT_CAT='A');
(方法一: 高效)
        SELECT ….
        FROM EMP A,DEPT B
        WHERE A.DEPT_NO = B.DEPT(+)
        AND B.DEPT_NO IS NULL
        AND B.DEPT_CAT(+) = ‘A'
       
(方法二: 最高效)
        SELECT ….
        FROM EMP E
        WHERE NOT EXISTS (SELECT ‘X'
        FROM DEPT D
        WHERE D.DEPT_NO = E.DEPT_NO
        AND DEPT_CAT = ‘A');
建議 用表連接替換EXISTS
        通常來(lái)說(shuō) , 采用表連接的方式比EXISTS更有效率。
        SELECT ENAME
        FROM EMP E
        WHERE EXISTS (SELECT ‘X'
        FROM DEPT
        WHERE DEPT_NO = E.DEPT_NO
        AND DEPT_CAT = ‘A');
       
(更高效)
        SELECT ENAME
        FROM DEPT D,EMP E
        WHERE E.DEPT_NO = D.DEPT_NO
        AND DEPT_CAT = ‘A' ;
建議 用EXISTS替換DISTINCT
        當(dāng)提交一個(gè)包含一對(duì)多表信息(比如部門(mén)表和雇員表)的查詢(xún)時(shí),避免在SELECT子句中使用DISTINCT。一般可以考慮用EXIST替換。
        示例:
低效:
        SELECT DISTINCT DEPT_NO,DEPT_NAME
        FROM DEPT D,EMP E
        WHERE D.DEPT_NO = E.DEPT_NO
       
高效:
        SELECT DEPT_NO,DEPT_NAME
        FROM DEPT D
        WHERE EXISTS ( SELECT ‘X'
        FROM EMP E
        WHERE E.DEPT_NO = D.DEPT_NO);
建議避免在索引列上使用計(jì)算
        WHERE子句中,如果索引列參與計(jì)算,優(yōu)化器將不使用索引而使用全表掃描。
        示例:
低效:
        SELECT …
        FROM DEPT
        WHERE SAL * 12 > 25000;
       
高效:
        SELECT …
        FROM DEPT
        WHERE SAL > 25000/12;
建議 避免在索引列上使用NOT
        避免在索引列上使用NOT, NOT會(huì)產(chǎn)生在和在索引列上使用函數(shù)相同的影響. 當(dāng)ORACLE”遇到”NOT,會(huì)停止使用索引轉(zhuǎn)而執(zhí)行全表掃描。
        示例:
低效: (不使用索引)
        SELECT …
        FROM DEPT
        WHERE NOT DEPT_CODE = 0;
       
高效: (使用了索引)
        SELECT …
        FROM DEPT
        WHERE DEPT_CODE > 0;
       
        需要注意的是,在某些時(shí)候, ORACLE優(yōu)化器會(huì)自動(dòng)將NOT轉(zhuǎn)化成相對(duì)應(yīng)的關(guān)系操作符。
        NOT > to <=
        NOT >= to <
        NOT < to >=
        NOT <= to >
建議 用>=替代>
        如果DEPTNO上有一個(gè)索引,
       
高效:
        SELECT *
        FROM EMP
        WHERE DEPTNO >=4
       
低效:
        SELECT *
        FROM EMP
        WHERE DEPTNO >3
作者: manULinux    時(shí)間: 2012-02-17 22:15
有時(shí)間在來(lái)。呵呵。
作者: 三人行必有吾師    時(shí)間: 2012-02-18 09:33
看到大家的踴躍發(fā)言,很感動(dòng);籍此機(jī)會(huì),希望給更多的閱讀者或多或少帶來(lái)一些火花般的啟迪。

大家提到的方方面面已經(jīng)很多很好了,在此只是還需要注意一些更大尺度的把握:
"雙刃性":許多事情或者措施,都是雙向的,依據(jù)經(jīng)驗(yàn)選擇一個(gè)好的平衡點(diǎn),才能達(dá)到收益最大化

(1) 比如樓上同仁提到的跟蹤內(nèi)存,如果只是打開(kāi)Verbose GC尚好,的確會(huì)產(chǎn)生很多日志,不過(guò)日志量不會(huì)大到較嚴(yán)重影響系統(tǒng)的程度,比較常用;但要是上OptimizeIt和Jprobe,小馬拖大車(chē)的吭哧吭哧,的確會(huì)讓生產(chǎn)系統(tǒng)嚴(yán)重滯緩,慎用;

(2) 再比如同仁提到的NativeIO,打開(kāi)的確會(huì)提高吞吐性能(要不以前的老名字怎么叫Perfemance Pack呢),但由于以共享庫(kù)的方式,通過(guò)JNI引入了C語(yǔ)言本地代碼,也是發(fā)生系統(tǒng)Core Dump的一大誘因,經(jīng)常需要上個(gè)補(bǔ)丁什么的;
    而且這里大家需要注意知其然并知其所以然,當(dāng)年設(shè)計(jì)開(kāi)發(fā)時(shí)內(nèi)部討論引入NativeIO,最大的動(dòng)力,并不是因?yàn)樗^“C語(yǔ)言比Java快”,而是因?yàn)樵缒甑腏DK的Socket編程,只能支持到Send/Recv(),或者說(shuō)Read/Write()這樣的同步接口;而異步Socket的大并發(fā)高容量的Select/Poll()機(jī)制API,C語(yǔ)言卻已成熟多年;引入異步IO,才是當(dāng)年的真正本意。現(xiàn)在新版JDK已經(jīng)很好的實(shí)現(xiàn)異步IO了,所以WeLogic的控制臺(tái)很多措辭其實(shí)都悄悄變了。

(3) 再比如同仁提到的集群(即Cluster),其實(shí)并不是每次請(qǐng)求來(lái)都輪詢(xún)(Round-Robin),或者根據(jù)機(jī)器負(fù)載來(lái)平衡;這種負(fù)載均衡,其實(shí)只對(duì)新請(qǐng)求如此,對(duì)于老請(qǐng)求(就是同一個(gè)瀏覽器端,已經(jīng)發(fā)過(guò)Http請(qǐng)求,而cookie或session尚未超期),其實(shí)是粘連(Sticky)的,即老往同一個(gè)機(jī)器上送,而不是自由分發(fā);其實(shí)大家看到WebLogic在SessionID中編碼了主地址和備地址,就能猜到。所以前面的分發(fā)器配合時(shí),不是越“均衡”越好,也需要粘連算法;


"魯棒性":一般而言,大型業(yè)務(wù)系統(tǒng)的穩(wěn)定性重于高效性;在修訂故障,引入?yún)?shù)或者調(diào)優(yōu)系統(tǒng)時(shí),需要充份考慮這點(diǎn)
"魯棒性"這個(gè)詞,相信大家在學(xué)校里《現(xiàn)代控制理論》中就早早接觸到了。比如我們國(guó)家的航天事業(yè)神舟飛船,如果火箭發(fā)射中,受大氣中的風(fēng)、云,氣流等稍微擾動(dòng)一下,那么高速飛行,如果沒(méi)有很強(qiáng)的抗干擾性或者說(shuō)輸入收斂性,早就不知道偏哪里去了。另外,比如說(shuō)Windows界面用起來(lái)再舒服,大家在服務(wù)器領(lǐng)域還是喜歡Unix;同樣是PC Server,跟愿意跑Linux,其實(shí)這里面至關(guān)重要的,也有個(gè)系統(tǒng)魯棒性的問(wèn)題;Windows有點(diǎn)小操作不當(dāng),或者不兼容,框就彈出來(lái)了甚至藍(lán)屏了,各子系統(tǒng)耦合度高,整體系統(tǒng)非常脆弱而容易一個(gè)點(diǎn)觸發(fā)全線(xiàn)崩潰;Unix系統(tǒng)卻常常有一顆堅(jiān)實(shí)的"心",并不會(huì)因?yàn)橐恍⿷?yīng)用程序的錯(cuò)誤或子系統(tǒng)故障而全線(xiàn)崩潰。(從這里,其實(shí)也多少能看到當(dāng)年貝爾實(shí)驗(yàn)室人員的扎實(shí)理論功底)。

那么我們?cè)谡{(diào)整中間件系統(tǒng)時(shí),也需要注意對(duì)全局的影響;一旦故障發(fā)生,我們的設(shè)置,是讓其收斂的,還是擴(kuò)散的。

(1) 比如同仁提到的,用ipcrm清理Tuxedo殘余,其實(shí)實(shí)踐中很好;因?yàn)镮PC資源在Tuxedo中大量使用(每個(gè)Server都有消息隊(duì)列;WSL/WSH,以及BBL和Serve間有共享內(nèi)存,還有大量的信號(hào)量等等),如果有什么IPC資源混亂,最終導(dǎo)致BBL鎖住,這種錯(cuò)誤就會(huì)災(zāi)難性的擴(kuò)散到整個(gè)全局,導(dǎo)致全程堵塞也不是不可能;

(2) 再比如有同仁提到的新執(zhí)行隊(duì)列,現(xiàn)在應(yīng)該叫Work Manager了,也是一個(gè)很好的實(shí)踐;如果大家共用一個(gè)大線(xiàn)程池的話(huà),一種業(yè)務(wù)卡殼,然后前端人員通常就會(huì)不斷關(guān)閉重開(kāi)窗口刷,然后線(xiàn)程池就被占滿(mǎn)并開(kāi)始暴漲,并逐漸內(nèi)存等各資源吃緊,然后所有業(yè)務(wù)都開(kāi)始不太靈光了。

等等。。。

作者: 三人行必有吾師    時(shí)間: 2012-02-18 09:41
本帖最后由 三人行必有吾師 于 2012-02-18 12:05 編輯

對(duì)了,現(xiàn)在這三本書(shū)已經(jīng)全線(xiàn)上架了,比如WebLogic這本書(shū),在各大圖書(shū)網(wǎng)站輸入"WebLogic",加“運(yùn)維”或者“實(shí)戰(zhàn)”關(guān)鍵詞,都能找出來(lái)

由此給大家曾經(jīng)帶來(lái)的不便,表示歉意!
作者: vsyour    時(shí)間: 2012-02-18 10:32
本帖最后由 vsyour 于 2012-02-18 10:36 編輯

視內(nèi)存大小而定對(duì)JVM進(jìn)行調(diào)優(yōu)
  1. if [ "${together}" = "MNAOM" ];then   
  2.             nohup $JRE_HOME/bin/java -Duser.timezone=UTC -server -Xms256m -Xmx1024m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=512m -cp $JAVACP ${SPGPROC_ID} $BOARD_FRAME $BOARD_SLOT>/dev/null 2>&1 &
  3.         elif [ "${together}" = "SPSPG" ]; then
  4.             nohup $JRE_HOME/bin/java -Duser.timezone=UTC -server -Xms256m -Xmx2048m -XX:MaxNewSize=256m -XX:PermSize=128m -XX:MaxPermSize=512m -cp $JAVACP ${SPGPROC_ID} $BOARD_FRAME $BOARD_SLOT>/dev/null 2>&1 &
  5.         else
  6.             echo "Only base board can excute."
  7.             rm $FLAG_STARTING_FILE >> $LOGFILE
  8.             exit 1;
  9.         fi
復(fù)制代碼

作者: 敘利亞    時(shí)間: 2012-02-18 20:35
精華帖呀,贊。!
作者: yszw0817    時(shí)間: 2012-02-18 21:20
WebLogic有安裝配置部署的經(jīng)歷,并有項(xiàng)目中實(shí)施配置集群的經(jīng)歷。
借寶地,我想向給位高手請(qǐng)教,配置WEBLOGIC兩個(gè)節(jié)點(diǎn)集群的時(shí)候,poxy_server一定需要配置嗎?poxy_server是配置在其中的一個(gè)節(jié)點(diǎn)上,并不加入集群。在實(shí)施過(guò)程中,配置了poxy_server,如果關(guān)閉了poxy_server,就無(wú)法訪問(wèn)。那么如果配置poxy_server的節(jié)點(diǎn)宕機(jī)了,那么是不是集群就無(wú)法發(fā)揮作用呢?是否是配置方法出了問(wèn)題。還有weblogic集群配合F5實(shí)現(xiàn)負(fù)載均衡,能實(shí)現(xiàn)嗎?當(dāng)時(shí)我們只有干掉集群,配置單節(jié)點(diǎn)的DOMAIN,再通過(guò)F5虛擬地址實(shí)現(xiàn)訪問(wèn)?還有其他更好的方法嗎?小弟,在這里致謝了先!
GoldenGate有基本了解,通過(guò)了ORACLE認(rèn)證,尚無(wú)實(shí)施經(jīng)歷,希望有熟悉的朋友分享資料。謝謝了。
作者: 成皿田心    時(shí)間: 2012-02-19 10:37
感謝這個(gè)平臺(tái)能讓我跟各位大神學(xué)習(xí)、交流

回復(fù) 60# yszw0817

1.關(guān)于集群proxy_server是必要的,通過(guò)代理SERVER做分發(fā),負(fù)載均衡通常也通過(guò)代理實(shí)現(xiàn)。

2.通查情況下proxy_server只是負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求,只要后端SERVER能夠正常處理請(qǐng)求并返回(這個(gè)主要取決與程序好壞以及負(fù)載是否均衡),那么一般proxy_server不會(huì)有太大壓力,更不會(huì)引起宕機(jī)。當(dāng)然如果有些意外情況導(dǎo)致proxy當(dāng)?shù)簦_實(shí)會(huì)導(dǎo)致后端集群不能正常訪問(wèn)。因此建議實(shí)際應(yīng)用環(huán)境中采用備用的proxy節(jié)點(diǎn),已達(dá)到容災(zāi)的需求。

3.weblogic集群配合F5實(shí)現(xiàn)負(fù)載均衡是可以實(shí)現(xiàn)的,可以用f5直接替代之前提到過(guò)的proxy的角色,而且效果更好(畢竟是專(zhuān)業(yè)的負(fù)載均衡器),只要在f5配置中納入集群的各個(gè)節(jié)點(diǎn)就ok了,當(dāng)然f5還有許多附帶功能比如說(shuō)會(huì)話(huà)保持之類(lèi),這些附帶功功能確實(shí)為了緩解后端SERVER壓力,但個(gè)人認(rèn)為這類(lèi)功能視情況慎用之。

   
作者: huanglao2002    時(shí)間: 2012-02-19 22:38
今天才看到這篇帖子,我想問(wèn)的問(wèn)題如下:
我工作主要偏重運(yùn)維的,請(qǐng)問(wèn)在運(yùn)維過(guò)程中需要關(guān)注那些東西?
從目前來(lái)看,weblogic目前沒(méi)有很好的監(jiān)控手段。比如jdbc連接數(shù)量超限,有嚴(yán)重的報(bào)錯(cuò)。對(duì)于監(jiān)控,老師有什么建議。
謝謝
作者: 成皿田心    時(shí)間: 2012-02-20 09:04
回復(fù) 62# huanglao2002

從日常的運(yùn)維監(jiān)控角度來(lái)說(shuō),個(gè)人認(rèn)為幾個(gè)方面值得關(guān)注:

操作系統(tǒng),網(wǎng)絡(luò),WebLogic,系統(tǒng)日志

操作系統(tǒng):

檢查系統(tǒng)cpu、內(nèi)存等使用是否異常。如在負(fù)載不大的情況下,cpu是否一直居高不下內(nèi)存占用是否一直很大,硬盤(pán)空間是否寫(xiě)滿(mǎn)(對(duì)于服務(wù)器,通?赡苄圆淮螅?梢酝ㄟ^(guò)top(topas)、vmstat、iostat、netstat、free –m、ps、df、du等命令查看。


網(wǎng)絡(luò):

檢測(cè)位于一個(gè)domain中各個(gè)服務(wù)器是否能夠聯(lián)通,以及weblogic服務(wù)器與數(shù)據(jù)庫(kù)服務(wù)器的鏈接是否暢通

WebLogic:

1.檢查是否對(duì)jvm進(jìn)行了優(yōu)化,如最大堆內(nèi)存、最小堆內(nèi)存,以及gc算法是否合理

2.檢查gc是否正常
  主要是通過(guò)weblogic控制臺(tái),查看jvm的空閑內(nèi)存的變化情況,每次gc的回收情況。特別是可以在控制臺(tái)強(qiáng)制垃圾回收,看看回收的內(nèi)存是否太小。如果回收的內(nèi)存太小,說(shuō)明可能存在內(nèi)存益處的隱患。

3.檢查線(xiàn)程數(shù)

通過(guò)weblogic控制臺(tái)可以查看線(xiàn)程數(shù)的統(tǒng)計(jì)信息。weblogic9及以上的線(xiàn)程是自?xún)?yōu)化的。但應(yīng)該查看系統(tǒng)的線(xiàn)程最大數(shù)是否過(guò)大,如果過(guò)大,查明系統(tǒng)為什么會(huì)在成這樣大的壓力。

對(duì)于線(xiàn)程監(jiān)控主要關(guān)注項(xiàng):

Active Execute Threads:在活動(dòng)的線(xiàn)程池內(nèi)處理請(qǐng)求的線(xiàn)程個(gè)數(shù)
Execute Thread Total Count:線(xiàn)程池內(nèi)線(xiàn)程的總數(shù)
Execute Thread Idle Count:池內(nèi)的空閑線(xiàn)程數(shù)。它不包含stuck和standby的線(xiàn)程數(shù)。它是指等待接收新請(qǐng)求到來(lái)并處理的線(xiàn)程個(gè)數(shù)
queue length :請(qǐng)求隊(duì)列的長(zhǎng)度,及隊(duì)列中等待線(xiàn)程處理的請(qǐng)求的個(gè)數(shù)
hogging thread count :線(xiàn)程處理一個(gè)請(qǐng)求時(shí)間超過(guò)一定值被視為hogging狀態(tài),如果繼續(xù)處理請(qǐng)求超過(guò)一定時(shí)間將被視為stuck,或處理完請(qǐng)求后被放回線(xiàn)程池
standby thread count :統(tǒng)計(jì)在standby(備用)線(xiàn)程池內(nèi)的線(xiàn)程數(shù)。這些線(xiàn)程不需要處理當(dāng)前請(qǐng)求被放入standby池內(nèi),當(dāng)活動(dòng)的線(xiàn)程池內(nèi)需要更多線(xiàn)程時(shí),這些線(xiàn)程將被激活。
通常情況下:Execute Thread Total Count= Active Execute Threads+ standby thread count

4.線(xiàn)程是否有stuck狀態(tài)的


    線(xiàn)程stuck狀態(tài)說(shuō)明存在超時(shí)的線(xiàn)程,也有可能存在線(xiàn)程的死鎖。在查看線(xiàn)程數(shù)的時(shí)候,查看Health一欄,如果出現(xiàn)Warning則代表有stuck(阻塞線(xiàn)程),就要查看系統(tǒng)的運(yùn)行狀態(tài),jvm等的狀態(tài)是否正常,內(nèi)存使用率等。立即做thread dump得到當(dāng)前虛擬機(jī)下線(xiàn)程活動(dòng)快照,就可以分析服務(wù)器線(xiàn)程之間是否存在死鎖,以及哪些線(xiàn)程處于stuck狀態(tài)。

5.JDBC連接池

檢查連接池中等待連接的數(shù)目是否過(guò)大,可以做適當(dāng)調(diào)整。如果用戶(hù)訪問(wèn)系統(tǒng)變慢,且連接池基本占滿(mǎn),但是weblogic的線(xiàn)程數(shù)量很少,就要懷疑應(yīng)用是否沒(méi)有釋放數(shù)據(jù)庫(kù)連接。

系統(tǒng)日志

這是最常用到的查錯(cuò)方法,一般情況下,看到日志中有明顯錯(cuò)誤是值得慶幸的,這樣可以直接根據(jù)問(wèn)題尋求答案。

還有一點(diǎn)要提到的是日志的輸出方式最好是根據(jù)業(yè)務(wù)來(lái)定,以免造成日志冗余,占用大量磁盤(pán)空間。

關(guān)于監(jiān)控,ibm,quest(如foglight)等公司都有相應(yīng)的對(duì)WebLogic的監(jiān)控工具,但主要是集中在對(duì)jvm的管理監(jiān)控上,相對(duì)來(lái)說(shuō)比較智能。當(dāng)然在sun,jrockit得較高版本的jdk中都有集成相應(yīng)的監(jiān)控工具(如jconsole等。。)

以上只是個(gè)人的淺見(jiàn),希望對(duì)您有所幫助(ps:我看了一下,您的這些問(wèn)題以及常見(jiàn)的監(jiān)控手段在WebLogic企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)中均有具體闡述)
作者: huanglao2002    時(shí)間: 2012-02-20 10:38
本帖最后由 huanglao2002 于 2012-02-20 20:43 編輯


china-pub 可以買(mǎi)了,dangdang和amazon weblogic 這本暫時(shí)不能下單。

WebLogic企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)
http://product.china-pub.com/59391

Tuxedo企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)
http://product.china-pub.com/59094

GoldenGate企業(yè)級(jí)運(yùn)維實(shí)戰(zhàn)
http://product.china-pub.com/58978
作者: huanglao2002    時(shí)間: 2012-02-20 10:40
成皿田心 發(fā)表于 2012-02-20 09:04
回復(fù) 62# huanglao2002

從日常的運(yùn)維監(jiān)控角度來(lái)說(shuō),個(gè)人認(rèn)為幾個(gè)方面值得關(guān)注:


多謝回復(fù),關(guān)于監(jiān)控方面有比較成熟的產(chǎn)品和案例嗎?
作者: wlforyou1    時(shí)間: 2012-02-20 14:08
1·做開(kāi)發(fā)的時(shí)候,項(xiàng)目是在tomcat下跑,然后移植到weblogic下,就會(huì)出現(xiàn)各自問(wèn)題,很是糾結(jié)。
2·還有這個(gè)內(nèi)存溢出問(wèn)題,也很頭疼。有時(shí)候看到溢出了,就重啟welbogic,一直沒(méi)有把問(wèn)題的根源找出來(lái),慚愧。
3·weblogic也有虛擬主機(jī)功能,現(xiàn)在一個(gè)weblogic里面跑了好幾個(gè)應(yīng)用,像這種用了虛擬主機(jī)功能,對(duì)weblogic本身性能會(huì)有影響嗎?
作者: 三人行必有吾師    時(shí)間: 2012-02-20 17:33
謝謝譚寬(成皿田心)出面給予的耐心解答和協(xié)助,謝謝!

huanglao2002,也感謝您的熱心關(guān)注和支持幫助。其實(shí)WebLogic自己的監(jiān)控和管理,已經(jīng)比Tuxedo/GoldenGate的做得人性化可視化好很多,可以通過(guò)JMX規(guī)范的MBean來(lái)訪問(wèn)管理,同時(shí)也提供了傳統(tǒng)的SNMP接口。 象HP的OpenView,Quest的FogLight等等也都是很好的第三方產(chǎn)品。另外,即使是WebLogic自己,還有個(gè)控制臺(tái)擴(kuò)展包(WLDF Console Extension),加載后會(huì)在控制臺(tái)上左側(cè)樹(shù)中多出一個(gè)書(shū)簽,可以看到更多東西和實(shí)時(shí)圖表。

yszw0817,wlforyou1,您們所關(guān)注的,的確都是WebLogic相關(guān)的核心東西,都非常有共性,很典型,謝謝!Tomcat在J2EE領(lǐng)域,主要是對(duì)于EJB,JMS等一些子規(guī)范自身沒(méi)有很好的實(shí)現(xiàn)和支持,在Jsp/Servlet/JDBC這些基本的要件上,還是不錯(cuò)的;項(xiàng)目移植碰到的問(wèn)題,其實(shí)主要體現(xiàn)在SSH(Struts-Spring-Hibernate)框架和WebLogic兼容的問(wèn)題上,這個(gè)WebLogic官方提供專(zhuān)門(mén)的版本認(rèn)證和兼容信息列表。在《WebLogic實(shí)戰(zhàn)》中第9章也專(zhuān)門(mén)了論述相關(guān)方方面面。虛擬主機(jī),內(nèi)部實(shí)現(xiàn)中,其實(shí)就是把域名映射到某個(gè)Web應(yīng)用上(或者說(shuō)某個(gè)Context路徑上),所以其本身對(duì)于性能的影響不大,主要是考慮多跑的這幾個(gè)自己的Web應(yīng)用(即多添的這幾個(gè)虛擬主機(jī)),對(duì)系統(tǒng)的資源消耗有多大。
作者: ztyandjw    時(shí)間: 2012-02-20 19:11
哥們您好,我想和你交流一下,能否私密我個(gè)聯(lián)絡(luò)方式或者郵箱
作者: 三人行必有吾師    時(shí)間: 2012-02-20 19:58
回復(fù) 68# ztyandjw

謝謝關(guān)照,可以發(fā)到我個(gè)人郵箱daiguanping@tsinghua.org.cn,或者公司對(duì)外郵箱service@landingbj.com


   
作者: huanglao2002    時(shí)間: 2012-02-20 20:36
本帖最后由 huanglao2002 于 2012-02-20 20:40 編輯
三人行必有吾師 發(fā)表于 2012-02-20 19:58
回復(fù) 68# ztyandjw

謝謝關(guān)照,可以發(fā)到我個(gè)人郵箱,或者公司對(duì)外郵箱


很早就給你們發(fā)過(guò)郵件,詢(xún)問(wèn)這幾本書(shū)的事情了。

Untitled.jpg (66.38 KB, 下載次數(shù): 61)

Untitled.jpg

作者: 三人行必有吾師    時(shí)間: 2012-02-20 21:38
回復(fù) 70# huanglao2002

謝謝您一直的熱心支持和幫助,有想法也很有見(jiàn)地

   
作者: wlforyou1    時(shí)間: 2012-02-21 09:27
居然回復(fù)了我的帖子,我好感動(dòng)餓,真的。不過(guò)weblogic只會(huì)前臺(tái)使用了,具體后面的東東太深?yuàn)W了,弄不懂。
作者: rongon2008    時(shí)間: 2012-02-23 09:26
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: 三人行必有吾師    時(shí)間: 2012-02-26 23:01
本帖最后由 三人行必有吾師 于 2012-02-27 08:01 編輯

其實(shí),這里的討論,已經(jīng)很多都涉及到書(shū)的內(nèi)容了;另外,還想起一句長(zhǎng)輩常常叮囑的古話(huà):“書(shū)是死的,人是活的”

比如,樓上有同仁提到JDBC調(diào)優(yōu)時(shí)比較共性的一個(gè)做法
“2.3 JDBC調(diào)優(yōu)
增加Statement Cache Size對(duì)于大量使用PreparedStatement對(duì)象的應(yīng)用程序很有幫助,WebLogic能夠?yàn)槊恳粋(gè)連接緩存這些對(duì)象,此值默認(rèn)為10。在保證數(shù)據(jù)庫(kù)游標(biāo)大小足夠的前提下,可以根據(jù)需要提高Statement Cache Size ”


大多數(shù)情況下是OK的,但在一些特殊情況下,反而恰恰是要關(guān)閉WebLogic控制臺(tái)上的Statement Cache,比如使用Informix驅(qū)動(dòng)時(shí):

Informix Limitation for Prepared Statements
If anything causes a change to a database table or procedure, such as adding an index, or recompiling the procedure, all existing JDBC PreparedStatements that access it must be re-prepared before they can be used again. This is a limitation of the Informix database management system. WebLogic Server caches, retains, and reuses application PreparedStatements along with pooled connections, so if your application uses prepared statements that access tables or procedures that are dropped and recreated or for which the definition is changed, re-execution of a cached prepared statement will fail once. WebLogic Server will then remove the defunct prepared statement from the cache and replace it when the application asks for the statement again.

To avoid any PreparedStatement failure due to table or procedure changes in the DBMS while WebLogic Server is running, set the Statement Cache Size to 0. WebLogic will make a new PreparedStatement for each request. However, with the statement cache disabled, you will lose the performance benefit of statement caching.


這個(gè)時(shí)候,可以在連接參數(shù)里,開(kāi)啟Informix驅(qū)動(dòng)自身的Cache,比如:
  1. i)    InsensitiveResultSetBufferSiz=20480
  2. ii)   MaxPooledStatements=50
復(fù)制代碼

作者: 三人行必有吾師    時(shí)間: 2012-02-26 23:23
本帖最后由 三人行必有吾師 于 2012-02-26 23:42 編輯

在J2EE平臺(tái)通過(guò)JDBC連接Informix數(shù)據(jù)庫(kù)時(shí),如果故事能就此結(jié)束,就好了。但大多數(shù)情況下,調(diào)優(yōu)是個(gè)多級(jí)瀑布模型;就是調(diào)完一輪后,窄的地方疏通了,然后又發(fā)現(xiàn)新的瓶頸,如此循環(huán)往復(fù)多次,才能最終達(dá)到一個(gè)相對(duì)平衡的調(diào)優(yōu)效果。

繼續(xù)上面的例子,在實(shí)際情況中,在Linux環(huán)境下,即使調(diào)整了Statement Cache,亦然常常容易發(fā)現(xiàn)壓力大的情況下,系統(tǒng)出現(xiàn)大量堆積的Thread Dump,基本都是:
  1. "[ACTIVE] ExecuteThread: '82' for queue: 'weblogic.kernel.Default (self-tuning)'" RUNNABLE
  2.     java.lang.Thread.setPriority0(Native Method)
  3.     java.lang.Thread.setPriority(Thread.java:971)
  4.     java.lang.Thread.init(Thread.java:334)
  5.     java.lang.Thread.<init>(Thread.java:356)
  6.     java.util.TimerThread.<init>(Timer.java:456)
  7.     java.util.Timer.<init>(Timer.java:71)
  8.     java.util.Timer.<init>(Timer.java:122)
  9.     com.informix.jdbc.IfxCancelQueryImpl.startCancel(IfxCancelQueryImpl.java:45)
  10.     com.informix.jdbc.IfxStatement.executeQueryImpl(IfxStatement.java:1200)
  11.     com.informix.jdbc.IfxPreparedStatement.executeQuery(IfxPreparedStatement.java:369)
  12.     weblogic.jdbc.wrapper.PreparedStatement.executeQuery(PreparedStatement.java:100)
  13.     com.p6spy.engine.logging.P6LogPreparedStatement.executeQuery(P6LogPreparedStatement.java:172)
  14.     org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
  15.     org.hibernate.loader.Loader.getResultSet(Loader.java:1668)
  16.     org.hibernate.loader.Loader.doQuery(Loader.java:662)
  17.     ... ...
復(fù)制代碼
可見(jiàn):
i)   針對(duì)PreparedStatement,Informix驅(qū)動(dòng)中用到了大量的JDK自帶的Timer
ii)  而JDK每個(gè)Timer都會(huì)啟動(dòng)一個(gè)TimerThread,即線(xiàn)程級(jí)別的開(kāi)銷(xiāo),并映射成操作系統(tǒng)本地線(xiàn)程,而且是短命線(xiàn)程,不停的創(chuàng)建和消亡;
(題外話(huà):其實(shí),Weblogic就因?yàn)槠湫实拖,重?xiě)了自己的該部分代碼,有自己的Timer類(lèi))。

但I(xiàn)nformix驅(qū)動(dòng)是數(shù)據(jù)庫(kù)方提供的,已經(jīng)寫(xiě)好了;咱們總不能用Jad反編譯后,自己再出個(gè)優(yōu)化版的驅(qū)動(dòng)吧?咱們敢改,客戶(hù)還不敢用呢。。。

只好再看這個(gè)堆棧,最頂端是
  1.     java.lang.Thread.setPriority0(Native Method)
  2.     java.lang.Thread.setPriority(Thread.java:971)
復(fù)制代碼
這種帶...0的方法,基本都是通過(guò)JNI調(diào)入了C語(yǔ)言的本地庫(kù),從旁邊的(Native Method)也能驗(yàn)證;其實(shí)在JVM的線(xiàn)程實(shí)現(xiàn)中,最簡(jiǎn)單的就是將其映射到操作系統(tǒng)自己的線(xiàn)程,可以有1X1的(一對(duì)一),也可以有MXN的(多對(duì)多)。而在Linux內(nèi)核從Kernel 2.4變?yōu)?.6后,超線(xiàn)程技術(shù)為了優(yōu)化CPU時(shí)間片Time_Slice,對(duì)于線(xiàn)程的創(chuàng)建和優(yōu)先級(jí)設(shè)定,卻恰恰都有很?chē)?yán)重的系統(tǒng)開(kāi)銷(xiāo)用于線(xiàn)程矩陣池實(shí)時(shí)維護(hù)。

但Linux內(nèi)核也是專(zhuān)門(mén)的開(kāi)源協(xié)議維護(hù)的,不能為了這個(gè),咱們自己出一套Linux內(nèi)核源碼,重新做一套改進(jìn)版吧?還是那句話(huà):咱們敢改,客戶(hù)還不敢用呢。。。

只好去讀JVM實(shí)現(xiàn)的C語(yǔ)言源代碼,在上萬(wàn)行的C語(yǔ)言源程序中,可以找到關(guān)于設(shè)置優(yōu)先級(jí)的一些部分,其中有一段:
  1. 2997 OSReturn os::set_native_priority(Thread* thread, int newpri) {
  2. 2998   if ( !UseThreadPriorities || ThreadPriorityPolicy == 0 ) return OS_OK;
  3. 2999
  4. 3000   int ret = setpriority(PRIO_PROCESS, thread->osthread()->thread_id(), newpri);
  5. 3001   return (ret == 0) ? OS_OK : OS_ERR;
  6. 3002 }
復(fù)制代碼
可見(jiàn),其中有個(gè)“快捷”跳出,就是第二行if...return OS_OK那個(gè),再找UseThreadPriorities,發(fā)現(xiàn)可以通過(guò)JVM啟動(dòng)項(xiàng)添加-XX:-UseThreadPriorities來(lái)設(shè)定。。。

于是,這個(gè)Informix驅(qū)動(dòng)本身實(shí)現(xiàn)的性能缺陷,卻恰恰通過(guò)了JVM的啟動(dòng)參數(shù)設(shè)置來(lái)規(guī)避。。。

這個(gè)例子,即是印證了前輩們那句話(huà):“書(shū)是死的,人是活的”

作者: 冷翎月    時(shí)間: 2012-02-27 09:10
書(shū)剛剛買(mǎi)到手,大致瀏覽了一下,感覺(jué)還不錯(cuò)
作者: yszw0817    時(shí)間: 2012-02-27 10:54
回復(fù) 61# 成皿田心

你好!看到老師的回復(fù),非常感謝!
小弟愚鈍,看到您在第三點(diǎn)寫(xiě)道:“用f5直接替代之前提到過(guò)的proxy的角色,而且效果更好(畢竟是專(zhuān)業(yè)的負(fù)載均衡器),只要在f5配置中納入集群的各個(gè)節(jié)點(diǎn)就ok了”。
老師您有稍微詳細(xì)一點(diǎn)步驟嗎?
因?yàn)槲覀冊(cè)谧鰧?shí)施的時(shí)候,F(xiàn)5廠家的人說(shuō),他們實(shí)施的WEBLOGIC+F5實(shí)現(xiàn)的負(fù)載均衡都是分別在兩個(gè)節(jié)點(diǎn),建立兩個(gè)DOMAIN,再通過(guò)F5虛擬地址實(shí)現(xiàn)負(fù)載均衡。
當(dāng)時(shí)我就表示了異議,但是也苦于找不到對(duì)策。我本人對(duì)F5知之不多。
我也查詢(xún)了ORACLE官方網(wǎng)站,WEBLOGIC+F5能完美契合的。

非常感謝您的指教!多謝!
這是我的郵箱:yszw0817@126.com


   
作者: 成皿田心    時(shí)間: 2012-02-27 13:13
回復(fù) 77# yszw0817


您好,此問(wèn)題中f5只是做了一個(gè)代理分發(fā)的角色。

后端的服務(wù)器如果是weblogic集群,完全沒(méi)有必要建立兩個(gè)域(當(dāng)然weblogic規(guī)定集群不能跨域。。,從config.xml看cluster標(biāo)簽隸屬域domain之下),這個(gè)代理只跟后端的每個(gè)節(jié)點(diǎn)相關(guān),跟domain無(wú)關(guān)。

有關(guān)的weblogic+f5的實(shí)施方案之類(lèi),我下班之后幫忙找找,有的話(huà)發(fā)到你郵箱。。。

   
作者: szd1007    時(shí)間: 2012-02-27 13:20
weblogic我也是剛了解 還有很長(zhǎng)的路要走哇
作者: 好小一只菜鳥(niǎo)    時(shí)間: 2012-04-20 10:20
已經(jīng)買(mǎi)了書(shū),在慢慢看了,不知道戴老師還會(huì)不會(huì)來(lái)。。。
作者: 9流星的眼淚9    時(shí)間: 2012-04-24 16:42
回復(fù) 7# 三人行必有吾師


有您這樣知識(shí)淵博的老師給我們作指導(dǎo),是我們的榮幸啊!~~~~~


   
作者: 9流星的眼淚9    時(shí)間: 2012-04-24 16:52
回復(fù) 15# 三人行必有吾師


是。〈骼蠋。世上的每一件事物都有它存在的價(jià)值,一只想在知識(shí)的海洋里遨游,去感受美好的東西。知識(shí)是無(wú)價(jià)的。。。









   
作者: 9流星的眼淚9    時(shí)間: 2012-04-26 14:41
喜歡中間件的朋友們。趕快來(lái)看一下中間件WebLogic/Tuxedo/GoldenGate的排錯(cuò)與優(yōu)化。路過(guò)不要錯(cuò)過(guò)啊。!O(∩_∩)O哈哈~~~~




作者: 三人行必有吾師    時(shí)間: 2012-04-30 07:56
好小一只菜鳥(niǎo) 發(fā)表于 2012-04-20 10:20
已經(jīng)買(mǎi)了書(shū),在慢慢看了,不知道戴老師還會(huì)不會(huì)來(lái)。。。


不好意思,才看到;

以后大家有什么問(wèn)題,可以繼續(xù)留在帖子里,我一定會(huì)經(jīng);貋(lái)。
作者: 9生命在于運(yùn)動(dòng)    時(shí)間: 2012-05-02 16:41
( 看大家都很親切的叫GG和TT{:2_177:} ,估計(jì)GG就是這本GoldenGate覆蓋的,TT是什么?{:2_176:}
作者: 三人行必有吾師    時(shí)間: 2012-05-03 10:48
回復(fù) 85# 9生命在于運(yùn)動(dòng)

對(duì),GG是指GoldenGate,在被Oracle并購(gòu)后,也常稱(chēng)為OGG。

而TT是指TimesTen,是內(nèi)存數(shù)據(jù)庫(kù),將數(shù)據(jù)庫(kù)的數(shù)據(jù)復(fù)制到內(nèi)存中,大大提升讀寫(xiě)和操作效率。所以顧名思義,TimesTen翻譯成中文,類(lèi)似于"十倍",大意是比傳統(tǒng)數(shù)據(jù)庫(kù)要快一個(gè)數(shù)量級(jí)。最早起源于HP實(shí)驗(yàn)室研究項(xiàng)目,后來(lái)1996年成立公司,2005年被Oracle收購(gòu)。

工作原理也比較直觀,安裝介質(zhì)也不大,有諸如ttAdmin, ttUsers, ttBackup, ttDaemonAdmin, ttDestroy, ttCacheUidPwdSet, ttCacheUidGet, ttCacheStart, ttCacheStop, ttBackupStatus等命令;從我們實(shí)際實(shí)施運(yùn)維過(guò)的項(xiàng)目經(jīng)驗(yàn)來(lái)看,屬于短小精悍型的產(chǎn)品。

另外,現(xiàn)在新出的TT是11.2版本的,跟以前流行的7.0的差別還是很大。


   
作者: maya_2012    時(shí)間: 2012-05-04 13:25
在書(shū)店看見(jiàn)過(guò)這套書(shū),不過(guò)我還沒(méi)接觸到weblogic。這個(gè)活動(dòng)挺不錯(cuò)的,希望以后碰到這方面的問(wèn)題的時(shí)候有機(jī)會(huì)請(qǐng)教戴老師
作者: 花開(kāi)若相依-    時(shí)間: 2012-05-10 10:16
對(duì)了,Oracle有監(jiān)控這些它們的產(chǎn)品嗎?
作者: 好小一只菜鳥(niǎo)    時(shí)間: 2012-05-11 11:07
回復(fù) 84# 三人行必有吾師

謝謝回復(fù)。這些天比較忙,拿著書(shū)自己參照網(wǎng)上一些例子做了一下,感覺(jué)技術(shù)上有些深?yuàn)W.


   
作者: 三人行必有吾師    時(shí)間: 2012-05-12 07:16
回復(fù) 88# 花開(kāi)若相依-

雖然,每個(gè)產(chǎn)品都有自己的常用工具,比如大家對(duì)于WebLogic習(xí)慣于它的Console控制臺(tái),對(duì)于Tuxedo習(xí)慣于它的tmdmin,對(duì)于GoldenGate習(xí)慣于它的GGSCI;但Oracle現(xiàn)在的確出了自己的一站式監(jiān)控工具OEM,通過(guò)中心服務(wù)器和外圍Agent的方式,可以在一個(gè)大的環(huán)境中,統(tǒng)一監(jiān)控自己公司運(yùn)行的產(chǎn)品。

從我們使用過(guò)的情況來(lái)看,效果還不錯(cuò),通過(guò)瀏覽器來(lái)訪問(wèn)監(jiān)控臺(tái),各式圖表和報(bào)告也比較完整;就是安裝和搭環(huán)境需要些經(jīng)驗(yàn):
一是安裝OEM服務(wù)器前,需要準(zhǔn)備好Oracle數(shù)據(jù)庫(kù)(存放監(jiān)控和配置數(shù)據(jù)等)和中間件WebLogic(做Web服務(wù)器)的預(yù)安裝;
二是安裝過(guò)程中,在中心服務(wù)器上建數(shù)據(jù)倉(cāng)庫(kù)(并涉及Repository中很多對(duì)象),有些步驟繁瑣而且有些補(bǔ)丁繞不過(guò)去;
三是部署Agent時(shí),需要點(diǎn)技巧,特別是SSH相關(guān)的東西;

這里需要補(bǔ)充說(shuō)明的是,這里說(shuō)的OEM是所謂的大OEM,不是指大家通常在DB上自帶的那個(gè)小OEM,那個(gè)只能監(jiān)控?cái)?shù)據(jù)庫(kù);大OEM是監(jiān)控從前到后Oracle全線(xiàn)產(chǎn)品的,安裝時(shí)反而需要先把小OEM給卸了。

另外,也可以自己按照個(gè)性化要求自己寫(xiě)代碼監(jiān)控,象WebLogic的JMX,Tuxedo的.MIB等等;比如,我們以前就通過(guò)Tuxedo的.MIB接口,給監(jiān)控軟件FogLight出過(guò)Tuxedo的監(jiān)控插件Cartridge產(chǎn)品;其實(shí)萬(wàn)變不離其宗,其核心還是對(duì)于監(jiān)控目標(biāo)的理解深度,核心監(jiān)控代碼不變;不同的只是各個(gè)監(jiān)控軟件的Plugin接口定制下而已。


   
作者: time不待人    時(shí)間: 2012-05-15 09:02
很好奇,不知道大名鼎鼎的Tuxedo源代碼長(zhǎng)什么樣子?

作者: 鳴禽云霞出海曙    時(shí)間: 2012-05-16 09:01
也很好奇,那WebLogic的源代碼呢?
作者: 三人行必有吾師    時(shí)間: 2012-05-18 06:50
本帖最后由 三人行必有吾師 于 2012-05-18 21:16 編輯

關(guān)于源代碼這類(lèi)的問(wèn)題,現(xiàn)在看起來(lái),感覺(jué)其實(shí)還是比較敏感的,容易越界...
作者: 三人行必有吾師    時(shí)間: 2012-05-18 06:57
回復(fù) 91# time不待人

其實(shí),從安裝和使用Tuxedo的過(guò)程中,公開(kāi)的本身就可以拿到一部分源代碼。

首先,在編譯的時(shí)候,帶上"-k"選項(xiàng),就能保留中間生成的臨時(shí)主函數(shù)相關(guān)源文件,比如大家熟知的Tuxedo自帶的大小寫(xiě)轉(zhuǎn)換的例子,一般寫(xiě)服務(wù)端程序時(shí),只能看到封裝好的Service接口,但當(dāng)tmboot時(shí),大家知道它是由BBL帶起來(lái)的,所以肯定是個(gè)標(biāo)準(zhǔn)的C語(yǔ)言程序,只是其主函數(shù)main()由Tuxedo自己動(dòng)態(tài)提供了。

比如我們?nèi)绻诰幾gsimpserv的TOUPPER服務(wù)時(shí),使用該選項(xiàng),就能得到源代碼(舉例)BS-1554.c
  1. #include <stdio.h>
  2. #include <xa.h>
  3. #include <atmi.h>

  4. #if defined(__cplusplus)
  5. extern "C" {
  6. #endif
  7. extern int _tmrunserver _((int));
  8. extern void TOUPPER _((TPSVCINFO *));
  9. #if defined(__cplusplus)
  10. }
  11. #endif

  12. static struct tmdsptchtbl_t _tmdsptchtbl[] = {
  13.         { (char*)"TOUPPER", (char*)"TOUPPER", (void (*) _((TPSVCINFO *))) TOUPPER, 0, 0 },
  14.         { NULL, NULL, NULL, 0, 0 }
  15. };

  16. #ifndef _TMDLLIMPORT
  17. #define _TMDLLIMPORT
  18. #endif

  19. #if defined(__cplusplus)
  20. extern "C" {
  21. #endif
  22. _TMDLLIMPORT extern struct xa_switch_t tmnull_switch;
  23. #if defined(__cplusplus)
  24. }
  25. #endif

  26. typedef void (*tmp_void_cast)();
  27. typedef void (*tmp_voidvoid_cast)(void);
  28. typedef int (*tmp_intchar_cast)(int, char **);
  29. typedef int (*tmp_int_cast)(int);
  30. struct tmsvrargs_t tmsvrargs = {
  31.         NULL,
  32.         &_tmdsptchtbl[0],
  33.         0,
  34.         (tmp_intchar_cast)tpsvrinit,
  35.         (tmp_voidvoid_cast)tpsvrdone,
  36.         (tmp_int_cast)_tmrunserver,        /* PRIVATE  */
  37.         NULL,                        /* RESERVED */
  38.         NULL,                        /* RESERVED */
  39.         NULL,                        /* RESERVED */
  40.         NULL,                        /* RESERVED */
  41.         (tmp_intchar_cast)tpsvrthrinit,
  42.         (tmp_voidvoid_cast)tpsvrthrdone
  43. };

  44. struct tmsvrargs_t *
  45. #ifdef _TMPROTOTYPES
  46. _tmgetsvrargs(void)
  47. #else
  48. _tmgetsvrargs()
  49. #endif
  50. {
  51.         tmsvrargs.reserved1 = NULL;
  52.         tmsvrargs.reserved2 = NULL;
  53.         tmsvrargs.xa_switch = &tmnull_switch;
  54.         return(&tmsvrargs);
  55. }

  56. int
  57. #ifdef _TMPROTOTYPES
  58. main(int argc, char **argv)
  59. #else
  60. main(argc,argv)
  61. int argc;
  62. char **argv;
  63. #endif
  64. {
  65. #ifdef TMMAINEXIT
  66. #include "mainexit.h"
  67. #endif

  68.         return( _tmstartserver( argc, argv, _tmgetsvrargs()));
  69. }
復(fù)制代碼

作者: ???ó???ê    時(shí)間: 2012-05-18 13:03
一般來(lái)說(shuō)考慮stucts等架構(gòu)tomcat就可以了,但如果考慮EJB的話(huà),WebLogic是比較好的選擇
作者: 三人行必有吾師    時(shí)間: 2012-05-18 20:16
本帖最后由 三人行必有吾師 于 2012-05-18 20:33 編輯

回復(fù) 95# ???ó???ê

是的,實(shí)踐中這個(gè)評(píng)判其實(shí)簡(jiǎn)潔可行,尤其是三大開(kāi)源框架SSH開(kāi)發(fā)應(yīng)用流行的話(huà)。


   
作者: 三人行必有吾師    時(shí)間: 2012-05-18 20:32
回復(fù) 91# time不待人

其次,在Tuxedo安裝之后的lib目錄下,一般也自帶若干個(gè).c文件,典型的有AUTHSRV.c,tmtypesw.c等;前者是用來(lái)寫(xiě)自定義的安全認(rèn)證接口用,后者做自定義buffer處理,特別是encode/decode相關(guān)動(dòng)作,但實(shí)踐中反而是經(jīng)常用來(lái)趁機(jī)添加數(shù)據(jù)加密環(huán)節(jié)。

而且這些源文件,要是從C語(yǔ)言角度來(lái)說(shuō)的,寫(xiě)得相當(dāng)經(jīng)典,對(duì)C語(yǔ)言理解之深,折射出貝爾實(shí)驗(yàn)室當(dāng)年誕生UNIX/C的風(fēng)采,比如AUTHSRV.c開(kāi)頭第一個(gè)函數(shù):
  1. static        char *
  2. #ifdef _TMPROTOTYPES
  3. mystrtok(char *s, char *del)
  4. #else
  5. mystrtok(s,del)
  6. char        *s;
  7. char        *del;
  8. #endif
  9. {
  10.         static        char *p = NULL;
  11.         char        *r;

  12.         if (s != NULL) {
  13.                 p = s;
  14.         }
  15.         if ((p == NULL) || (*p == '\0')) {
  16.                 return(NULL);
  17.         }
  18.         r = p;
  19.         while (strchr(del,*p) == NULL) {
  20.                 p++;
  21.         }
  22.         if (*p != '\0') {
  23.                 *p++ = '\0';
  24.         }
  25.         return(r);
  26. }
復(fù)制代碼

作者: 三人行必有吾師    時(shí)間: 2012-05-18 20:54
本帖最后由 三人行必有吾師 于 2012-05-18 20:56 編輯

回復(fù) 91# time不待人

然后,言歸正傳,看一眼真實(shí)的Tuxedo相關(guān)源碼和工程相關(guān)的東西,為了不引起不必要的麻煩,這里只取幾個(gè)老點(diǎn)的片段示例一下為止:

1. 編譯工程的Makefile,比如其中一個(gè)tuxedo.mk
  1. #        Copyright 1996 BEA Systems, Inc.
  2. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF
  3. #        BEA Systems, Inc.
  4. #        The copyright notice above does not evidence any
  5. #        actual or intended publication of such source code.

  6. #        Copyright (c) 1984 AT&T
  7. #          All Rights Reserved

  8. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
  9. #        The copyright notice above does not evidence any
  10. #        actual or intended publication of such source code.

  11. #ident        "@(#) tuxedo/tuxedo.mk        $Revision: 1.1 $"
  12. #

  13. AT=
  14. ARGS=all
  15. MAKE=make
  16. LANG = C
  17. SINCDIR=$(TUXDIR)/sysinclude
  18. INCDIR=$(TUXDIR)/include
  19. LIBDIR=$(TUXDIR)/lib
  20. BINDIR=$(TUXDIR)/bin
  21. XCBINDIR=$(TUXDIR)/bin
  22. CGFLAG=
  23. CC=cc
  24. AR=ar
  25. ARFLAGS=lrv
  26. LORDER=lorder
  27. SUF=.a
  28. DSUF=.a
  29. LIBSUF=.a
  30. PRE=$(LIBDIR)/lib
  31. LINT=lint
  32. LIBNET=-lnsl_s
  33. NETWORK=tli
  34. CRYPT=des

  35. ALL=include libbuft libtux libnet libtmib libqm cmdtux syssrvrs
  36. all:        $(ALL)
  37.         @:
  38. installws:        include libbuft libnet

  39. $(ALL)::
  40.         $(AT) cd $(@);  $(MAKE) -f $(@).mk  \
  41.                 MAKE=$(MAKE) SUF=$(SUF) DSUF=$(DSUF) PRE=$(PRE) \
  42.                 TUXDIR=$(TUXDIR) LANG=$(LANG) LORDER=$(LORDER) \
  43.                 INCDIR=$(INCDIR) SINCDIR=$(SINCDIR) LIBDIR=$(LIBDIR) \
  44.                 BINDIR=$(BINDIR) XCBINDIR=$(XCBINDIR) \
  45.                 PLATFORM=$(PLATFORM) LIBSUF=$(LIBSUF) \
  46.                 LINT="$(LINT)" LIBNET="$(LIBNET)" NETWORK=$(NETWORK) CRYPT=$(CRYPT) \
  47.                 CGFLAG="$(CGFLAG)" CC=$(CC) AR=$(AR) ARFLAGS="$(ARFLAGS)" $(ARGS)

  48. install clean clobber depend lint:
  49.         $(MAKE) -f tuxedo.mk ARGS=$@ \
  50.                 MAKE=$(MAKE) SUF=$(SUF) DSUF=$(DSUF) PRE=$(PRE) \
  51.                 TUXDIR=$(TUXDIR) LANG=$(LANG) LORDER=$(LORDER) \
  52.                 INCDIR=$(INCDIR) SINCDIR=$(SINCDIR) LIBDIR=$(LIBDIR) \
  53.                 BINDIR=$(BINDIR) XCBINDIR=$(XCBINDIR) \
  54.                 PLATFORM=$(PLATFORM) LIBSUF=$(LIBSUF) \
  55.                 LINT="$(LINT)" LIBNET="$(LIBNET)" NETWORK=$(NETWORK) CRYPT=$(CRYPT) \
  56.                 CGFLAG="$(CGFLAG)" CC=$(CC) AR=$(AR) ARFLAGS="$(ARFLAGS)"

  57. list:
  58.         @echo tuxedo/tuxedo.mk
  59.         @$(MAKE) -f tuxedo.mk ARGS=$@

  60. print:
  61.         @echo tuxedo/tuxedo.mk
  62.         @$(MAKE) -f tuxedo.mk ARGS=$@
復(fù)制代碼
里面至今還清晰的保留了AT&T字樣。。。。。
  1. #        Copyright (c) 1984 AT&T
  2. #          All Rights Reserved
復(fù)制代碼

作者: 三人行必有吾師    時(shí)間: 2012-05-18 20:59
本帖最后由 三人行必有吾師 于 2012-05-18 21:00 編輯

2. 一些內(nèi)部的頭文件(安裝后在Tuxedo的Include目錄下看不到的)

比如“tlog.h”:
  1. /*        Copyright (c) 1998 BEA Systems, Inc.
  2.         All rights reserved

  3.         THIS IS UNPUBLISHED PROPRIETARY
  4.         SOURCE CODE OF BEA Systems, Inc.
  5.         The copyright notice above does not
  6.         evidence any actual or intended
  7.         publication of such source code.
  8. */

  9. /*        Copyright 1996 BEA Systems, Inc.        */
  10. /*        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF             */
  11. /*        BEA Systems, Inc.                             */
  12. /*        The copyright notice above does not evidence any           */
  13. /*        actual or intended publication of such source code.        */

  14. /*      Copyright (c) 1990 Unix System Laboratories, Inc.
  15.         All rights reserved

  16.         THIS IS UNPUBLISHED PROPRIETARY
  17.         SOURCE CODE OF Unix System Laboratories, Inc.
  18.         The copyright notice above does not
  19.         evidence any actual or intended
  20.         publication of such source code.
  21. */
  22. #ifndef TLOG_H
  23. #define TLOG_H
  24. /* #ident        "@(#) tuxedo/include/tlog.h        $Revision: 1.1 $" */

  25. #ifndef TMMACH_H
  26. #include <tmmach.h>
  27. #endif
  28. #ifndef NOWHAT
  29. static        char        h_tlog[] = "@(#) tuxedo/include/tlog.h        $Revision: 1.1 $";
  30. #endif


  31. #include <Uunix.h>
  32. #include <tmstruct.h>
  33. #include <gpsys.h>

  34. /* TLOG constants */
  35. #define TLOGLRMGC        -999999                /* magic number for the log records */
  36. #define TLOGMAXSIZE         2048                /* maximum number of pages/log */
  37. #define TLOGDFLSIZE         100                /* default number of pages/log */
  38. #define TLOGMAXLSN        30000000         /* the range of LSN for TM32I */

  39. #define TIND(p)                ((p) / BITSPERLONG32)
  40. #define TOFST(p)        ((p) % BITSPERLONG32)
  41. #define SET_BIT(b,p)        (b[TIND((p))] |= (01 << ( BITSPERLONG32 - TOFST((p)) -1)))
  42. #define RESET_BIT(b,p)        (b[TIND((p))] &= ~(01 << (BITSPERLONG32 - TOFST((p)) -1)))

  43. /* TLOG record - data part format */
  44. struct tlgrec_data_t {
  45.         TM32I        magic;                        /* magic number - TLOGLRMGC */
  46.         TM32I        tlg_version;                /* version number */
  47.         GTRID        gtrid;                        /* global tran id */
  48.         unsigned short        count;                /* number of entries in grpid array */
  49.         GRPID        loggrp;                        /* coordinator group id */
  50.         GRPID        grpid[TMGMAXGROUPS];        /* group id array */
  51. } ;
  52. #define TLGVERSION 60

  53. /* TLOG record - including both the log data and the TLOG control table */
  54. struct tlgrec_t {
  55.         TM32I                        chksum; /* xor' whole record on TM32I basis */
  56.         struct tlgrec_data_t        data;
  57.         TMTLGCTL                ctl_tbl;
  58. } ;
  59. typedef struct tlgrec_t TLGREC;

  60. extern void         _tmvtoc_errlog _((_TCADEF, char *));
  61. extern short        _tmlocate0 _((_TCADEF, TM32U [], short, short));
  62. extern short        _tmlocate1 _((_TCADEF, TM32U [], short, short));
  63. extern TM32I        _tmcal_chksum _((_TCADEF, TM32I *, int));
  64. extern int        _tlog_commit _((_TCADEF, GTRID *, GRPID, unsigned short,
  65.                                 GRPID [], short *));
  66. extern int        _tlog_eot _((_TCADEF, short));
  67. extern int        _tlog_warmstart _((_TCADEF));
  68. extern int        _tlog_create _((_TCADEF, char *, short, char *, long));
  69. extern int        _tlog_destroy _((_TCADEF, char *, char *, long));
  70. extern int        _tlog_reinit _((_TCADEF, char *, short, char *, long));
  71. extern int        _tlog_start _((_TCADEF, int));
  72. extern void        _tlog_stop _((_TCADEF, int));
  73. extern int        _tlog_open _((_TCADEF, char *, char *, long, short, long));
  74. extern int        _tlog_close _((_TCADEF, int));

  75. #endif
復(fù)制代碼
同上,里面至今還清晰的保留了UNIX系統(tǒng)實(shí)驗(yàn)室的標(biāo)記。。。。
  1. /*      Copyright (c) 1990 Unix System Laboratories, Inc.
  2.         All rights reserved

  3.         THIS IS UNPUBLISHED PROPRIETARY
  4.         SOURCE CODE OF Unix System Laboratories, Inc.
  5.         The copyright notice above does not
  6.         evidence any actual or intended
  7.         publication of such source code.
  8. */
復(fù)制代碼

作者: 三人行必有吾師    時(shí)間: 2012-05-18 21:07
本帖最后由 三人行必有吾師 于 2012-05-18 21:08 編輯

3. Tuxedo的C語(yǔ)言代碼

比如核心的BBL.c(太長(zhǎng)了,這里只取其小片段)
  1. /*
  2. * After checking for transaction timeout,
  3. * this routine goes through the registry table entry list and decrements
  4. * the timeleft field for blocking processes.  If this becomes less than
  5. * or equal to zero, then the process is sent a message to be woken up.
  6. */

  7. static void
  8. #ifdef _TMPROTOTYPES
  9. chk_blockers(_TCADEF)
  10. #else
  11. chk_blockers(_TCARG)
  12. _TCADEF;
  13. #endif
  14. {
  15.         TMRTE *rte, *res, *endp;
  16.         TMSTE tmpste, *ste;
  17.         TMMSG wkmsg;
  18.         TMPROC dummy;        /* for _tmnwkill(_TCARG) */
  19.         static long        oldmday = 0;
  20.         time_t timebuf;
  21.         struct tm *tmptr;
  22.         long decrement;
  23.         static        long         rte_scan_first = 0;
  24.         static        long        getenv_done = 0;
  25.         char         *chptr;
  26.         int spawn_flags = SPAWN_RESTARTSRV|SPAWN_CLEANUPSRV;

  27.         _TCDECLPTR(TUX);

  28.         TMDEBUG(10,("> chk_blockers()"));

  29.         /*
  30.          * Check if new day - if so, write message to userlog
  31.          * so that version information is logged.
  32.          */
  33.         timebuf = (time_t)TUX->_TUX__tmbbp->bbmeters.bm_timestamp;
  34.         tmptr = localtime(&timebuf);

  35.         if (tmptr->tm_mday != oldmday) {
  36.                 /*
  37.                  * Don't log when process first starts since startup
  38.                  * message will already cause version information to
  39.                  * be written.
  40.                  */
  41.                 if (oldmday)
  42.                         (void) userlog(" ");
  43.                 oldmday = tmptr->tm_mday;
  44.         }
  45.         if (!tmsyslock(&TUX->_TUX__tmbbp->bbparms)) {
  46.                 TMDEBUG(10,("< chk_blockers(10) returns"));
  47.                 return;
  48.         }
  49.         /* TRANSACTION MGMT chk_blockers calls _tmgttscan */
  50.         /* CR050720 move _tmgttscan to after while() loop */
  51.         if (!rte_scan_first && !getenv_done) {
  52.                 if ((chptr = tuxgetenv("BBLRTESCANFIRST")) != NULL
  53.                         && (*chptr == 'Y' || *chptr ==  'y'))
  54.                 rte_scan_first = 1;
  55.                 getenv_done = 1;
  56.         }
  57.         if (!rte_scan_first)
  58.                 _tmgttscan(_TCARG);

  59.         res = TUX->_TUX__tmrgstry + TUX->_TUX__tmbbp->bbparms.maxaccsrs;        /* begin of reserved */
  60.         if (TUX->_TUX__tmbbp->bbmap.rgstuse == NIL)
  61.                 rte = res;
  62.         else
  63.                 rte = REGISTRY(TUX->_TUX__tmbbp->bbmap.rgstuse);
  64.         endp = TUX->_TUX__tmrgstry + (TUX->_TUX__tmbbp->bbparms.maxaccsrs + MAXADMIN);

  65.         _tminithdr(_TCARG,&wkmsg);
  66.         wkmsg.mhdr.flags = TMALARM;
  67.         decrement = time((time_t *)NULL) - scanunit_interval_start_time;

  68.         /* CR050720 next 2 lines */
  69.         if (rte_scan_first)
  70.                 (void) tmbblock();
  71.         while (rte < endp) {
  72.                 if ((rte->rt_svctimeout > 0) && (rte->rflags & SERVER)) {
  73.                         /* Processing a service, decrement time left to svc */
  74.                         if (rte->rt_svctimeout <= TUX->_TUX__tmbbp->bbparms.scanunit) {
  75.                                 dummy.PRmid = TUX->_TUX__tmproc.PRmid;
  76.                                 dummy.PRpid = rte->pid;
  77.                                 if (_tmnwkill(_TCARG,&dummy,SIGKILL,5) < 0) {
  78.                                         (void) userlog(_MHS_(CMDTUX_CAT,1666,
  79.                                                         MHS_USERLOG,
  80. "WARN: Could not terminate server(%ld) processing after SVCTIMEOUT"),
  81.                                                         (long) rte->pid);
  82.                                 } else {
  83.                                         (void) userlog(_MHS_(CMDTUX_CAT,1667,
  84.                                                         MHS_USERLOG,
  85. "WARN: Server(%ld) processing terminated after SVCTIMEOUT"), (long) rte->pid);
  86.                                         generate_service_timeout_event(_TCARG, rte);
  87.                                         /* status with TMSVCTIMEDOUT
  88.                                          *        indicates timeout occured so
  89.                                          *        cleanupsrv can detect a timeout
  90.                                          *        for the errordetail
  91.                                          */
  92.                                         SVRGRP(&tmpste) = rte->rt_grpid;
  93.                                         SVRID(&tmpste)  = rte->rt_srvid;
  94.                                         if (tmrsvrs(S_GRPID, &tmpste, &tmpste, NULL) == 1) {
  95.                                                 ste = SERVERS(tmpste.hashlist.rlink);
  96.                                                 ste->global.status |= SVCTIMEDOUT;
  97.                                         }
  98.                                         /* Note that we do not reset
  99.                                          * spawn_flags before this call, so
  100.                                          * that multiple calls will result in
  101.                                          * at most one restartsrv and one
  102.                                          * cleanupsrv process. */
  103.                                         _tmbbclean(_TCARG, TUX->_TUX__tmproc.PRmid, NOTAB, &spawn_flags);
  104.                                         rte->rt_svctimeout = 0;
  105.                                 }
  106.                         } else {
  107.                                 /* decrement by actual time since last scan */
  108.                                 rte->rt_svctimeout -= decrement;

  109.                                 /* reset to zero if negative */
  110.                                 if (rte->rt_svctimeout < 0) rte->rt_svctimeout = 0;
  111.                         }
  112.                 }
  113.                 if (rte->hndl.mtype > 0) {
  114.                         /* found a blocker */
  115.                         if (rte->hndl.timeleft <= TUX->_TUX__tmbbp->bbparms.scanunit) {
  116.                                 /* timeout */
  117.                                 rte->hndl.timeleft = 0;
  118.                                 if (rte->rflags & CONV_RECV)
  119.                                         wkmsg.tmhdr.flag = TPCONV;
  120.                                 wkmsg.mhdr.mtype = rte->hndl.mtype;
  121.                                 wkmsg.tmhdr.rplyiter = rte->hndl.rplyiter;
  122.                                 wkmsg.mhdr.qaddr = rte->hndl.qaddr;
  123. #ifdef CHKSUM
  124.                                 mk_chksum(_TCARG,&wkmsg,0);
  125.                                 mk_chksum(_TCARG,&wkmsg,TMENCODE);
  126. #endif
  127.                                 /* no ENCODEing necessary, local only */
  128.                                 /* CR050720  next 2 lines */
  129.                                 if (rte_scan_first)
  130.                                         (void) tmbbunlock();
  131.                                 if (tmsendm(&wkmsg, TPSIGRSTRT|TPNOBLOCK) < 0) {
  132.                                         if (tperrno != TPEBLOCK)
  133.                                                 (void) userlog( _MHS_(CMDTUX_CAT,42,MHS_USERLOG,
  134. "WARN: BBL failed to wake up the blocking process - %ld"),
  135.                                                 (long)rte->pid);
  136.                                 }
  137.                                 /* CR050720  next 2 lines */
  138.                                 if (rte_scan_first)
  139.                                         (void) tmbblock();
  140.                         } else { /* decrement */
  141.                                 /* decrement by actual time since last scan */
  142.                                 rte->hndl.timeleft -= decrement;

  143.                                 /* reset to zero if negative */
  144.                                 if (rte->hndl.timeleft < 0) rte->hndl.timeleft = 0;
  145.                         }
  146.                 }
  147.                 if (rte >= res) {
  148.                         rte++;
  149.                         continue;
  150.                 }
  151.                 if (rte->nextreg == NIL)
  152.                         rte = res;
  153.                 else
  154.                         rte = REGISTRY(rte->nextreg);
  155.         }
  156.         /* CR050720 next 3 lines */
  157.         if (rte_scan_first) {
  158.                 (void) tmbbunlock();
  159.                 _tmgttscan(_TCARG);
  160.         }
  161.         (void) tmsysunlock(&TUX->_TUX__tmbbp->bbparms);
  162.         TMDEBUG(10,("< chk_blockers(20) returns"));
  163.         return;
  164. }
復(fù)制代碼
其中的
  1. /* CR050720 move _tmgttscan to after while() loop */
復(fù)制代碼
  1. /* CR050720 next 2 lines */
  2.         if (rte_scan_first)
  3.         (void) tmbblock();
復(fù)制代碼
是指補(bǔ)丁修改的印記和注釋?zhuān)诖蠹野惭bTuxedo補(bǔ)丁時(shí),或者在udataobj目錄下patchlev里看到的CRxxxxx就是對(duì)應(yīng)的這些代碼




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2