天天看點

軟體測試方法進行調優,軟體測試中性能調優的過程解析

性能調優無疑是個龐大的話題,也是很多項目中非常重要的一環,性能調優的難做是衆所周知的,畢竟性能調優涵蓋的面實在是太多了,在這篇文章中我們蜻蜓點水般的來看看性能調優這項龐大的工程都有些什麼過程,同時也看看這些過程中常見的一些做法。

确定性能調優的目标

性能調優,首先是要确定性能調優的目标是什麼,如果現在應用已經滿足了需求,就沒必要去做性能調優了,畢竟不經過一個系統的過程,其實是無法确定你所做的性能調整是否真的調優了性能,是否沒有造成應用中其他的問題,是以确定性能目标是非常重要的,在定義性能目标的時候通常這麼定義的呢:

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、買更快速度的硬碟、增加記憶體、提升網絡帶寬等這些從硬體角度下手的方式,還有像資料庫調優、應用伺服器調優等等。