JMeter 是一個(gè)流行的用于負(fù)載測(cè)試的開源工具, 具有許多有用的功能元件,如線程組(thread group), 定時(shí)器(timer), 和HTTP 取樣 (sampler) 元件躬厌。 本文是對(duì)JMeter 用戶手冊(cè)的補(bǔ)充,而且提供了關(guān)于使用Jmeter的一些模擬元件開發(fā)質(zhì)量測(cè)試腳本的指導(dǎo)。
本文同時(shí)也討論了一項(xiàng)重要的內(nèi)容:在指定了精確的響應(yīng)時(shí)間要求后扛施,如何來校驗(yàn)測(cè)試結(jié)果鸿捧,非凡是在采用了置信區(qū)間分析這種嚴(yán)格的統(tǒng)計(jì)方式的情況下應(yīng)如何操作。請(qǐng)注重疙渣,我假定本文的讀者們了解關(guān)于Jmeter的基礎(chǔ)知識(shí)匙奴。
確定一個(gè)線程組的ramp-up period (Determine)
Jmeter腳本的第一個(gè)要素是線程組(Thread Group),因此首先讓我們往返顧一下妄荔。 正如圖一所示泼菌,線程組需要設(shè)置以下參數(shù):
·線程數(shù)量。
·ramp-up period啦租。
·運(yùn)行測(cè)試的次數(shù)哗伯。
·啟動(dòng)時(shí)間:立即或者預(yù)定的時(shí)間,假如是后者篷角,線程組所包含的元素也要指定這個(gè)起止時(shí)間焊刹。
圖 1 JMeter 線程組(JMeter Thread Group)
每個(gè)線程均獨(dú)立運(yùn)行測(cè)試計(jì)劃。因此恳蹲, 線程組常用來模擬并發(fā)用戶訪問虐块。假如客戶機(jī)沒有足夠的能力來模擬較重的負(fù)載,可以使用Jmeter的分布式測(cè)試功能來通過一個(gè)Jmeter控制臺(tái)來遠(yuǎn)程控制多個(gè)Jmeter引擎完成測(cè)試嘉蕾。
參數(shù) ramp-up period 用于告知JMeter 要在多長(zhǎng)時(shí)間內(nèi)建立全部的線程贺奠。默認(rèn)值是0。假如未指定ramp-up period 错忱,也就是說ramp-up period 為零儡率, JMeter 將立即建立所有線程,假設(shè)ramp-up period 設(shè)置成T 秒以清, 全部線程數(shù)設(shè)置成N個(gè)喉悴, JMeter 將每隔T/N秒建立一個(gè)線程。
線程組的大部分參數(shù)是不言自明的玖媚,只有ramp-up period有些難以理解, 因?yàn)槿绾卧O(shè)置適當(dāng)?shù)闹挡⒉惠p易婚脱。 首先今魔,假如要使用大量線程的話,ramp-up period 一般不要設(shè)置成零障贸。 因?yàn)榧偃缭O(shè)置成零错森,Jmeter將會(huì)在測(cè)試的開始就建立全部線程并立即發(fā)送訪問請(qǐng)求, 這樣一來就很輕易使服務(wù)器飽和篮洁,更重要的是會(huì)隱性地增加了負(fù)載涩维,這就意味著服務(wù)器將可能過載,不是因?yàn)槠骄L問率高而是因?yàn)樗芯€程的第一次并發(fā)訪問而引起的不正常的初始訪問峰值,可以通過Jmeter的聚合報(bào)告監(jiān)聽器看到這種現(xiàn)象瓦阐。這種異常不是我們需要的蜗侈,因此,確定一個(gè)合理的ramp-up period 的規(guī)則就是讓初始點(diǎn)擊率接近平均點(diǎn)擊率睡蟋。當(dāng)然踏幻,也許需要運(yùn)行一些測(cè)試來確定合理訪問量。
基于同樣的原因戳杀,過大的ramp-up period 也是不恰當(dāng)?shù)母妹妫驗(yàn)閷?huì)降低訪問峰值的負(fù)載,換句話說信卡,在一些線程還未啟動(dòng)時(shí)隔缀,初期啟動(dòng)的部分線程可能已經(jīng)結(jié)束了。
那么傍菇,如何檢驗(yàn)ramp-up period I太小了或者太大了呢猾瘸?首先,推測(cè)一下平均點(diǎn)擊率并用總線程除點(diǎn)擊率來計(jì)算初始的ramp-up period桥嗤。 例如须妻,假設(shè)線程數(shù)為100, 估計(jì)的點(diǎn)擊率為每秒10次泛领, 那么估計(jì)的理想ramp-up period 就是 100/10 = 10 秒荒吏。 那么,應(yīng)怎樣來提出一個(gè)合理的估算點(diǎn)擊率呢渊鞋?沒有什么好辦法绰更,必須通過運(yùn)行一次測(cè)試腳本來獲得。
ramp-up period 計(jì)算: 線程組數(shù)量? *? 聚合報(bào)告內(nèi)的平均響應(yīng)時(shí)間(單位秒)
其次锡宋, 在測(cè)試計(jì)劃(test plan)中增加一個(gè)聚合報(bào)告監(jiān)聽器儡湾,如圖2所示,其中包含了所有獨(dú)立的訪問請(qǐng)求(一個(gè)samplers)的平均點(diǎn)擊率执俩。 第一次取樣的點(diǎn)擊率(如http請(qǐng)求)與ramp-up period 和線程數(shù)量密切相關(guān)徐钠。通過調(diào)整ramp-up period 可以使首次取樣的奠基率接近平均取樣的點(diǎn)擊率。
圖2 JMeter 聚合報(bào)告
第三役首, 查驗(yàn)一下Jmeter日志(文件位置:JMeter_Home_Directory/bin) 的最后一個(gè)線程開始時(shí)第一個(gè)線程是否真正結(jié)束了尝丐,二者的時(shí)間差是否正常。
總之衡奥,是否能確定一個(gè)適當(dāng)?shù)膔amp-up time 取決于以下兩條規(guī)則:
·第一個(gè)取樣器的點(diǎn)擊率(hit rate)是否接近其他取樣器的平均值爹袁,從而能否避免ramp-up period 過小“蹋·在最后一個(gè)線程啟動(dòng)時(shí)失息,第一個(gè)線程是否在真正結(jié)束了,最好二者的時(shí)間要盡可能的長(zhǎng),以避免ramp-up period過大盹兢。
有時(shí)邻梆,這兩條規(guī)則的結(jié)論會(huì)互相沖突。 這就意味著無法找到同時(shí)滿足兩條規(guī)則的合適的ramp-up period蛤迎。 糟糕的測(cè)試計(jì)劃通常會(huì)導(dǎo)致這些問題确虱,這是因?yàn)樵谶@樣的測(cè)試計(jì)劃里,取樣器將不能充分地采集數(shù)據(jù)替裆,可能因?yàn)闇y(cè)試計(jì)劃執(zhí)行時(shí)間太短并且線程會(huì)很快的運(yùn)行結(jié)束校辩。
用戶思考時(shí)間(User think time),定時(shí)器辆童,和代理服務(wù)器(PRoxy server)
在負(fù)載測(cè)試中需要考慮的的一個(gè)重要要素是思考時(shí)間(think time)宜咒, 也就是在兩次成功的訪問請(qǐng)求之間的暫停時(shí)間。 有多種情形揮發(fā)導(dǎo)致延遲的發(fā)生: 用戶需要時(shí)間閱讀文字內(nèi)容把鉴,或者填表故黑, 或者查找正確的鏈接等。未認(rèn)真考慮思考時(shí)間經(jīng)常會(huì)導(dǎo)致測(cè)試結(jié)果的失真庭砍。例如场晶,估計(jì)數(shù)值不恰當(dāng),也就是被測(cè)系統(tǒng)可以支持的最多用戶量(并發(fā)用戶)看起來似乎要少一些等怠缸。
Jmeter提供了一整套的計(jì)時(shí)器(timer)來模擬思考時(shí)間(think time)诗轻, 但是仍然存在一個(gè)問題:: 如何確定適當(dāng)?shù)乃伎紩r(shí)間呢?幸運(yùn)的是揭北, JMeter 提供了一個(gè)不錯(cuò)的答案:使用 JMeter HTTP 代理服務(wù)器(Proxy Server)元件扳炬。
代理服務(wù)器會(huì)記錄在使用一個(gè)普通的瀏覽器(如Firefox?或 Internet EXPlorer)瀏覽一個(gè)web應(yīng)用時(shí)的操作。 另外搔体, JMeter 在記錄操作的同時(shí)會(huì)建立一個(gè)測(cè)試計(jì)劃(test plan)恨樟。 這個(gè)功能能提供以下便利:
·不必手工建立HTTP 訪問請(qǐng)求, 尤其是當(dāng)要設(shè)置一些令人乏味的參數(shù)時(shí)(然而疚俱,非英文的參數(shù)也許不能正常工作) 劝术。
JMeter 將會(huì)錄制包括隱含字段(hidden fields)在內(nèi)的所有內(nèi)容。
·在生成的測(cè)試計(jì)劃中呆奕,Jmeter會(huì)包含瀏覽器生成的所有的 HTTP 報(bào)頭夯尽,如User-Agent (e。g登馒。, Mozilla/4咆槽。0)陈轿, 或AcceptLanguage (e。g。麦射, zh-tw蛾娶,en-us;q=0。7潜秋,zh-cn;q=0蛔琅。3)等。
·JMeter 會(huì)根據(jù)設(shè)置在錄制操作的同時(shí)建立一些定時(shí)器峻呛,其延遲時(shí)間是完全根據(jù)真實(shí)的操作來設(shè)置的現(xiàn)在讓我們來看一下如何配置Jmeter的錄制功能罗售。 在JMeter 的控制臺(tái)上, 在工作臺(tái)(WorkBench)元件上單擊右鍵钩述,然后選擇”add the HTTP Proxy Server “寨躁。 注重是在WorkBench 上單擊右鍵而不是在Test Plan上, 因?yàn)楝F(xiàn)在是要為記錄操作進(jìn)行配置而不是要運(yùn)行測(cè)試計(jì)劃牙勘。??HTTP Proxy Server 的實(shí)現(xiàn)原理就是通過配置瀏覽器的代理服務(wù)器而使所有的訪問請(qǐng)求通過JMeter發(fā)送(因而被Jmeter把訪問過程錄制下來)职恳。
?HTTP代理服務(wù)器(HTTP Proxy Server)元件的一些參數(shù)必須被配置:
·端口(port): 代理服務(wù)器的監(jiān)聽端口
·目標(biāo)控制器(Target Controller): 是代理用于存儲(chǔ)生成的數(shù)據(jù)的控制器,默認(rèn)情況下方面,放钦, JMeter 將會(huì)在當(dāng)前的測(cè)試計(jì)劃中找一個(gè)記錄用的控制器用于存儲(chǔ),此外也可以在下拉菜單中選擇任意控制起來存儲(chǔ)恭金,通常默認(rèn)值就可以了操禀。
·分組(Grouping): 確定在測(cè)試計(jì)劃中如何來為生成的元件分組。 有多個(gè)選項(xiàng)蔚叨, 一般可以選擇“只存儲(chǔ)每個(gè)組的第一個(gè)樣本”床蜘,否則,將會(huì)原樣錄制URLs蔑水,包括包含圖像和javascripts腳本的頁面邢锯。當(dāng)然 也可以嘗試一下默認(rèn)值“不對(duì)樣本分組”("Do not group samples"),來看一下JMeter 建立的原版的測(cè)試計(jì)劃搀别。
·包含模式(Patterns to Include) 和 排除模式(Patterns to Exclude) :幫助過濾一些不需要的訪問請(qǐng)求丹擎。