1. 程式人生 > >Jmeter做效能測試遇到的問題及解決辦法

Jmeter做效能測試遇到的問題及解決辦法

前天客戶要求給他提供一份效能測試報告,說:“我們的系統將來的使用者數量可以達到800人左右,所以我希望系統能夠支援的最大使用者併發數可以達到1000” 。⊙﹏⊙b汗

我用的測試工具是Jmeter2.2。需要測試的是一個OA系統辦公平臺。主要遇到的以下幾個問題:(jmeter的基本使用網上很多)

問題1、系統的所有功能必要要登入以後才能使用,那麼使用Jmeter測試時,登入問題如何解決?

我想要測試的是使用者登入系統之後,看到的首頁。因為這個這個頁面的訪問量是最大的而且也是最能體現系統速度的。

我想的方法是首先訪問登入頁面讓Jmeter登入,然後併發訪問首頁。

 

這裡加“if控制器”的目的是讓第一個執行緒可以做登入動作。

關於控制器中的條件的寫法,幫助文件中說支援JS指令碼,但是又有這幾個例子:

${COUNT}<10 "${VAR}" == "abcd" "${JMeterThread.last_sample_ok}" == "true" (check if last sample succeeded) 

說明用${}來取得系統中的變數(有些變數要通過呼叫jmeter中的函式來取得);除了數字以外,其他的技術型別都要用字串的形式如:true要寫成"true"。看來和JS指令碼還是不一樣啊。

“HTTP Cookie管理器”在這裡的作用是使得同一個執行緒中的多個請求都是同一個session,就像是從同一個瀏覽器向伺服器發出的請求一樣。但是“HTTP Cookie管理器”好像無法使得同一個執行緒組中的多個執行緒裡的請求都為同一個session。

當設定執行緒數為10時,第一個執行緒的測試結果沒有問題,但從第二個執行緒開始,“首頁”都只能返回錯誤的結果。

所以這裡雖然解決了登入的問題,但是卻帶來了新的問題:我的目的只是測試“首頁”,但現在卻不得不連“登入”也一起測試。

這個問題我最終還是無法解決,如果那位高人知道,請留言說明一下,謝謝。

問題2、java.io.IOException: Error writing to server和java.net.SocketException: Connection reset異常;我測試500個併發時,系統沒有問題;可當我把執行緒數加到800時,就出現錯誤了,在“檢視結果樹”中,打開出錯的請求,看到如下異常:

java.io.IOException: Error writing to server
at sun.reflect.GeneratedConstructorAccessor24.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.readResponse(HTTPSampler.java:222)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.sample(HTTPSampler.java:433)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:658)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:647)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:247)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: Error writing to server
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.writeRequests(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(Unknown Source)
at java.net.URLConnection.getContentEncoding(Unknown Source)
at org.apache.jmeter.protocol.http.sampler.HTTPSampler.readResponse(HTTPSampler.java:213)
... 5 more

乍一看我還以為是伺服器出了什麼問題了,可是到伺服器上一看,卻沒有發現什麼異常。於是就還以是不是本機出了什麼問題,可能是本機的JVM太曉了,於是修改了/bin/jmeter.bat檔案:找到這2行

set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m

改為:

set HEAP=-Xms256m -Xmx1024m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m

然後就不在報錯了。