Jmeter的性能測(cè)試

在眾多類型的軟件測(cè)試中,性能測(cè)試以軟件響應(yīng)速度為測(cè)試目標(biāo),尤其是在較短時(shí)間內(nèi)大量并發(fā)用戶的訪問時(shí)凿跳,軟件是否具有良好的抗壓能力晕翠。本章以JMeter為性能測(cè)試工具垢箕,LifeRay為被測(cè)應(yīng)用,介紹如何完成常用的壓力測(cè)試和性能測(cè)試:Web測(cè)試和數(shù)據(jù)庫測(cè)試蒜茴。

Apache JMeter是個(gè)純Java的應(yīng)用程序骡显,提供了可擴(kuò)展自定義腳本功能疆栏,用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(靜態(tài)文件、Servlet惫谤、Java對(duì)象壁顶、數(shù)據(jù)庫和FTP服務(wù)器等)進(jìn)行性能測(cè)試。它可以針對(duì)服務(wù)器溜歪、網(wǎng)絡(luò)或?qū)ο竽M大量并發(fā)負(fù)載來進(jìn)行強(qiáng)度測(cè)試若专,并分析不同壓力負(fù)載下的系統(tǒng)整體性能,包括性能的圖形分析蝴猪。

與其說JMeter是一個(gè)測(cè)試工具调衰,不如說是一個(gè)測(cè)試框架。因?yàn)镴Meter支持范圍非常廣:

1) 通過取樣器自阱,支持許多協(xié)議嚎莉,如HTTP/ TCP/FTP/JDBC/SOAP/LDAP/JMS/MAIL;

針對(duì)不同的協(xié)議或不同的應(yīng)用沛豌,配置相應(yīng)的JMeter元件趋箩,所以在JMeter使用過程中,要熟悉各種元件的配置加派,而不僅僅局限于http請(qǐng)求阁簸。

2)? 跨平臺(tái),即在所有支持JVM的平臺(tái)上都可以運(yùn)行JMeter哼丈;

3) 支持多語言启妹,所有支持BSF(Bean Scripting Framework)的腳本語言可使用。

目前各種常見的應(yīng)用(如Servlets醉旦、Perl scripts饶米、Java Objects、Databases, FTP Servers)等都可以采用JMeter來完成性能測(cè)試车胡。JMeter的一大好處就是它內(nèi)部已經(jīng)實(shí)現(xiàn)了線程機(jī)制(線程組)檬输,用戶不用為并發(fā)負(fù)載的過程編寫代碼,只須做簡(jiǎn)單配置即可匈棘。同時(shí)丧慈,JMeter也提供了豐富的邏輯控制器,控制線程的運(yùn)行;其次逃默,JMeter對(duì)測(cè)試結(jié)果能產(chǎn)生相應(yīng)的統(tǒng)計(jì)報(bào)表鹃愤,簡(jiǎn)單、直觀完域,對(duì)一般性能測(cè)試應(yīng)該足夠软吐。

JMeter現(xiàn)在作為Web程序的性能測(cè)試工具,已經(jīng)得到廣泛應(yīng)用吟税。測(cè)試完成后凹耙,JMeter會(huì)形成一個(gè)performance報(bào)表,里面詳細(xì)地記載了各個(gè)URL請(qǐng)求的數(shù)量肠仪、平均響應(yīng)時(shí)間肖抱、最小/大響應(yīng)時(shí)間、錯(cuò)誤率等异旧。

JMeter除了做性能測(cè)試虐沥,也能做功能測(cè)試,特別在API層次(SOAP和REST)泽艘。這里把JMeter和Selenium做個(gè)比較欲险,以便對(duì)JMeter有進(jìn)一步的了解。

1. JMeter測(cè)試的優(yōu)勢(shì)

1) 不依賴于界面匹涮。通過API調(diào)用或參數(shù)傳遞天试,可以添加測(cè)試用例并執(zhí)行測(cè)試;

2) 測(cè)試腳本不須要編程然低,熟悉業(yè)務(wù)流程和http請(qǐng)求喜每,就可以根據(jù)頁面中input對(duì)象來編寫測(cè)試用例;

3) 可以跳過頁面限制雳攘,向后臺(tái)程序添加非法數(shù)據(jù)带兜,這樣可以測(cè)試后臺(tái)程序的健壯性,利用這個(gè)功能還能進(jìn)行安全性測(cè)試吨灭;

4) 利用badboy錄制測(cè)試過程刚照,可以快速地生成測(cè)試腳本;

5) JMeter斷言可以驗(yàn)證程序中是否有需要得到的值喧兄;

6) 使用參數(shù)化及提供的函數(shù)功能无畔,可以快速完成測(cè)試數(shù)據(jù)的添加和修改等。

2. JMeter測(cè)試的缺點(diǎn)

使用JMeter無法驗(yàn)證JS程序吠冤,也無法驗(yàn)證頁面UI浑彰,所以須要和Selenium配合來完成Web2.0應(yīng)用的測(cè)試。

