1. 程式人生 > >(十八)jmeter常見問題---學習筆記

(十八)jmeter常見問題---學習筆記

1 JMeter無法開啟

Windows下雙擊%JMETER_HOME%/bin/jmeter.bat時無法啟動JMeter,如圖15-1顯示。

圖片 1077{340}

圖15-1 JMeter啟動報錯

此問題是沒有配置Java環境變數JAVA_HOME,圖15-2所示是在Windows 7高階系統設定中配置環境變數。

圖片 1078{284}

圖15-2 Windows 7 JAVA_HOME配置

圖15-3所示是在Linux下找到/.bashrc檔案進行配置。

圖片 1080{361}

圖15-3 Centos JAVA_HOME配置

2 JMeter異常關閉

有時候在執行JMeter的過程中突然JMeter崩潰,這種異常關閉的情況多數是由於記憶體溢位的原因,在不設定JVM Heap大小的情況下,預設是512MB。如圖15-4所示是JMeter 2.13版本的預設設定,檔案在%JMETER_HOME%/bin/jmeter.bat中。

圖片 1095{450}

圖15-4 JMeter預設JVM設定

可以根據實際情況適當加大,如果你的計算機有4GB以上的可用記憶體且是64位系統,建議把-Xms與-Xmx都設定成2GB,其他引數都不用改變。

3 JMeter無法產生負載

在使用JMeter進行指令碼開發及執行時偶爾會遇到無法生成負載的情況,此時大家要注意檢查各元件是否是禁用狀態。JMeter執行時是以tree的形式載入各種元件,如果父結點被禁用,那麼其下的所有子節點也將不能執行。如圖15-5所示測試計劃中執行緒組被禁用,雖然下面的元件沒被禁用,但執行時根本就無法產生負載,但JMeter並不會報錯。

4 JMeter日誌輸出控制

我們知道日誌輸出(IO)可能會導致瓶頸,當我們用JMeter來模擬負載時,JMeter預設也會寫一些日誌。雖然日誌方便我們在出錯時查詢問題,但有一些日誌並不是我們想看的,比如一些Debug及INFO級別的日誌,我們並不關心;但這些日誌太多的情況下會影響JMeter的效率,建議提高日誌級別,只記錄Error日誌。

JMeter日誌控制在%JMETER_HOME%/bin/jmeter.properties檔案中進行修改,如圖15-6所示預設的日誌級別是INFO,這裡的日誌設定主要是針對JMeter原有元件。如果你沒有對JMeter進行過擴充套件,那麼你只要修改此處的配置即可以控制JMeter的日誌輸出;如果你擴充套件過JMeter Sampler,比如在Java Sampler中擴充套件了一個測試類且有自己的包名,那麼想要控制此類的日誌輸出,就需要配上包名,如你的擴充套件測試類包名是com.road.test,那麼你可以配置 log.level.com.road.test=Error,只記錄錯誤日誌。

圖片 9410{292}

圖15-6 日誌控制

5 記錄測試結果影響JMeter效率

效能測試時我們對負載機器的效能也要加以關注,避免因為負載機的效能問題而不能產生足夠的負載。在執行大量負載(大量執行緒)時測試結果記錄會很多,而儲存到文字檔案的操作是同步的,執行緒之間自然會有排隊,如果IO量大,負載機磁碟也將會面臨IO瓶頸風險,從而拖慢JMeter,導致產生的負載變小。所以我們要以最小的代價來儲存更少的測試結果,採用的基本方法如下。

(1)不記錄測試結果到檔案,非GUI方式執行時標準輸出結果如圖15-7所示。

圖片 9418{426}

圖15-7 日誌控制

以GUI方式執行時,可以直接在聚合報告或者Summary Report中檢視到測試結果。

(2)以CSV格式記錄,不要以XML格式記錄。JMeter 2.13預設是以CSV格式記錄,此設定也是在jmeter.properties中進行配置,其中有一專案:jmeter.save.saveservice.output_format=csv。

另外對於記錄哪些結果欄位也是可以設定的,儘量記錄更少的欄位,如圖15-8所示是預設記錄的欄位,建議去掉“Save Response Message”“Save Assertion Result(XML)”與“Save Sub Results(XML)”。

