一. 引言
性能測試與分析是 軟件開發(fā) 過程中介于 架構(gòu) 和調(diào)整的一個廣泛并比較不容易理解的領(lǐng)域,更是一項(xiàng)較為復(fù)雜的活動。就像下棋游戲一樣,有效的性能測試和分析只能在一個良好的計(jì)劃策略和具備了對不可預(yù)料事件的處理能力的條件下順利地完成。
二. 測量Web服務(wù)器的性能
測量web服務(wù)器的性能是一項(xiàng)讓人感到畏縮的任務(wù),但是我們在這里將給出一些需要注意的地方并且指點(diǎn)你了解其中更多的細(xì)節(jié)性的內(nèi)容。它不像一些簡單的任務(wù),如測量CPU的速率或者是測量程序占用CPU的比例,web服務(wù)器的性能優(yōu)化中包括許調(diào)整許多變量來達(dá)到目標(biāo)。許多的測量策略中都包含了一個看似簡單的瀏覽實(shí)際上是在向服務(wù)器發(fā)送大量的請求,我們稱之為客戶端的程序,來測量響應(yīng)時間??蛻舳撕头?wù)器端是在同一臺機(jī)器上嗎?服務(wù)器在測試的時候還運(yùn)行著其它的什么程序嗎?客戶端和服務(wù)器端的通訊是通過局域網(wǎng),100baseT,10baseT還是使用調(diào)制解調(diào)器?客戶端是否一直重復(fù)請求相同的頁面,還是隨機(jī)地訪問不同的頁面?(這些影響到了服務(wù)緩存的性能)客戶端發(fā)送請求的有規(guī)律的還是突發(fā)的?你是在最終的配置環(huán)境下運(yùn)行服務(wù)的還是在調(diào)試的配置環(huán)境下運(yùn)行服務(wù)的?客戶端請求中包含圖片還是只有 HTML 頁面?是否有請求是通過 servlet s和JSP的,CGI程序,服務(wù)端包含(Server-Side Includes ,SSI是一個可以讓你使用動態(tài) HTML 文件的技術(shù))?所有這些都將是我們要關(guān)心的,并且?guī)缀跷覀儾豢赡芫_地把所有的問題都清楚地列出來。
1.壓力測試工具
“工欲善其事,必先利其器”,壓力測試只有借助于一些工具才可得以實(shí)施。
大多數(shù)web壓力測試工具的實(shí)現(xiàn)原理都是通過重復(fù)的大量的頁面請求來模擬多用戶對被測系統(tǒng)的并發(fā)訪問,以此達(dá)到產(chǎn)生壓力的目的。產(chǎn)生壓力的手段都是通過錄制或者是編寫壓力腳本,這些腳本以多個進(jìn)程或者線程的形式在客戶端運(yùn)行,這樣通過人為制造各種類型的壓力,我們可以觀察被測系統(tǒng)在各種壓力狀況下的表現(xiàn),從而定位系統(tǒng)瓶頸,作為系統(tǒng)調(diào)優(yōu)的基礎(chǔ)。目前已經(jīng)存在的性能測試工具林林總總,數(shù)量不下一百種,從單一的開放源碼的免費(fèi)小工具如 Aapache 自帶的 web 性能測試工具 Apache Benchmark、開源的Jmeter 到大而全的商業(yè)性能測試軟件如 Mercury 的 LoadRunner 等等。任何性能測試工具都有其優(yōu)缺點(diǎn),我們可以根據(jù)實(shí)際情況挑選用最合適的工具。您可以在這里找到一些web壓力測試工具 http://www.softwareqatest.com/qatweb1.html#LOAD
這里我們所使用的工具要支持web應(yīng)用服務(wù)認(rèn)證才可以,要支持接收發(fā)送cookies,不僅如此 Tomcat 支持多種認(rèn)證方式,比如基本認(rèn)證、基于表單的認(rèn)證、相互認(rèn)證和客戶端認(rèn)證,而一些工具僅僅支持HTTP基本認(rèn)證。真實(shí)地模擬用戶認(rèn)證是性能測試工具的一個重要的部分,因?yàn)檎J(rèn)證機(jī)制將對一個web站點(diǎn)的性能特征產(chǎn)生重要的影響。基于你在產(chǎn)品中使用的不同的認(rèn)證方式,你需要從上面的工具列表中選擇使用這種特性的測試工具。
Apache Benchmark和http_load是命令行形式的工具,非常易于使用。Apache Benchmark可以模仿單獨(dú)的URL請求并且重復(fù)地執(zhí)行,可以使用不同的命令行參數(shù)來控制執(zhí)行迭代的次數(shù),并發(fā)用戶數(shù)等等。它的一個特點(diǎn)是可以周期性地打印出處理過程的信息,而其它工具只能給出一個全局的報(bào)告。
2.壓力測試工具介紹
三. 外部環(huán)境的調(diào)整
在Tomcat和應(yīng)用程序進(jìn)行了壓力測試后,如果您對應(yīng)用程序的性能結(jié)果不太滿意,就可以采取一些性能調(diào)整措施了,當(dāng)然了前提是應(yīng)用程序沒有問題,我們這里只講Tomcat的調(diào)整。由于Tomcat的運(yùn)行依賴于JVM,所以在這里我們把Tomcat的調(diào)整可以分為兩類來詳細(xì)描述:
外部環(huán)境調(diào)整
調(diào)整非Tomcat組件,例如Tomcat運(yùn)行的操作系統(tǒng)和運(yùn)行Tomcat的 php ?name=java" onclick="tagshow(event)" class="t_tag">java虛擬機(jī)。
自身調(diào)整
修改Tomcat自身的參數(shù),調(diào)整Tomcat配置文件中的參數(shù)。
下面我們將詳細(xì)講解外部環(huán)境調(diào)整的有關(guān)內(nèi)容,Tomcat自身調(diào)整的內(nèi)容將在第2部分中闡述。
1.JAVA虛擬機(jī)性能優(yōu)化
Tomcat本身不能直接在計(jì)算機(jī)上運(yùn)行,需要依賴于硬件基礎(chǔ)之上的操作系統(tǒng)和一個java虛擬機(jī)。您可以選擇自己的需要選擇不同的操作系統(tǒng)和對應(yīng)的 JDK 的版本(只要是符合Sun發(fā)布的Java規(guī)范的),但我們推薦您使用Sun公司發(fā)布的 JDK 。確保您所使用的版本是最新的,因?yàn)镾un公司和其它一些公司一直在為提高性能而對java虛擬機(jī)做一些升級改進(jìn)。一些報(bào)告顯示 JDK 1.4在性能上比 JDK 1.3提高了將近10%到20%。
可以給Java虛擬機(jī)設(shè)置使用的內(nèi)存,但是如果你的選擇不對的話,虛擬機(jī)不會補(bǔ)償。可通過命令行的方式改變虛擬機(jī)使用內(nèi)存的大小。如下表所示有兩個參數(shù)用來設(shè)置虛擬機(jī)使用內(nèi)存的大小。
參數(shù)? ? ? ? 描述
-Xms<size>? ? ? ? JVM初始化堆的大小
-Xmx<size>? ? ? ? JVM堆的最大值
這兩個值的大小一般根據(jù)需要進(jìn)行設(shè)置。初始化堆的大小執(zhí)行了虛擬機(jī)在啟動時向系統(tǒng)申請的內(nèi)存的大小。一般而言,這個參數(shù)不重要。但是有的應(yīng)用程序在大負(fù)載的情況下會急劇地占用更多的內(nèi)存,此時這個參數(shù)就是顯得非常重要,如果虛擬機(jī)啟動時設(shè)置使用的內(nèi)存比較小而在這種情況下有許多對象進(jìn)行初始化,虛擬機(jī)就必須重復(fù)地增加內(nèi)存來滿足使用。由于這種原因,我們一般把-Xms和-Xmx設(shè)為一樣大,而堆的最大值受限于系統(tǒng)使用的物理內(nèi)存。一般使用數(shù)據(jù)量較大的應(yīng)用程序會使用持久對象,內(nèi)存使用有可能迅速地增長。當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時虛擬機(jī)就會提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值的80%。
Tomcat默認(rèn)可以使用的內(nèi)存為128MB,在較大型的應(yīng)用項(xiàng)目中,這點(diǎn)內(nèi)存是不夠的,需要調(diào)大。
Windows 下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下設(shè)置:
JAVA_OPTS='-Xms【初始化內(nèi)存大小】 -Xmx【可以使用的最大內(nèi)存】'
需要把這個兩個參數(shù)值調(diào)大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化內(nèi)存為256MB,可以使用的最大內(nèi)存為512MB。
另外需要考慮的是Java提供的垃圾回收機(jī)制。虛擬機(jī)的堆大小決定了虛擬機(jī)花費(fèi)在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應(yīng)用有關(guān),應(yīng)該通過分析實(shí)際的垃圾收集的時間和頻率來調(diào)整。如果堆的大小很大,那么完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和內(nèi)存的需要一致,完全收集就很快,但是會更加頻繁。調(diào)整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內(nèi)最大化處理客戶的請求。在基準(zhǔn)測試的時候,為保證最好的性能,要把堆的大小設(shè)大,保證垃圾收集不在整個基準(zhǔn)測試的過程中出現(xiàn)。
如果系統(tǒng)花費(fèi)很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應(yīng)該不超過 3-5 秒。如果垃圾收集成為瓶頸,那么需要指定代的大小,檢查垃圾收集的詳細(xì)輸出,研究 垃圾收集參數(shù)對性能的影響。一般說來,你應(yīng)該使用物理內(nèi)存的 80% 作為堆大小。當(dāng)增加處理器時,記得增加內(nèi)存,因?yàn)榉峙淇梢圆⑿羞M(jìn)行,而垃圾收集不是并行的。
性能測試與分析是 軟件開發(fā) 過程中介于 架構(gòu) 和調(diào)整的一個廣泛并比較不容易理解的領(lǐng)域,更是一項(xiàng)較為復(fù)雜的活動。就像下棋游戲一樣,有效的性能測試和分析只能在一個良好的計(jì)劃策略和具備了對不可預(yù)料事件的處理能力的條件下順利地完成。
二. 測量Web服務(wù)器的性能
測量web服務(wù)器的性能是一項(xiàng)讓人感到畏縮的任務(wù),但是我們在這里將給出一些需要注意的地方并且指點(diǎn)你了解其中更多的細(xì)節(jié)性的內(nèi)容。它不像一些簡單的任務(wù),如測量CPU的速率或者是測量程序占用CPU的比例,web服務(wù)器的性能優(yōu)化中包括許調(diào)整許多變量來達(dá)到目標(biāo)。許多的測量策略中都包含了一個看似簡單的瀏覽實(shí)際上是在向服務(wù)器發(fā)送大量的請求,我們稱之為客戶端的程序,來測量響應(yīng)時間??蛻舳撕头?wù)器端是在同一臺機(jī)器上嗎?服務(wù)器在測試的時候還運(yùn)行著其它的什么程序嗎?客戶端和服務(wù)器端的通訊是通過局域網(wǎng),100baseT,10baseT還是使用調(diào)制解調(diào)器?客戶端是否一直重復(fù)請求相同的頁面,還是隨機(jī)地訪問不同的頁面?(這些影響到了服務(wù)緩存的性能)客戶端發(fā)送請求的有規(guī)律的還是突發(fā)的?你是在最終的配置環(huán)境下運(yùn)行服務(wù)的還是在調(diào)試的配置環(huán)境下運(yùn)行服務(wù)的?客戶端請求中包含圖片還是只有 HTML 頁面?是否有請求是通過 servlet s和JSP的,CGI程序,服務(wù)端包含(Server-Side Includes ,SSI是一個可以讓你使用動態(tài) HTML 文件的技術(shù))?所有這些都將是我們要關(guān)心的,并且?guī)缀跷覀儾豢赡芫_地把所有的問題都清楚地列出來。
1.壓力測試工具
“工欲善其事,必先利其器”,壓力測試只有借助于一些工具才可得以實(shí)施。
大多數(shù)web壓力測試工具的實(shí)現(xiàn)原理都是通過重復(fù)的大量的頁面請求來模擬多用戶對被測系統(tǒng)的并發(fā)訪問,以此達(dá)到產(chǎn)生壓力的目的。產(chǎn)生壓力的手段都是通過錄制或者是編寫壓力腳本,這些腳本以多個進(jìn)程或者線程的形式在客戶端運(yùn)行,這樣通過人為制造各種類型的壓力,我們可以觀察被測系統(tǒng)在各種壓力狀況下的表現(xiàn),從而定位系統(tǒng)瓶頸,作為系統(tǒng)調(diào)優(yōu)的基礎(chǔ)。目前已經(jīng)存在的性能測試工具林林總總,數(shù)量不下一百種,從單一的開放源碼的免費(fèi)小工具如 Aapache 自帶的 web 性能測試工具 Apache Benchmark、開源的Jmeter 到大而全的商業(yè)性能測試軟件如 Mercury 的 LoadRunner 等等。任何性能測試工具都有其優(yōu)缺點(diǎn),我們可以根據(jù)實(shí)際情況挑選用最合適的工具。您可以在這里找到一些web壓力測試工具 http://www.softwareqatest.com/qatweb1.html#LOAD
這里我們所使用的工具要支持web應(yīng)用服務(wù)認(rèn)證才可以,要支持接收發(fā)送cookies,不僅如此 Tomcat 支持多種認(rèn)證方式,比如基本認(rèn)證、基于表單的認(rèn)證、相互認(rèn)證和客戶端認(rèn)證,而一些工具僅僅支持HTTP基本認(rèn)證。真實(shí)地模擬用戶認(rèn)證是性能測試工具的一個重要的部分,因?yàn)檎J(rèn)證機(jī)制將對一個web站點(diǎn)的性能特征產(chǎn)生重要的影響。基于你在產(chǎn)品中使用的不同的認(rèn)證方式,你需要從上面的工具列表中選擇使用這種特性的測試工具。
Apache Benchmark和http_load是命令行形式的工具,非常易于使用。Apache Benchmark可以模仿單獨(dú)的URL請求并且重復(fù)地執(zhí)行,可以使用不同的命令行參數(shù)來控制執(zhí)行迭代的次數(shù),并發(fā)用戶數(shù)等等。它的一個特點(diǎn)是可以周期性地打印出處理過程的信息,而其它工具只能給出一個全局的報(bào)告。
2.壓力測試工具介紹
三. 外部環(huán)境的調(diào)整
在Tomcat和應(yīng)用程序進(jìn)行了壓力測試后,如果您對應(yīng)用程序的性能結(jié)果不太滿意,就可以采取一些性能調(diào)整措施了,當(dāng)然了前提是應(yīng)用程序沒有問題,我們這里只講Tomcat的調(diào)整。由于Tomcat的運(yùn)行依賴于JVM,所以在這里我們把Tomcat的調(diào)整可以分為兩類來詳細(xì)描述:
外部環(huán)境調(diào)整
調(diào)整非Tomcat組件,例如Tomcat運(yùn)行的操作系統(tǒng)和運(yùn)行Tomcat的 php ?name=java" onclick="tagshow(event)" class="t_tag">java虛擬機(jī)。
自身調(diào)整
修改Tomcat自身的參數(shù),調(diào)整Tomcat配置文件中的參數(shù)。
下面我們將詳細(xì)講解外部環(huán)境調(diào)整的有關(guān)內(nèi)容,Tomcat自身調(diào)整的內(nèi)容將在第2部分中闡述。
1.JAVA虛擬機(jī)性能優(yōu)化
Tomcat本身不能直接在計(jì)算機(jī)上運(yùn)行,需要依賴于硬件基礎(chǔ)之上的操作系統(tǒng)和一個java虛擬機(jī)。您可以選擇自己的需要選擇不同的操作系統(tǒng)和對應(yīng)的 JDK 的版本(只要是符合Sun發(fā)布的Java規(guī)范的),但我們推薦您使用Sun公司發(fā)布的 JDK 。確保您所使用的版本是最新的,因?yàn)镾un公司和其它一些公司一直在為提高性能而對java虛擬機(jī)做一些升級改進(jìn)。一些報(bào)告顯示 JDK 1.4在性能上比 JDK 1.3提高了將近10%到20%。
可以給Java虛擬機(jī)設(shè)置使用的內(nèi)存,但是如果你的選擇不對的話,虛擬機(jī)不會補(bǔ)償。可通過命令行的方式改變虛擬機(jī)使用內(nèi)存的大小。如下表所示有兩個參數(shù)用來設(shè)置虛擬機(jī)使用內(nèi)存的大小。
參數(shù)? ? ? ? 描述
-Xms<size>? ? ? ? JVM初始化堆的大小
-Xmx<size>? ? ? ? JVM堆的最大值
這兩個值的大小一般根據(jù)需要進(jìn)行設(shè)置。初始化堆的大小執(zhí)行了虛擬機(jī)在啟動時向系統(tǒng)申請的內(nèi)存的大小。一般而言,這個參數(shù)不重要。但是有的應(yīng)用程序在大負(fù)載的情況下會急劇地占用更多的內(nèi)存,此時這個參數(shù)就是顯得非常重要,如果虛擬機(jī)啟動時設(shè)置使用的內(nèi)存比較小而在這種情況下有許多對象進(jìn)行初始化,虛擬機(jī)就必須重復(fù)地增加內(nèi)存來滿足使用。由于這種原因,我們一般把-Xms和-Xmx設(shè)為一樣大,而堆的最大值受限于系統(tǒng)使用的物理內(nèi)存。一般使用數(shù)據(jù)量較大的應(yīng)用程序會使用持久對象,內(nèi)存使用有可能迅速地增長。當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時虛擬機(jī)就會提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值的80%。
Tomcat默認(rèn)可以使用的內(nèi)存為128MB,在較大型的應(yīng)用項(xiàng)目中,這點(diǎn)內(nèi)存是不夠的,需要調(diào)大。
Windows 下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件{tomcat_home}/bin/catalina.sh的前面,增加如下設(shè)置:
JAVA_OPTS='-Xms【初始化內(nèi)存大小】 -Xmx【可以使用的最大內(nèi)存】'
需要把這個兩個參數(shù)值調(diào)大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化內(nèi)存為256MB,可以使用的最大內(nèi)存為512MB。
另外需要考慮的是Java提供的垃圾回收機(jī)制。虛擬機(jī)的堆大小決定了虛擬機(jī)花費(fèi)在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應(yīng)用有關(guān),應(yīng)該通過分析實(shí)際的垃圾收集的時間和頻率來調(diào)整。如果堆的大小很大,那么完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和內(nèi)存的需要一致,完全收集就很快,但是會更加頻繁。調(diào)整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內(nèi)最大化處理客戶的請求。在基準(zhǔn)測試的時候,為保證最好的性能,要把堆的大小設(shè)大,保證垃圾收集不在整個基準(zhǔn)測試的過程中出現(xiàn)。
如果系統(tǒng)花費(fèi)很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應(yīng)該不超過 3-5 秒。如果垃圾收集成為瓶頸,那么需要指定代的大小,檢查垃圾收集的詳細(xì)輸出,研究 垃圾收集參數(shù)對性能的影響。一般說來,你應(yīng)該使用物理內(nèi)存的 80% 作為堆大小。當(dāng)增加處理器時,記得增加內(nèi)存,因?yàn)榉峙淇梢圆⑿羞M(jìn)行,而垃圾收集不是并行的。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