安裝

從官方網(wǎng)站(http://jakarta.apache.org/jmeter)下載并解壓之后即可使用拯辙。最新版(即2.3.2)郭变,需要JDK 1.4及其以上版本,不再支持JDK 1.3。下載解壓的JMeter有以下幾個(gè)目錄:bin诉濒、docs周伦、extras、lib和printable_docs等循诉。

1. bin目錄

對(duì)于Windows用戶來說,運(yùn)行JMeter.bat就可以看見JMeter的Swing GUI客戶端撇他∏衙ǎ可以根據(jù)自己機(jī)器的特定配置來調(diào)整JMeter.bat中JVM調(diào)優(yōu)設(shè)置,如下所示:

? ? set HEAP=-Xms256m -Xmx256m

? ? set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m

? ? set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%

? ? set TENURING=-XX:MaxTenuringThreshold=2

? ? set EVACUATION=-XX:MaxLiveObjectEvacuationRatio=20%

? ? set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000

? ? -Dsun.rmi.dgc.server.gcInterval=600000

? ? set PERM=-XX:PermSize=64m -XX:MaxPermSize=64m

? ? set DEBUG=-verbose:gc -XX:+PrintTenuringDistribution

根據(jù)使用經(jīng)驗(yàn)困肩,Java堆值最多是物理內(nèi)存的一半划纽。如果機(jī)器的物理內(nèi)存為512MB,那么選用默認(rèn)值即可锌畸;如果機(jī)器的物理內(nèi)存低于512MB勇劣,最好將命令行中參數(shù)調(diào)小,否則JMeter運(yùn)行會(huì)很慢潭枣,甚至在JMeter.log文件里能夠看到“內(nèi)存溢出”錯(cuò)誤比默。順便提一下,如果JMeter出現(xiàn)異常盆犁,第一步就是檢查JMeter.log的日志信息命咐。 bin目錄下文件JMeter.properties中有一個(gè)參數(shù)log_level.JMeter。當(dāng)須要查錯(cuò)時(shí)谐岁,我們可以把它設(shè)成DEBUG(默認(rèn)是INFO)來獲得更詳細(xì)的日志信息醋奠。

2. Docs和printable_docs目錄

Docs目錄下面的文件是JMeter的Java Docs,而printable_docs的usermanual子目錄下的內(nèi)容是JMeter的用戶手冊(cè)文檔伊佃,相關(guān)文檔還算詳細(xì)窜司,一般需要的內(nèi)容都能查到,但都是英文的航揉。

3. extras目錄

Extras目錄下的文件是為了對(duì)構(gòu)建工具Ant提供支持塞祈。可使用ant實(shí)現(xiàn)測(cè)試自動(dòng)化的部分工作帅涂,如批量腳本的自動(dòng)執(zhí)行织咧,產(chǎn)生HTML格式的報(bào)表。

4. lib目錄

lib目錄下還有兩個(gè)目錄:一個(gè)是ext漠秋,此目錄存放JMeter的核心jar包笙蒙;另一個(gè)是junit目錄,此目錄存放JUnit測(cè)試腳本庆锦。用戶的擴(kuò)展所依賴的包則要直接放在lib下(不是lib/ext下)捅位。

Badbody進(jìn)行腳本錄制

JMeter提供了一個(gè)利用本地Proxy Server(代理服務(wù)器)來錄制生成測(cè)試腳本的功能,這個(gè)功能不夠直觀(要用到代理服務(wù)器),而且JMeter的代理目前不支持HTTPS的錄制艇搀。由于HTTPS協(xié)議是加密的尿扯,該代理無法解密通信內(nèi)容和請(qǐng)求參數(shù)。

Badboy是一款不錯(cuò)的Web自動(dòng)化測(cè)試輔助工具焰雕,它提供了將Web測(cè)試腳本直接導(dǎo)出生成JMeter腳本的功能衷笋。無論是用于非商業(yè)用途或商業(yè)用途,如果安裝Badboy的機(jī)器數(shù)量不超過5臺(tái)矩屁,是不須要為它支付任何費(fèi)用的辟宗。

通過Badboy的官方網(wǎng)站(http://www.badboy.com.au/)下載Badboy的最新版本,其安裝過程同一般的Windows應(yīng)用程序沒有什么區(qū)別吝秕。安裝完成后泊脐,可以執(zhí)行桌面或Windows開始菜單中的快捷方式。如果找不到烁峭,可以直接運(yùn)行安裝目錄下的Badboy.exe文件容客。

啟動(dòng)Badboy,在地址欄中輸入待錄制的Web應(yīng)用網(wǎng)站的URL约郁。這里以LifeRay為例缩挑,即輸入LifeRay訪問地址 http://localhost:8080,回車開始錄制鬓梅,如圖所示调煎。

開始錄制后,可以直接在Badboy內(nèi)嵌的瀏覽器(主界面的右側(cè))中對(duì)被測(cè)應(yīng)用進(jìn)行操作己肮,所有的操作都會(huì)被記錄在主界面左側(cè)的編輯窗口中士袄。在這個(gè)簡(jiǎn)單實(shí)驗(yàn)中,我們?cè)贚ifeRay中登錄然后退出谎僻。不過娄柳,我們將看到,錄制下來的腳本并不像Selenium是一個(gè)個(gè)的動(dòng)作(鼠標(biāo)點(diǎn)擊click命令或鍵盤輸入type命令)艘绍,而是一個(gè)個(gè)URL赤拒。這個(gè)例子中,總共3個(gè)頂層(Top Level)HTTP請(qǐng)求和4個(gè)子請(qǐng)求被錄下诱鞠。Badboy提供了兩種不同的錄制模式:請(qǐng)求模式(預(yù)設(shè)模式)和導(dǎo)航模式(類似Selenium的動(dòng)作錄制)挎挖,但是,只有請(qǐng)求模式下錄制的腳本能導(dǎo)出到JMeter做負(fù)載和壓力測(cè)試航夺,因?yàn)檎?qǐng)求模式下錄制的腳本是獨(dú)立于頁面布局和外觀的蕉朵。絕大多數(shù)負(fù)載和壓力測(cè)試引擎運(yùn)行時(shí)不顯示任何用戶界面,因此像JMeter這種壓力測(cè)試工具無法執(zhí)行導(dǎo)航模式腳本阳掐。

