性能調優無疑是個龐大的話題,也是很多項目中非常重要的一環,性能調優的難做是眾所周知的,畢竟性能調優涵蓋的面實在是太多了,在這篇blog中我們蜻蜓點水般的來看看性能調優這項龐大的工程都有些什么過程,同時也看看這些過程中常見的一些做法。
確定性能調優的目標
性能調優,首先是要確定性能調優的目標是什么,如果現在應用已經滿足了需求,就沒必要去做性能調優了,畢竟不經過一個系統的過程,其實是無法確定你所做的性能調整是否真的調優了性能,是否沒有造成應用中其他的問題,所以確定性能目標是非常重要的,在定義性能目標的時候通常這么定義的呢:
1、最大并發數
2、Quality of Service
服務的質量,在軟件系統方面我們認為主要表現在請求的出錯率,系統的load等。
3、最長響應時間
對于任何請求所能承受的最大響應時間。
4、TPS
每秒需要支持的最大事務數,最典型的指標是:“某頁面最高需要支撐每秒7000次的訪問次數”。
例如一個web系統,需要定義出來的目標是:
并發目標:最高支撐200并發;
QoS:出錯率須控制在萬分之一,系統的load最高只能到達10;
TPS:每秒完成7000次請求的處理;
最大響應時間:最長允許的響應時間為5秒。
至于請求的平均響應時間這些就不在性能調優目標中定義,因為要達到TPS的要求,響應時間是必須要達到一個級別的,而且響應時間隨著高并發是會出現劣化的。
當然,還可以把性能指標定到更為細節,例如某個方法的TPS在100并發時需要達到多少。
在確定好了性能目標后,重要的就是如何來測量系統的性能了。
測量系統性能
對于新系統而言,需要評估出其正式運行時的數據量的增長情況;而對于已運行的系統,則需要根據監控獲取到系統的運行數據(例如高峰并發數、系統的響應速度情況、系統的load、網絡流量、每類請求在總的請求中所占的百分比等)。
對于新系統而言,要評估出具體的性能相對來說稍微好做一點,因為此時系統通常較為單純,數據量的增長也不可能是一夜之間增長的,因此基本可以按照一種正常的方法在測試環境評估出其正式運行的性能。
而對于已運行的系統而言,則較為麻煩,因為通常來講要在測試環境中模擬正式運行環境基本是不太可能的,因此這個時候通常要采取一些模擬的方法或更高壓力的方法來盡量更為準確的評估出系統的性能。
在測試系統性能時,通??刹捎玫姆椒ㄓ校?br />
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、買更快速度的硬盤、增加內存、提升網絡帶寬等這些從硬件角度下手的方式,還有像數據庫調優、應用服務器調優等等。
暫時就寫這么些了,以后列一些具體的例子來寫,那樣更為清晰些,這樣的話更多的是講述一下過程,可以大概了解下做性能調優應該去學習的知識點,^_^,也歡迎有經驗的同學們貢獻出一些實例的分享。