(3)不要重複記錄測試結果,圖15-8中把測試記錄記錄到D:\result.jtl檔案,其他的監控器元件就不要再記錄,不然會重複記錄。

注:上面說到記錄測試結果可能會影響JMeter效率,那麼會不會對測試結果產生影響呢?

當然會,由於負載變小,所以伺服器面臨的壓力相對變小,TPS就有可能沒有到拐點。此時我們需要更多的JMeter例項來模擬負載。另外要說明的是,雖然影響JMeter效率,但對於響應時間來說影響會比較小,通常可以忽略。

6 JMeter可以測試介面嗎

經常被學員問到這個問題。介面範圍太廣,常見的有HTTP協議、Socket協議、WebSocket協議、WebService(Soap)協議等。可以肯定的是以上協議都支援,只要構造好表單,在JMeter中用相應的Sampler就可以模擬出請求。經過筆者的瞭解與統計,這樣問的學員基本上都是對協議不瞭解,磨刀不誤砍柴工,打鐵還需自身硬,提高自己是必要的。

7 JMeter可以測試Dubbo介面嗎

不少業內的測試同行在網上問我Dubbo協議如何進行效能測試,想必這些同行的公司也應該是網際網路公司,系統採用SOA架構,微服務化,分散式化。Dubbo是阿里巴巴的樑飛及其團隊推出的開源服務框架,用者甚多(某企業在此基礎上推出了Dubbox),官方也給出一個測試示例,大家完全可以參照這個示例進行測試。

看過示例就會發現這東西在JMeter中沒有,JMeter不支援Dubbo協議介面的測試,需要自己二次開發擴充套件。

接著會有人抱怨,每個介面都要寫程式,其實我們可以懶一點,可以開發一個元件自動識別這些介面就可以了。所以筆者就開發了一個這樣的元件,是基於JMeter來擴充套件的(1.6節中有個圖就是展示這個元件),功能測試可以用,自動化測試可以用,效能測試也可以用,三合一。用Dubbo框架的同行你們公司Dubbo介面的功能測試是如何進行的?

(1)轉成WebService協議;

(2)轉成Restful風格;

(3)開發一個介面。

是不是被我說中了呢?聯絡Road獲取Dubbo測試元件,Dubbo測試效率就上去了。

下面是JMeter Dubbo Sampler示例。

(1)開啟JMeter,建立一個測試計劃,如圖15-9所示。

(2)選中【執行緒組】,單擊滑鼠右鍵找到Sampler下的DubboSamper,單擊新增此元件,如圖15-10所示。

圖片{276}

{-:-} 圖15-9 建立測試計劃

圖片 6{262}

{-:-} 圖15-10 新增Dubbo Sampler

(3)編輯測試用例,如圖15-11中dubbo application即是應用名,與配置檔案中對應。

dubbo servicename 與配置檔案中的interface對應。

dubbo method name 即是介面中定義的方法名。

圖片 8{452}

圖15-11 編輯測試用例

(4)引數化。

① 單擊【init servies】,實際上此時開始從zk獲取context,只需要單擊一次,只要JMeter不關閉,context一直駐留記憶體。

② 單擊【Get Json Template】,生成一個表單示例,使用者根據這個提示進行引數化,注意“[]”這一對中括號不要省略掉。圖15-11中的[23]是引數化一個int型變數。

(5)執行用例。

① 先新增一個檢視結果樹元件,方便檢視測試結果。

② 直接單擊圖片 9{15}運行當前測試用例。

8 JMeter可以測試RPC介面嗎

上面提到的Dubbo就集成了RPC功能,對於分散式服務框架來說RPC是必須的。現在越來越多的企業用到分散式,測試自然也免不了。

JMeter中沒有元件提供RPC的呼叫,JMeter原生版本不支援RPC的介面呼叫。參照Dubbo,這也需要自己開發元件去完成。元件的原理就是通過反射來獲取介面服務,然後從GUI介面獲取到引數,通過反射來執行方法。當然在開發過程中為了提高程式效率會涉及一些設計模式,比如單例。不會開發怎麼辦?同樣可以聯絡Road獲取幫助。

9 JMeter函式助手中函式不夠用怎麼辦