錄制完成后始衅,點(diǎn)擊工具欄中的“stop recording”按鈕冷蚂,完成腳本的錄制,可以看到所有錄制下來的請(qǐng)求汛闸。然后蝙茶,選擇“File→Export to JMeter”菜單,填寫文件名LifeRayLogin.jmx诸老,將錄制好的腳本導(dǎo)出為JMeter腳本格式隆夯。

啟動(dòng)JMeter并打開剛剛生成的測(cè)試腳本。在執(zhí)行前别伏,需要增加一個(gè)監(jiān)聽器——“查看結(jié)果樹”蹄衷,可以選擇左邊窗口中的“step1”,按右鍵畸肆,選擇“添加→監(jiān)聽器→查看結(jié)果樹”宦芦。

然后宙址,選擇“運(yùn)行→啟動(dòng)”轴脐,開始執(zhí)行腳本。然后抡砂,在左邊導(dǎo)航欄內(nèi)選擇“查看結(jié)果樹”大咱,會(huì)看到執(zhí)行的結(jié)果,如圖所示注益。

還可以再增加一個(gè)監(jiān)聽器“用表格查看結(jié)果”碴巾,然后重新執(zhí)行測(cè)試(按CRTL+R啟動(dòng)),再選擇“用表格查看結(jié)果”丑搔,結(jié)果如圖所示厦瓢。

用表格查看結(jié)果的顯示界面

請(qǐng)求1+2是訪問主頁的響應(yīng)時(shí)間 6+5= 11 ms;

請(qǐng)求3+4+5是登陸的響應(yīng)時(shí)間 17+17+409=443 ms啤月;

請(qǐng)求6+7是退出的響應(yīng)時(shí)間 13+8=21 ms煮仇。

自帶錄制組件—Http代理服務(wù)器

如何配置JMeter自帶的腳本錄制功能?在JMeter控制臺(tái)的“工作臺(tái)”(WorkBench)元件上單擊右鍵谎仲,然后選擇添加“HTTP代理服務(wù)器”浙垫,如下圖所示。這里要為記錄操作進(jìn)行配置而不是運(yùn)行測(cè)試計(jì)劃郑诺,所以是在工作臺(tái)(WorkBench)上而不是在測(cè)試計(jì)劃(Test? Plan)上單擊右鍵夹姥。 HTTP代理服務(wù)器的實(shí)現(xiàn)原理就是通過配置瀏覽器的代理服務(wù)器而使所有的訪問請(qǐng)求通過JMeter發(fā)送,因而JMeter能把訪問過程錄制下來辙诞。

HTTP代理服務(wù)器的顯示界面

1. “HTTP代理服務(wù)器”的配置

代理服務(wù)器的端口辙售,默認(rèn)為8080,可自行修改飞涂,但不要與其他應(yīng)用端口沖突圾亏,因?yàn)長(zhǎng)ifeRay使用8080端口十拣,所以代理服務(wù)器的端口被改為8000端口。

目標(biāo)控制器是代理用于存儲(chǔ)生成的數(shù)據(jù)的控制器志鹃,即錄制的腳本存放的位置夭问。默認(rèn)情況下, JMeter會(huì)在當(dāng)前測(cè)試計(jì)劃中找一個(gè)記錄用的控制器用于存儲(chǔ)曹铃,也可選擇測(cè)試計(jì)劃中的線程組或在下拉菜單中選擇任意控制器來存儲(chǔ)缰趋。通常,選默認(rèn)值就可以陕见。

