<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 193,  comments - 520,  trackbacks - 0
    項(xiàng)目情況:是一個(gè)大型公司的內(nèi)部辦公系統(tǒng),該系統(tǒng)有兩個(gè)和一般企業(yè)應(yīng)用不太一樣的特點(diǎn):一是用戶量非常多,人員數(shù)達(dá)到2W左右,另一個(gè)是采用分級(jí)管理的形式,各個(gè)分公司數(shù)據(jù)分開管理。

    我們的定位:我們是作為業(yè)務(wù)平臺(tái)的提供商參與這個(gè)項(xiàng)目的,我們提供底層的開發(fā)平臺(tái),系統(tǒng)集成商在此基礎(chǔ)上進(jìn)行二次開發(fā)。

    在項(xiàng)目從開發(fā)到部署的過程中遇到了很多的問題,也反映出很多問題。

    一、怎么回事,跑得比貓還慢
    項(xiàng)目開發(fā)完畢后部署在Ibm aix 小型機(jī)上,32G內(nèi)存,16個(gè)cpu。應(yīng)用服務(wù)器采用的是weblogic9.2,數(shù)據(jù)庫是oracle10.0.2。上線后發(fā)現(xiàn)系統(tǒng)運(yùn)行的非常緩慢,甚 至比開發(fā)環(huán)境下的tomcat還要慢。于是開始排查原因,最開始是對(duì)SQL進(jìn)行監(jiān)控,優(yōu)先考慮是數(shù)據(jù)庫訪問性能產(chǎn)生瓶頸。通過監(jiān)控,發(fā)現(xiàn)很多業(yè)務(wù)需要執(zhí)行 大量的SQL語句,查看客戶編寫的相關(guān)代碼,發(fā)現(xiàn)在查詢數(shù)據(jù)時(shí)循環(huán)執(zhí)行了大量SQL。主要原因在于他們?cè)诖a中循環(huán)調(diào)用了我們相關(guān)API,一個(gè)最典型的例 子是通過用戶ID查找用戶NAME,他們?cè)跇I(yè)務(wù)表格里沒有保存用戶name,而是在查詢的時(shí)候通過用戶ID查找用戶name填充到頁面,幾乎每一個(gè)查詢都 是n+1。
     
    另外由于平臺(tái)使用了hibernate,使得oo編程得非常爽快,導(dǎo)致開發(fā)人員完全忽略了相應(yīng)的數(shù)據(jù)庫操作所帶來的壓力。很多業(yè)務(wù)邏輯直接通過PO疊加完成,把一些可以通過很少SQL完成的邏輯全部分散放置到PO里,導(dǎo)致了大量PO的交互和SQL語句。

    開始優(yōu)化SQL,優(yōu)化的同時(shí)增加大量業(yè)務(wù)緩存。但優(yōu)化完畢后運(yùn)行緩慢的現(xiàn)象依舊存在,性能有了一定的提升但是不是非常明顯。繼續(xù)優(yōu)化,其中考慮過 多頻繁訪問的數(shù)據(jù)使用內(nèi)存數(shù)據(jù)庫的方式。但是優(yōu)化過后在tomcat上效果明顯,部署到生產(chǎn)環(huán)境就問題依舊。于是考慮weblogic的配置問題,作為開 發(fā)平臺(tái)提供商,我們只是提供系統(tǒng)開發(fā)相關(guān)方面的支持,對(duì)于應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器只是做基本的配置系統(tǒng)可運(yùn)行即可。但是在這個(gè)問題上系統(tǒng)集成商咬定是我 們平臺(tái)的問題不放,并且存在一個(gè)很嚴(yán)重的問題:他們使用的是盜版的weblogic,這樣根本就沒有相應(yīng)的技術(shù)支持。

    問題的解決:最后是找了一個(gè)BEA曾經(jīng)的開發(fā)人員,問題實(shí)際非常的簡(jiǎn)單,現(xiàn)場(chǎng)部署的weblogic默認(rèn)是運(yùn)行在32位機(jī)器上,與64位機(jī)器存 在一定的不兼容。通過替換相應(yīng)的jar包,問題得到了解決,主要是IO方面。替換完畢后,速度提升了進(jìn)30% 。該開發(fā)人員說,如果沒有l(wèi)isence,根本就不會(huì)得到這些替換的jar包。

    二、內(nèi)存耗盡了
    訪問速度的問題解決了,系統(tǒng)的使用量很快上來,馬上遇到新的問題:內(nèi)存耗盡了。嚴(yán)重到幾乎每天都要out of memory一次。這種問題在客戶現(xiàn)場(chǎng)頻繁出現(xiàn)。

    本地測(cè)試,tomcat,sun jdk 通過Jprofiler監(jiān)測(cè)內(nèi)存使用情況。在并發(fā)訪問門戶的情況下,內(nèi)存確實(shí)存在暴漲的情況,100并發(fā),內(nèi)存使用立刻上升了150m左右,繼續(xù)并發(fā) 100,再增長150m。但是很快在抵達(dá)高峰時(shí)會(huì)有一次gc發(fā)生,內(nèi)存使用穩(wěn)定在200m,內(nèi)存里大量char[]數(shù)組對(duì)象。疲勞測(cè)試,內(nèi)存使用曲線并沒 有出現(xiàn)逐漸上升泄露的情況。換weblogic和jrocket測(cè)試,gc發(fā)生的更加頻繁,內(nèi)存使用穩(wěn)定。
     
    但是現(xiàn)場(chǎng)依舊頻繁當(dāng)機(jī),內(nèi)存根本釋放不了,一直逐漸增長,典型的內(nèi)存泄露。對(duì)系統(tǒng)緩存、單態(tài)對(duì)象包括spring管理的對(duì)象、IO流進(jìn)行了統(tǒng)一 排查,依舊沒有找到內(nèi)存泄露的原因。使用IBM 工具分析heapdump文件,結(jié)果還是大量的char[]數(shù)組對(duì)象占據(jù)內(nèi)存,查找應(yīng)用,找不到相關(guān)業(yè)務(wù)對(duì)象引用。
     
    問題解決:?jiǎn)栴}解決是一篇偶爾搜到的oracle論壇的帖子,這里http://forums.oracle.com/forums/message.jspa?messageID=1040570 。原因在于oracle10的數(shù)據(jù)庫驅(qū)動(dòng)對(duì)statement最后執(zhí)行的結(jié)果集有著引用,并且不會(huì)釋放,目的在于通過內(nèi)存而換取更好的性能。數(shù)據(jù)庫連接采 用的是weblogic的連接池,關(guān)于connection有個(gè)相關(guān)的statement cache設(shè)定,設(shè)定一個(gè)connection能夠被緩存的statement個(gè)數(shù),最大是1024,而現(xiàn)場(chǎng)就被設(shè)定為了1024!connection pool的connection個(gè)數(shù)被設(shè)置為了500 。真是個(gè)恐怖的設(shè)置。在將1024改為10后,內(nèi)存使用量轟然倒地,穩(wěn)定在1g左右。這個(gè)設(shè)置是在前面系統(tǒng)訪問速度存在問題時(shí)由系統(tǒng)集成商的開發(fā)人員設(shè)置 上去的,他們將所有和優(yōu)化相關(guān)的參數(shù)全部開到了最大。這個(gè)問題要是用戶購買的是正版的weblogic和oracle的話,相信也會(huì)很快得到解決。

    三、線程阻塞
    內(nèi)存泄露的問題解決后,線程阻塞的問題浮出水面。系統(tǒng)集成商報(bào)告是線程死鎖,通過分析工具其實(shí)是線程阻塞,主要問題在于系統(tǒng)用到了 synchronized關(guān)鍵字,對(duì)工作流相關(guān)API全部使用了synchronized,原因在這里:http: //ronghao.javaeye.com/blog/205731 。分析發(fā)現(xiàn)一個(gè)工作項(xiàng)提交的操作在連接數(shù)據(jù)庫時(shí)被掛起了20分鐘!造成了大量線程的排隊(duì)阻塞。被掛起的原因有很多種。我們采用的方法是將接口拆分和設(shè)置事 務(wù)timeout時(shí)間。但是這顯然不是一個(gè)好方法。最后是去掉所有的synchronized關(guān)鍵字,將同步的問題交由數(shù)據(jù)庫解決,問題解決。

    四、反思
    1、系統(tǒng)集成商為什么不購買正版?
    2、開發(fā)平臺(tái)提供商究竟在項(xiàng)目開發(fā)中處于一種什么樣的位置?開發(fā)平臺(tái)是否對(duì)所有軟件開發(fā)問題都要負(fù)責(zé)?
    3、開發(fā)平臺(tái)是越封裝越快樂嗎?還是越封裝越丑陋?

    更具體的細(xì)節(jié)在這里:

     AIX+weblogic性能診斷記錄



    http://www.tkk7.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:)
    posted on 2008-09-01 13:49 ronghao 閱讀(4114) 評(píng)論(10)  編輯  收藏 所屬分類: 工作日志

    FeedBack:
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2008-09-01 14:26 | 隔葉黃鶯
    我也碰過這種性能問題,費(fèi)盡周折才穩(wěn)定下來

    我們用的 WAS,連接池默認(rèn)的被緩存的statement個(gè)數(shù)是10,但是用了 hibernate 的應(yīng)用必須把這個(gè)值設(shè)置為0

    其他就一些線程池,JVM 的參數(shù)調(diào)整,Tomcat 就簡(jiǎn)單,沒多少要調(diào)優(yōu)的,不過就是多用戶并發(fā)的時(shí)候直接就會(huì)死掉。  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2008-09-01 15:11 | 特斯通
    這個(gè)問題主要是沒有用正版引起的。jar包引起的問題最好在創(chuàng)建DOMAIN時(shí)不使用weblogic自帶的jdk的JAR。  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2008-09-01 20:42 | Robin's Java World
    @隔葉黃鶯
    為什么Hibernate不能使用被緩存的statement了?能解釋一下嗎?  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2008-09-01 22:36 | leekiang
    一方面大家認(rèn)為做業(yè)務(wù)系統(tǒng)沒有技術(shù)含量,另一方面做的業(yè)務(wù)系統(tǒng)卻奇爛無比,很多做出來的系統(tǒng)連企業(yè)的業(yè)務(wù)數(shù)據(jù)的完整性都保證不了,更不用提別的了。
    很多做業(yè)務(wù)的公司基本是能騙就騙,因?yàn)橐褬I(yè)務(wù)系統(tǒng)做好是需要投入的,還不如招些便宜的新人,做些表面上好像能用的增刪改查,把客戶忽悠過去了事。
    所以說做企業(yè)應(yīng)用注定就是忽悠,但不排除有個(gè)別有錢的甲方自己養(yǎng)人開發(fā)這種情況。
      回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)[未登錄]
    2008-09-02 11:58 | letitbe
    一個(gè)最典型的例子是通過用戶ID查找用戶NAME,他們?cè)跇I(yè)務(wù)表格里沒有保存用戶name,而是在查詢的時(shí)候通過用戶ID查找用戶name填充到頁面,幾乎每一個(gè)查詢都是n+1。
    -----------------------------------
    業(yè)務(wù)表里存用戶的name,我覺得這是一種不好的設(shè)計(jì):一是本身就冗余了;二是如果用戶的name改變了,那么多的業(yè)務(wù)表也要跟著改,太麻煩;另外用戶同名時(shí)容易讓人產(chǎn)生誤解,以為是同一個(gè)人。
    這個(gè)問題可以用數(shù)據(jù)庫分頁+外連接解決啊  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)[未登錄]
    2008-09-02 12:16 | ronghao
    @letitbe
    yes.我要表達(dá)的意思是用戶這樣寫代碼造成了n+1的查詢問題。解決問題的方法可以是外連接,也可以是冗余字段。但是在平臺(tái)封裝提供API的情況下,用戶選擇了最簡(jiǎn)單的直接調(diào)用API,這種方式是我反對(duì)的。由此我也在想平臺(tái)的封裝問題。所以對(duì)所有的業(yè)務(wù)操作我們都提供出直接的connection。  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2008-09-03 19:25 | bf1977
    怎么能查看 部署的weblogic是運(yùn)行在32位機(jī)器上,還是64位機(jī)器?  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2008-09-05 11:09 | zbl400
    我就在想:
    系統(tǒng)集成商為什么不購買正版,并且 那個(gè)大型公司,存在2w以上員工的大公司居然也會(huì)同意不購買正版,難道真的是一點(diǎn)也不顧忌法律嗎?每個(gè)使用者出幾元錢,就能買到正版了吧。
    還想問一下:
    如果抓盜版的話,這個(gè)責(zé)任應(yīng)該是在系統(tǒng)集成商上,還是在大型公司上呢?  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2009-02-12 16:52 | 趙斌
    很好的經(jīng)歷啊,呵呵,部署生產(chǎn)環(huán)境、內(nèi)存溢出、線程阻塞,幾乎每個(gè)大型應(yīng)用上線都遇到的問題,簡(jiǎn)直就是三部曲啊。  回復(fù)  更多評(píng)論
      
    # re: 一次性能調(diào)優(yōu)的實(shí)戰(zhàn)
    2009-06-17 10:22 | ufo
    (web server軟件)UFO不會(huì)出現(xiàn)一個(gè)字節(jié)的內(nèi)存泄漏和一個(gè)線程的不能回收,使用UFO做Web Server的好處是網(wǎng)站能做得很穩(wěn)定,永遠(yuǎn)也不會(huì)自己down掉;UFO在托管機(jī)房丟包率很高、遭受Hacker攻擊、互聯(lián)網(wǎng) 骨干網(wǎng)被黑等惡劣的環(huán)境條件下仍然能很好地運(yùn)行;UFO在對(duì)付Hacker方面(防Hacker弄down和Hacker抓取不該訪問的資源)也有足夠措施。
    另外,UFO幾乎不會(huì)進(jìn)行垃圾回收,消耗CPU很少,在普通的PC Server上用UFO運(yùn)行網(wǎng)站,平時(shí)CPU占用率<0.1%,最多時(shí)也不會(huì)超 過5%。您知道,JVM的垃圾回收會(huì)導(dǎo)致大量的運(yùn)算,消耗很多CPU,從而導(dǎo)致Server的負(fù)載能力和響應(yīng)速度下降。UFO在對(duì)象管理方面采 用了很好的機(jī)制和算法,做得很出色。用UFO運(yùn)行網(wǎng)站,可以一直保證高負(fù)載能力,快速的響應(yīng)速度和低CPU消耗。發(fā)布網(wǎng)址:www.gm365.com
      回復(fù)  更多評(píng)論
      
    <2008年9月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    關(guān)注工作流和企業(yè)業(yè)務(wù)流程改進(jìn)。現(xiàn)就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

    常用鏈接

    留言簿(38)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    常去的網(wǎng)站

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 一级免费黄色大片| 亚洲女人18毛片水真多| 亚洲中久无码不卡永久在线观看| 亚洲视屏在线观看| 亚洲av综合av一区| 久久亚洲AV午夜福利精品一区| 人与禽交免费网站视频| 777成影片免费观看| 久久国产乱子伦免费精品| 91大神免费观看| 成人免费的性色视频| 最近免费中文字幕mv在线电影 | 午夜视频免费成人| 免费无码又爽又刺激聊天APP| 一边摸一边桶一边脱免费视频| 亚洲色偷偷偷网站色偷一区| 久久精品亚洲一区二区 | 久久嫩草影院免费看夜色| 亚欧国产一级在线免费| 大片免费观看92在线视频线视频| 亚洲欧洲国产成人精品| 亚洲av无码国产综合专区| 亚洲欧美国产国产综合一区| 亚洲国产无线乱码在线观看| 美国免费高清一级毛片| 国产精品1024在线永久免费| 182tv免费视频在线观看| 91香蕉国产线在线观看免费| 久久久高清免费视频| 国产美女a做受大片免费| 亚洲色图综合在线| 午夜亚洲AV日韩AV无码大全| 精品日韩99亚洲的在线发布| 亚洲av无码专区亚洲av不卡| 日本一区二区三区免费高清在线 | 久久夜色精品国产亚洲av| 亚洲精品无码精品mV在线观看| 国产在线a不卡免费视频| 亚洲中久无码永久在线观看同| 永久免费无码网站在线观看| 精品国产香蕉伊思人在线在线亚洲一区二区|