性能調優概述

          性能調優無疑是個龐大的話題,也是很多項目中非常重要的一環,性能調優的難做是眾所周知的,畢竟性能調優涵蓋的面實在是太多了,在這篇blog中我們蜻蜓點水般的來看看性能調優這項龐大的工程都有些什么過程,同時也看看這些過程中常見的一些做法。
          確定性能調優的目標
          性能調優,首先是要確定性能調優的目標是什么,如果現在應用已經滿足了需求,就沒必要去做性能調優了,畢竟不經過一個系統的過程,其實是無法確定你所做的性能調整是否真的調優了性能,是否沒有造成應用中其他的問題,所以確定性能目標是非常重要的,在定義性能目標的時候通常這么定義的呢:
          1、最大并發數
          2、Quality of Service
             服務的質量,在軟件系統方面我們認為主要表現在請求的出錯率,系統的load等。
          3、最長響應時間
             對于任何請求所能承受的最大響應時間。
          4、TPS
             每秒需要支持的最大事務數,最典型的指標是:“某頁面最高需要支撐每秒7000次的訪問次數”。
          例如一個web系統,需要定義出來的目標是:
          并發目標:最高支撐200并發;
          QoS:出錯率須控制在萬分之一,系統的load最高只能到達10;
          TPS:每秒完成7000次請求的處理;
          最大響應時間:最長允許的響應時間為5秒。
          至于請求的平均響應時間這些就不在性能調優目標中定義,因為要達到TPS的要求,響應時間是必須要達到一個級別的,而且響應時間隨著高并發是會出現劣化的。
          當然,還可以把性能指標定到更為細節,例如某個方法的TPS在100并發時需要達到多少。
          在確定好了性能目標后,重要的就是如何來測量系統的性能了。
          測量系統性能
          對于新系統而言,需要評估出其正式運行時的數據量的增長情況;而對于已運行的系統,則需要根據監控獲取到系統的運行數據(例如高峰并發數、系統的響應速度情況、系統的load、網絡流量、每類請求在總的請求中所占的百分比等)。
          對于新系統而言,要評估出具體的性能相對來說稍微好做一點,因為此時系統通常較為單純,數據量的增長也不可能是一夜之間增長的,因此基本可以按照一種正常的方法在測試環境評估出其正式運行的性能。
          而對于已運行的系統而言,則較為麻煩,因為通常來講要在測試環境中模擬正式運行環境基本是不太可能的,因此這個時候通常要采取一些模擬的方法或更高壓力的方法來盡量更為準確的評估出系統的性能。
          在測試系統性能時,通常可采用的方法有:
          1、單元測試;
             可借助單元測試來測試某個請求的性能;
          2、壓力測試;
             壓力測試無疑是測量系統性能中最常采用的方式,根據定義的性能目標對系統進行壓力測試,以確定系統是否滿足性能要求,同時也可以根據壓力測試的結果來分析系統的瓶頸,進而進行對應的調優,可用于做壓力測試的工具還是不少的,像loadrunner、jmeter等等,不過壓力測試這個話題實在太大了,不在這里展開去講了,不過我也不怎么懂就是,呵呵。
          分析系統性能瓶頸
          根據測量系統性能的結果,多數是可以分析出系統性能的瓶頸,同時還可以結合像jvm堆棧、jprofiler、系統日志等來進行進一步的確定,另外也可以根據性能調優人員的經驗,例如可以去了解開發人員是否采用了不適合的數據結構等。
          簡單說一個線程分析的例子:
          借助kill -3 pid來獲取到目前jvm的線程堆棧信息,特別需要關注的是里面wait for monitor這樣的線程,這種線程是指在等待鎖的線程,等待一兩分鐘后再次kill -3 pid,看看這些wait for monitor的線程的變化情況,這對于分析線程中是否存在不合理的競爭過高的鎖的分析是非常重要的。
          這一步無疑也是性能調優過程中最難的一步了,分析系統性能瓶頸這種基本只能結合實際例子來講了,正確在后續抽取一兩個例子來進行講解。
          性能調優
          在分析出系統性能的瓶頸后,其實這一步相對來說還好做些,當然,需要建立在對軟硬件知識都有很好的深入了解的基礎上,在這里列舉一些比較常見的性能調優的手段,多數是抄來或google來的,自己在這方面的經驗還不多,希望大家多加指點,:)
          Redhat Linux內核
          Redhat linux內核版本升級到2.6,2.6和2.4的差別還是很多的,例如對epoll的支持、NPTL的采用;epoll的支持對于java而言也是很重要的,在高并發的情況下nio是否采用epoll還是有挺大的差別的;而NPTL的采用對于多線程程序而言更是極為重要。
          另外需要關注像linux的File Handles是多少、network buffer是多少、MTU是多少、Memory Page size是多少等等。
          JVM
          JVM調優的文章相對來說比較多,大家需要了解的主要是-Xms/-Xmx、并行GC、-XX:MaxPermSize/-XX:MaxNewSize、-XX:ThreadStackSize、NIO采用epoll等等。
          簡單的列這兩個,其實性能調優的手段還有非常的多,例如簡單的增加CPU、買更快速度的硬盤、增加內存、提升網絡帶寬等這些從硬件角度下手的方式,還有像數據庫調優、應用服務器調優等等。

          暫時就寫這么些了,以后列一些具體的例子來寫,那樣更為清晰些,這樣的話更多的是講述一下過程,可以大概了解下做性能調優應該去學習的知識點,^_^,也歡迎有經驗的同學們貢獻出一些實例的分享。

          posted on 2008-06-29 23:37 BlueDavy 閱讀(6609) 評論(10)  編輯  收藏 所屬分類: Internet

          評論

          # re: 性能調優概述 2008-06-30 13:07 如坐春風

          做外包永遠接觸不到這方面的內容,悲哀啊!  回復  更多評論   

          # re: 性能調優概述[未登錄] 2008-06-30 14:05 jazzy

          最近一直在通過壓力測試來重現生產環境下的performance issue,至今未果。。。  回復  更多評論   

          # re: 性能調優概述 2008-06-30 17:53 Robin's Java World

          @如坐春風
          誰說的?可能只是你做的項目小才沒遇到。  回復  更多評論   

          # re: 性能調優概述 2008-06-30 18:26 混沌中立

          @如坐春風


          如果你接觸到要求比較高的項目,你就會體會到外包客戶在這個方面比較苛刻的要求的。到時候,整天都在調整,測試,調整,測試。壓力很大。  回復  更多評論   

          # re: 性能調優概述 2008-06-30 23:09 如坐春風

          @Robin's Java World

          也許吧。項目主要是實現功能,這方面的需求沒有遇到過。  回復  更多評論   

          # re: 性能調優概述 2008-06-30 23:10 如坐春風

          @混沌中立

          這么說調優也是一個圍城了。
            回復  更多評論   

          # re: 性能調優概述 2008-07-24 13:41 zhuxing

          1、不同的場景,會很大程度上決定使用的調優方法的差異
          例如針對一個后臺分布式web應用進行調優和針對一個類似有IDE的產品進行調優就會有很大的不同。

          2、目標性能瓶頸也很很大程度上決定調優方法的差異
          例如你面臨的調整到底是時間占用的問題還是空間占用的問題

          ...



          最后,很多時候開發人員需要對代碼進行時間占用的優化,可以使用很多工具進行監測,但是千萬別忘記一點,那就是簡單的時間戳作用可是很大的啊...  回復  更多評論   

          # re: 性能調優概述 2008-07-29 09:50 Jack.Wang

          老師很強大!  回復  更多評論   

          # re: 性能調優概述 2008-08-31 22:34 alonesword

          winform 下的調優,白盒測試,我一般使用 aqtime 感覺不錯。很快就能找到 Hotpot  回復  更多評論   

          # re: 性能調優概述[未登錄] 2009-07-11 07:41 Jim

          這篇文章比較high level談了性能調優,期待一些理論聯系實踐的例子和精彩闡述。最近感覺性能調優的確是個無底洞,但應該一步一步,遵循先重要的緊急的瓶頸,follow測量-理解-調整-測量的步驟來調優。  回復  更多評論   

          公告

           









          feedsky
          抓蝦
          google reader
          鮮果

          導航

          <2008年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          統計

          隨筆分類

          隨筆檔案

          文章檔案

          Blogger's

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宁武县| 德惠市| 金乡县| 丹东市| 山阳县| 酉阳| 南部县| 蓬安县| 萝北县| 麻阳| 兴化市| 平安县| 绥中县| 张家港市| 湾仔区| 五大连池市| 扎鲁特旗| 古交市| 公安县| 奉化市| 辽阳县| 安多县| 比如县| 绵竹市| 莆田市| 夏津县| 白山市| 历史| 永仁县| 仁寿县| 库伦旗| 武宣县| 七台河市| 拜城县| 米易县| 伽师县| 嘉荫县| 景宁| 肇源县| 信丰县| 峨眉山市|