分組(Grouping)的概念是將一批請(qǐng)求匯總分組秘血,可以把url請(qǐng)求理解為組。在測(cè)試計(jì)劃中為生成的元件分組评甜,有多個(gè)選項(xiàng):

1) “不對(duì)樣本分組”:所有請(qǐng)求全部被羅列灰粮;

2) “在組間添加分隔”:加入一個(gè)虛擬的、以分割線命名的動(dòng)作忍坷,運(yùn)行時(shí)與“不對(duì)樣本分組”沒有區(qū)別粘舟,無實(shí)際意義;

3) “每個(gè)組放入一個(gè)新的控制器”:執(zhí)行時(shí)按控制器定義輸出結(jié)果佩研;

4) “只存儲(chǔ)每個(gè)組的第1個(gè)樣本”:對(duì)于一次url請(qǐng)求柑肴、實(shí)際很多次http請(qǐng)求的情況,這個(gè)選項(xiàng)很好用旬薯,因?yàn)槲覀兂32⒉魂P(guān)心后面的那些請(qǐng)求晰骑。

一般可以選擇“只存儲(chǔ)每個(gè)組的第1個(gè)樣本”,否則绊序,將會(huì)原樣錄制URL硕舆,包括圖像和JavaScripts腳本在內(nèi)的頁面。

參考JMeter原版的測(cè)試計(jì)劃:

1) 記錄HTTP信息頭:錄制request的head信息骤公;

2) 添加斷言:錄制時(shí)抚官,加入空的檢查點(diǎn)(須自行填寫內(nèi)容);

3) Regex matching:錄制時(shí)淋样,加入空的正則匹配(須自行填寫內(nèi)容)耗式;

4) 包含模式(Patterns to Include)和排除模式(Patterns to Exclude):幫助過濾一些不需要的訪問請(qǐng)求,如過濾一些靜態(tài)文件css趁猴、js和圖片刊咳。

2. 定時(shí)器偏移量

在錄制操作的同時(shí),JMeter會(huì)根據(jù)設(shè)置建立一些定時(shí)器儡司,其延遲時(shí)間是完全根據(jù)真實(shí)的操作來設(shè)置的娱挨。在代理服務(wù)器元件中可以增加一個(gè)定時(shí)器子元件(配置元件),用于告知JMeter在其生成的HTTP請(qǐng)求中自動(dòng)增加一個(gè)定時(shí)器捕犬。JMeter會(huì)自動(dòng)把實(shí)際的延遲時(shí)間存儲(chǔ)為一個(gè)被命名為T的JMeter變量跷坝。因此酵镜,如果在代理服務(wù)器元件里使用了高斯隨機(jī)定時(shí)器,就應(yīng)該在其中的固定延遲偏移(Constant Delay Offset)設(shè)置項(xiàng)里添上${T}柴钻,用于自動(dòng)引用紀(jì)錄的延遲時(shí)間淮韭。

3. 在瀏覽器中錄制

啟動(dòng)HTTP代理服務(wù)器后,打開瀏覽器(IE贴届、Firefox靠粪、Opera等)添加代理,地址填寫本機(jī)ip或host name毫蚓,端口填寫剛剛所設(shè)置的代理端口(本例為8000)占键,IE設(shè)置代理,如下圖所示元潘。

在IE中設(shè)置代理

在瀏覽器地址中鍵入待錄制頁面的URL畔乙,然后對(duì)頁面進(jìn)行操作,JMeter就會(huì)自動(dòng)把所進(jìn)行的操作轉(zhuǎn)換為測(cè)試腳本翩概,可以看到錄制控制器節(jié)點(diǎn)下多了許多子節(jié)點(diǎn)牲距,它們就是錄制生成的腳本。操作完畢后氮帐,在JMeter中單擊“停止”嗅虏,停止錄制洛姑,然后把瀏覽器的代理設(shè)置改為原來的設(shè)置上沐。我們可以發(fā)現(xiàn)HTTP代理服務(wù)器錄下的請(qǐng)求,和Badboy錄出的請(qǐng)求是類似的楞艾。

4. 線程組屬性設(shè)置

在執(zhí)行腳本前参咙,須要設(shè)置線程組(相當(dāng)于虛擬用戶組)的屬性。線程組為JMeter的主要插件硫眯,常用來模擬并發(fā)用戶訪問蕴侧,其內(nèi)部實(shí)現(xiàn)了多線程,而每個(gè)線程均獨(dú)立運(yùn)行測(cè)試計(jì)劃两入,用戶只要添加净宵、配置即可使用。如果客戶機(jī)沒有足夠的能力來模擬高負(fù)載(如大于100個(gè)并發(fā)用戶)裹纳,可以使用JMeter的分布式測(cè)試功能择葡,通過一個(gè)JMeter控制臺(tái),遠(yuǎn)程控制多個(gè)JMeter引擎完成測(cè)試剃氧。