在編寫指令碼的過程中我們經常會碰到要構造一個建立時間或者有效時間,這些時間與當前時間會有一個偏移量,而且這些時間在效能測試執行時要求是動態變化的。

於是我們會開啟JMeter的函式助手,最後我們找到的好用的函式就是__time這個函式,此函式的使用是構造一個當前時間,可以指定輸出格式,如圖12所示,具體用法請參照6.8.29節。

遺憾的是這並不能滿足咱們的要求,我們要求有一個偏移量。如何解決這類問題呢?通常的方法有。

(1)使用BeanShell來構造一個時間變數,如圖15-13,使用BeanShell PreProcessor來構造兩個引數(orderDate、senderDate),分別是當前日期往後偏移一天和二天。當然使用BeanShell sampler同樣也可以完成此工作。

圖片 1{511}

圖15-12 JMeter __time()函式

圖片 27{350}

圖15-13 JMeter BeanShell PreProcessor

(2)上面使用BeanShell實際上類似於在寫Java程式碼,每個指令碼重複這樣的工作浪費時間。既然寫程式就要把重複的事情抽象出來、封裝起來,提供API供呼叫。基於此想法,我們是不是可以給JMeter增加函式?當然可以,開啟JMeter原始碼,如圖15-14中org.apache.jmeter.functions包中全部是JMeter提供的函式,大家只需要參考這些原始碼模仿著寫即可,把上面的BeanShell指令碼搬到Java程式碼中去。

圖15-15我們建立了一個Offset函式,用來獲取偏移後的時間,我們只需要覆寫下面框內的方法,主要實現就是execute方法,execute中的程式碼如下,讀者可以參考一下。

圖片 1{226}

{-:-} 圖15-14 JMeter函式原始碼

{-:-}圖片 1{284}

{-:-} 圖15-15 Offset函式方法目錄

execute方法覆寫

@Override
     public String execute(SampleResult previousResult, Sampler currentSampler)
                throws InvalidVariableException {
                Date datetime = new Date();
                String dateRt;
             if (format.length() > 0){
                 String fmt = aliases.get(format);
                 if (fmt == null) {
                     fmt = format;
                 }          
             }
             //獲取當前時間的偏移量,比如當前時間往後推7天
             int off = Integer.valueOf(offset);
             Calendar cal = Calendar.getInstance();
             SimpleDateFormat  sdf = new SimpleDateFormat(format);
             try {
                         cal.setTime(sdf.parse(sdf.format(datetime)));
               } catch (ParseException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
            cal.add(Calendar.DAY_OF_YEAR,off);
            dateRt = sdf.format(cal.getTime());
             if (variable.length() > 0) {
                 JMeterVariables vars = getVariables();
                 if (vars != null){
                     vars.put(variable, dateRt);
                 }
             }
             return dateRt;
     }

其他方法的覆寫參照TimeFunction,剩下的就是打包釋出到JMeter的lib/ext目錄下面,然後重啟JMeter就可以在函式助手中看到你的函式。圖15-16中可以看到__offsettime函式,它有3個入參,time format是指定輸出格式,offset save in parameter是把偏移後的時間存到變數中去,其他的Sampler可以呼叫,offset value是偏移量,相對於當前時間的偏移量。呼叫格式如下:{__offsettime(yyyy-MM-dd,offsettime,10)},offsettime是變數,其他Sampler又可以呼叫,呼叫格式是{offsettime}。

圖片 1{371}

圖15-16 __offsettime函式對話方塊

10 JMeter支援子事務的定義嗎

有時候我們會把一個大的事務拆分成幾個小的事務來計算其響應時間,更利於去分析問題,那麼JMeter支不支援子事務呢?

肯定回答JMeter可以支援子事務,只是實現方式與LoadRunner不一樣。JMeter有一個事務控制器,放在其節點下面的Sampler都會以子事務來統計,事務控制器會把節點下所有Sampler的事務時間合計在一起。

圖15-17中Java請求1與Java請求2的Average時間之和就是Java請求的Average。

圖片 1{494}

圖15-17 Summary Report

在JMeter的設計中,Summary Report是可以準備支援子事務的,只是有了事務控制器這個設計就不必要了,圖15-18中筆者修改了原始碼,使其支援子事務,此修改適用於JavaSampler元件。

圖片 1{404}

圖15-18 SummaryReport.java