單擊線程組敏储,在右邊的窗口中設(shè)置線程數(shù)為20,Ramp-Up Period(in seconds)為1朋鞍,循環(huán)次數(shù)選項(xiàng)取消選中永遠(yuǎn)已添,在右邊的框中輸入10妥箕,如下圖所示。Ramp-Up Period可理解為負(fù)載的啟動(dòng)周期更舞。例如畦幢,上述設(shè)置的20個(gè)虛擬用戶連接,用了1秒來實(shí)現(xiàn)缆蝉,即每個(gè)連接建立用時(shí)為50ms呛讲。

5. 運(yùn)行及記錄結(jié)果設(shè)置

要查看運(yùn)行的結(jié)果還須要加入監(jiān)聽器。選中線程組返奉,單擊鼠標(biāo)右鍵選擇“監(jiān)聽器 ”贝搁,再?gòu)钠淞斜碇羞x擇所需要的監(jiān)聽器。

JMeter的腳本開發(fā)

介紹JMeter進(jìn)行性能測(cè)試腳本開發(fā)芽偏,包括使用多線程雷逆、斷言、變量和函數(shù)等污尉。

1) Access Log Sampler

每天有多少訪問量膀哲?如何找到Top10 URL、各個(gè)URL并發(fā)數(shù)分配被碗?這些可以通過產(chǎn)品線上服務(wù)器的訪問日志分析得來某宪, JMeter的Access Log Sampler用來實(shí)現(xiàn)這些功能的。

要獲得用戶訪問日志就要把webserver配置成擴(kuò)展日志模式(extended log format)锐朴。

因?yàn)橛行?shù)據(jù)是加密的兴喂,可以用的錄制腳本登錄,再用Access Log Sampler完成余下的測(cè)試焚志。

如何建立Access Log Sampler衣迷?先選擇“線程組”,然后按右鍵酱酬,選擇菜單“添加→Sampler→Access Log Sampler”壶谒,然后按照下圖所示進(jìn)行設(shè)置。

2) 監(jiān)視器結(jié)果

性能測(cè)試中服務(wù)器的資源監(jiān)控非常重要膳沽,這里先介紹JMeter的“監(jiān)視器結(jié)果(Monitor Result)”汗菜,來檢查Tomcat資源的使用情況(內(nèi)存,線程等)挑社。JMeter的“監(jiān)視器結(jié)果”利用Tomcat本身的特性陨界,說白了就是直接訪問Tomcat服務(wù)器的/manager/status,獲得相應(yīng)的服務(wù)器狀態(tài)數(shù)據(jù)并進(jìn)行呈現(xiàn)滔灶。

“監(jiān)視器結(jié)果”是Tomcat 5+設(shè)計(jì)的普碎,如果應(yīng)用服務(wù)器(AppServer)不是Tomcat 5+,使用“監(jiān)視器結(jié)果”將得不到結(jié)果录平。但是麻车,任何servlet container都可以移植Tomcat 5的status servelet并使用此monitor缀皱。LifeRay用到的是Tomcat 6.x,但自帶的Tomcat沒有Manager App动猬,可從Apache網(wǎng)站(http://tomcat.apache.org/)下載一個(gè)Tomcat啤斗,把其中的Manager App復(fù)制到 ${liferayHome}\webapps\manager目錄下,在${liferayHome}\conf\tomcat-users.xml文件中添加以下內(nèi)容: <role rolename="manager"/>

<role rolename="admin"/>

<user username="admin" password="admin" roles="admin,manager"/>

重啟Tomcat赁咙。接下來钮莲,可以在JMeter中添加“監(jiān)視器結(jié)果”來監(jiān)視服務(wù)器狀態(tài),步驟如下:

1) 增加一個(gè)HTTP Request的Sampler彼水;

2) 選中該新增的HTTP Request崔拥,修改其屬性。修改路徑為manager/status凤覆,必要時(shí)給出服務(wù)器的IP地址和Port的值链瓦;增加一個(gè)參數(shù),該參數(shù)的名稱為大寫的XML盯桦,值為小寫的true慈俯,并選中下方的“用作監(jiān)視器”,如下圖所示拥峦;

設(shè)置“HTTP Request”的操作界面

3) 增加一個(gè)“監(jiān)視器結(jié)果”的節(jié)點(diǎn)贴膘;

4) 增加“HTTP授權(quán)管理器”和認(rèn)證信息,因?yàn)樵L問Tomcat的應(yīng)用服務(wù)器的 /manager/status要給出用戶名和口令略号,因此刑峡,在JMeter中增加一個(gè)HTTP授權(quán)管理器。選擇“線程組”璃哟,然后按右鍵氛琢,選擇菜單“添加→配置元件→HTTP授權(quán)管理器”喊递,增加一條記錄随闪,包括BaseURL、用戶名和密碼等信息骚勘。

在上面這個(gè)測(cè)試計(jì)劃中包含了兩個(gè)線程組铐伴,一個(gè)用來給服務(wù)器加壓,另一個(gè)用來監(jiān)控服務(wù)器的資源俏讹。最后当宴,給服務(wù)器加壓的腳本增加“響應(yīng)斷言”去驗(yàn)證登錄是否成功。

增加“響應(yīng)斷言”的操作界面
復(fù)雜的分布式大規(guī)模壓力測(cè)試

當(dāng)要模擬數(shù)以千計(jì)的并發(fā)用戶時(shí)泽疆,使用單臺(tái)機(jī)器模擬所有的并發(fā)用戶就有些力不從心户矢,甚至還會(huì)引起Java內(nèi)存溢出的錯(cuò)誤。JMeter允許用戶從多臺(tái)機(jī)器啟動(dòng)JMeter測(cè)試殉疼,通過使用多臺(tái)機(jī)器來分擔(dān)負(fù)載所產(chǎn)生的壓力梯浪,并借此來獲取更大的并發(fā)用戶數(shù)捌年。

某些Web和應(yīng)用程序服務(wù)器可連續(xù)處理同一個(gè)IP地址的多個(gè)請(qǐng)求,以及并行處理不同IP地址的請(qǐng)求挂洛,因此礼预,對(duì)于一些關(guān)鍵測(cè)試場(chǎng)合(請(qǐng)求來自不同的機(jī)器或?qū)y(cè)試負(fù)載分布到幾個(gè)客戶端),可以使用該選項(xiàng)來執(zhí)行操作虏劲。在具有1.4G~3GHz的CPU托酸、1GB內(nèi)存的JMeter客戶端上,可以處理線程100~300柒巫,但web services是例外励堡。XML處理是CPU運(yùn)算密集的,會(huì)迅速消耗所有的CPU堡掏。作為一般規(guī)則念秧,以XML技術(shù)為中心的應(yīng)用系統(tǒng),其性能將是普通web應(yīng)用的25%~10%布疼。另外摊趾,如果所有的負(fù)載從一臺(tái)機(jī)器產(chǎn)生,網(wǎng)卡和交換機(jī)端口都可能產(chǎn)生瓶頸游两,所以一個(gè)JMeter客戶端線程數(shù)不要超過100砾层。下圖描述了一個(gè)多測(cè)試機(jī)的情景:一臺(tái)控制機(jī)器(Controller)控制3臺(tái)負(fù)載產(chǎn)生(機(jī))器。對(duì)于下圖的架構(gòu)贱案,各種平臺(tái)上互相調(diào)用也是沒有問題的肛炮,Windows的JMeter Controller控制Linux的遠(yuǎn)程機(jī),或者Linux的JMeter Controller控制Windows的遠(yuǎn)程機(jī)宝踪,而且一般要求負(fù)載產(chǎn)生機(jī)器與Controller機(jī)器上JDK侨糟、JMeter的版本一致。

JMeter多測(cè)試機(jī)的情景

1. 啟動(dòng)負(fù)載產(chǎn)生器的服務(wù)

在所有產(chǎn)生負(fù)載的機(jī)器上啟動(dòng)JMETER_HOME/bin/jmeter-server.bat (windows) 或JMETER_HOME/bin/jmeter-server (linux) 腳本瘩燥。

2. 配置Controller機(jī)器

把所有負(fù)載產(chǎn)生器的IP地址加入到Controller機(jī)器上JMeter的配置文件中秕重。編輯Controller機(jī)器上的JMeter屬性文件/bin/jmeter.properties,找到“remote_hosts”段厉膀,然后增加負(fù)載產(chǎn)生器的IP地址溶耘,使用逗號(hào)分隔。

3. 啟動(dòng)控制端

在Controller端啟動(dòng)JMeter服鹅,然后在“運(yùn)行(Run)”菜單下會(huì)多出幾個(gè)子菜單“Remote Start”凳兵、“ Remote Start All”和“Remote Stop”、“Remote Stop All”等企软。這些子菜單下又會(huì)列出所有在屬性文件中增加的IP地址庐扫,如下圖所示,可啟動(dòng)某臺(tái)特定的負(fù)載產(chǎn)生器(執(zhí)行腳本)。當(dāng)然形庭,也可以啟動(dòng)全部負(fù)載產(chǎn)生器杰妓,即選擇“Remote Start All”。

啟動(dòng)遠(yuǎn)程負(fù)載產(chǎn)生器

4. 手動(dòng)啟動(dòng)遠(yuǎn)程服務(wù)

有些情況下JMeter負(fù)載產(chǎn)生器上的腳本可能運(yùn)行不起來碘勉,必須依靠手動(dòng)的方法來啟動(dòng)JMeter遠(yuǎn)程服務(wù)巷挥。

1) 首先要運(yùn)行RMI(Remote Method Invocation,遠(yuǎn)程方法調(diào)用)注冊(cè)程序(名為rmiregistry)验靡,因?yàn)镴Meter使用RMI作為機(jī)器間的通信方法倍宾。rmiregistry組件在JDK的bin目錄下,須要讀取某些JMeter的類文件胜嗓,所以在運(yùn)行它之前高职,確認(rèn)在ClassPath環(huán)境變量里包含了以下jar包:

JMETER_HOME /lib/ext/ApacheJMeter_core.jar;

JMETER_HOME /lib/jorphan.jar 辞州;

JMETER_HOME /lib/logkit-1.2.jar怔锌。

2) 啟動(dòng)RMI注冊(cè)程序(它使用1099端口),然后鍵入“jmeter -s”來啟動(dòng)JMeter服務(wù)变过。

3) JMeter服務(wù)啟動(dòng)之后埃元,其他步驟和前面一致。

5. 常見問題

1) 在Controller端上啟動(dòng)遠(yuǎn)程機(jī)器媚狰,沒有成功岛杀,系統(tǒng)給出錯(cuò)誤提示:“Bad call to remote host”。這時(shí)崭孤,須要檢查被控制機(jī)器上的JMeter-server是否啟動(dòng)类嗤。

2) 在Windows中重啟rmiregistry服務(wù)很簡(jiǎn)單,即首先關(guān)閉運(yùn)行rmiregistry的窗口辨宠,然后重新運(yùn)行rmiregistry遗锣;而在Linux下,則應(yīng)使用ps aux|grep rimregistry查詢?cè)撨M(jìn)程的pid嗤形,然后使用kill -9 pid殺死該進(jìn)程精偿,重新啟動(dòng)。

數(shù)據(jù)庫性能測(cè)試

在大多數(shù)企業(yè)項(xiàng)目中派殷,數(shù)據(jù)庫服務(wù)器是不可缺少的还最,其壓力測(cè)試是為了找出數(shù)據(jù)庫對(duì)象是否可以有效地承受來自多個(gè)用戶的并發(fā)訪問。被測(cè)試的對(duì)象主要有索引毡惜、觸發(fā)器、存儲(chǔ)過程和鎖等斯撮。

利用JMeter经伙,可以測(cè)試所用數(shù)據(jù)庫是否滿足某些指標(biāo)(例如能夠處理一定數(shù)量的并發(fā)用戶)。JMeter可以針對(duì)各種數(shù)據(jù)庫產(chǎn)品模擬出繁重的負(fù)載,這可以通過JMeter的多線程框架來實(shí)現(xiàn)帕膜。

以使用LifeRay自帶的默認(rèn)數(shù)據(jù)庫HSQL為例來建立一個(gè)數(shù)據(jù)庫測(cè)試計(jì)劃枣氧。為了方便對(duì)LifeRay的HSQL進(jìn)行JDBC測(cè)試,要把HSQL的JDBC驅(qū)動(dòng)程序復(fù)制到 <jmeter安裝目錄>\lib目錄下垮刹。對(duì)于LifeRay达吞,在默認(rèn)安裝情況下,HSQL的JDBC驅(qū)動(dòng)程序的位置為<liferay安裝目錄>\lib\ext\hsql.jar荒典。

通過下面的命令來啟動(dòng)LifeRay的名叫l(wèi)portal的數(shù)據(jù)庫酪劫,所有的數(shù)據(jù)都在<liferay安裝目錄>\lib\lportal.script里。hsqldb保存的就是所有操作的sql語句寺董,如下所示覆糟。

? ? D:\liferay\bin>java -cp ..\lib\ext\hsql.jar org.hsqldb.Server -database.0

? ? lportal -dbname.0 lportal

[Server@e0e1c6]: [Thread[main,5,main]]: checkRunning(false) entered

[Server@e0e1c6]: [Thread[main,5,main]]: checkRunning(false) exited

[Server@e0e1c6]: Startup sequence initiated from main() method

[Server@e0e1c6]: Loaded properties from [D:\liferay\bin\server.properties]

[Server@e0e1c6]: Initiating startup sequence...

[Server@e0e1c6]: Server socket opened successfully in 31 ms.

[Server@e0e1c6]: Database [index=0, id=0, db=file:lportal, alias=lportal]

opened sucessfully in 594 ms.

[Server@e0e1c6]: Startup sequence completed in 625 ms.

[Server@e0e1c6]: 2009-04-13 20:32:32.563 HSQLDB server 1.8.0 is online

[Server@e0e1c6]: To close normally, connect and execute SHUTDOWN SQL

[Server@e0e1c6]: From command line, use [Ctrl]+[C] to abort abruptly

數(shù)據(jù)庫啟動(dòng)后,我們可以按照下面的步驟用JMeter來完成一個(gè)基于LifeRay項(xiàng)目的數(shù)據(jù)庫測(cè)試計(jì)劃遮咖。

1) 新建一個(gè)Thread Group滩字。

2) 新增JDBC Connection Configuration(連接配置)。

3) 點(diǎn)擊新增的JDBC Connection? Configuration御吞,須要修改的參數(shù)如下麦箍。

JDBC連接配置界面

Variable Name:填入“HSQL”。

Database URL:jdbc: hsqldb:hsql://{host_IP_or_machine_name}:{HSQL監(jiān)聽器監(jiān)聽的端口}:{HSQL實(shí)例名} ——注意陶珠,“{ }” 大括號(hào)只用于說明内列,在配置JMeter時(shí),請(qǐng)將大括號(hào) “{ }”去掉背率。

JDBC Driver class:org.hsqldb.jdbcDriver话瞧。

Username:訪問HSQL實(shí)例的用戶名。

Password:對(duì)應(yīng)的密碼寝姿。

上面這些數(shù)據(jù)庫參數(shù)從LifeRay中得到:

? ? <liferay安裝目錄>\conf\Catalina\localhost\ROOT.xml

? ? ? <Resource

? ? ? ? ? name="jdbc/LiferayPool"

? ? ? ? ? auth="Container"

? ? ? ? ? type="javax.sql.DataSource"

? ? driverClassName="org.hsqldb.jdbcDriver"

? ? ? ? ? url="jdbc:hsqldb:lportal"

? ? ? ? ? username="sa"

? ? ? ? ? password=""

? ? ? ? ? maxActive="20"

? ? ? />

4) 新增一個(gè)JDBC Request交排,需要修改參數(shù)如下。

Variable Name:和上面的JDBC Connection Configuration填寫同樣的內(nèi)容饵筑。這里表示JDBC Connection Configuration建立一個(gè)名為Oracle的連接池埃篓,之后其他的JDBC Request都共用這個(gè)連接池;

Query:select * from table_name 根资。建議另行使用數(shù)據(jù)查詢工具架专,輸入一條SQL查詢語句,保證可以看到執(zhí)行結(jié)果玄帕,然后再將SQL語句拷貝到這里部脚。例如,在<liferay安裝目錄>\lib\lportal.script 里有表名裤纹。

5) 新增一個(gè)View Results Tree委刘。

6) 點(diǎn)擊Run,查看結(jié)果∥疲可以在Response data tab看到響應(yīng)的返回結(jié)果呕童。

如果所測(cè)試的數(shù)據(jù)庫是Oracle,請(qǐng)注意以下事項(xiàng)淆珊。

1) 執(zhí)行時(shí)提示:No Suitable Driver夺饲。在電腦上搜索classes12.jar,然后復(fù)制到JMeter的Lib目錄下施符。如果找不到classes12.jar往声,就找classes12.zip文件,然后把擴(kuò)展名改為jar操刀。這里順便說一句烁挟,其實(shí)classes12.jar并不是最快的Oracle JDBCdriver,如果將classes12.jar和Oranxo.jar(http://www.inetsoftware.de/products/jdbc-driver/oracle/oranxo)比較骨坑,Oranxo.jar要快得多撼嗓。

2) 執(zhí)行時(shí)提示:ORA-00911: invalid? character。確保在JDBC Request里面的Query中輸入的SQL語句是正確的欢唾。

JMeter用戶手冊(cè)中關(guān)于配置通過JDBC對(duì)數(shù)據(jù)庫性能進(jìn)行測(cè)試的部分如下:

http://jakarta.apache.org/jmeter/usermanual/build-db-test-plan.html


本文來自朱少民老師的《輕輕松松自動(dòng)化測(cè)試》且警,如有侵權(quán),請(qǐng)通知后刪除礁遣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斑芜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子祟霍,更是在濱河造成了極大的恐慌杏头,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沸呐,死亡現(xiàn)場(chǎng)離奇詭異醇王,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崭添,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門寓娩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呼渣,你說我怎么就攤上這事棘伴。” “怎么了屁置?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵焊夸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我缰犁,道長(zhǎng)淳地,這世上最難降的妖魔是什么怖糊? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任帅容,我火速辦了婚禮颇象,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘并徘。我一直安慰自己遣钳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布麦乞。 她就那樣靜靜地躺著蕴茴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姐直。 梳的紋絲不亂的頭發(fā)上倦淀,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音声畏,去河邊找鬼撞叽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛插龄,可吹牛的內(nèi)容都是我干的愿棋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼均牢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼糠雨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徘跪,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤甘邀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后垮庐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體松邪,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年突硝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了测摔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡解恰,死狀恐怖锋八,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情护盈,我是刑警寧澤挟纱,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站腐宋,受9級(jí)特大地震影響紊服,放射性物質(zhì)發(fā)生泄漏檀轨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一欺嗤、第九天 我趴在偏房一處隱蔽的房頂上張望参萄。 院中可真熱鬧,春花似錦煎饼、人聲如沸讹挎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筒溃。三九已至,卻和暖如春沾乘,著一層夾襖步出監(jiān)牢的瞬間怜奖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工翅阵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膏潮,地道東北人抱怔。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恢准。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榄审,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355