2016-11-17 54 views
1

讓我們看一個非常簡單的jmeter腳本,它在HTTP請求(GET)中下載一個128MB的文件。目的是壓縮測試中的服務器,因此不需要將文件存儲在本地或jvm的內存中以供將來使用。該文件應該完全下載,因爲它與服務器保持連接。需要在JMeter中設置多少內存(堆大小)

場景: 10個線程或更多的線程同時運行,比如說5秒的起搏。假設無限的網絡帶寬。

文件位置:https://storage.googleapis.com/videos12/dummy.txt

的問題是 - 你多少內存將在JMeter的JVM,這樣你沒有得到的java OOM錯誤的堆大小設置?做基本計算的方法是什麼?

set HEAP=-Xms512m -Xmx512m - >這個可以在jmeter.bat文件中設置。

a sample test plan in jmeter

回答

3
  1. 快速回答:512 MB太低,10個線程下載128MB的文件。將堆增加到物理可用RAM總量的80%。
  2. 較長的答案:閱讀有關Java Performance Tuning, Profiling, and Memory Management的材料,退出您的測試工作併成爲JVM專家。
  3. 好答案:不要問或猜測它,測量它。使用即JVisualVM

    • 使用1個虛擬用戶運行您的測試。使用度量堆
    • 使用2個虛擬用戶運行測試。測量堆使用。
    • 用4個虛擬用戶運行你的測試。測量堆使用。
    • 做複雜的數學計算
    • 設置JMeter的堆相應地結果

      JVM JMeter visual VM

  4. 正確答案:鑑於你沒有絲毫關於響應關心不使用HTTP請求採樣器並改爲使用JSR223 Sampler。示例代碼:

    import org.apache.http.HttpEntity; 
    import org.apache.http.HttpResponse; 
    import org.apache.http.client.HttpClient; 
    import org.apache.http.client.methods.HttpGet; 
    import org.apache.http.impl.client.HttpClientBuilder; 
    import org.apache.http.util.EntityUtils; 
    
    HttpClient client = HttpClientBuilder.create().build(); 
    HttpGet get = new HttpGet("https://storage.googleapis.com/videos12/dummy.txt"); 
    HttpResponse response = client.execute(get); 
    SampleResult.setResponseCode(String.valueOf(response.getStatusLine().getStatusCode())); 
    SampleResult.setResponseMessage(response.getStatusLine().getReasonPhrase()); 
    HttpEntity entity = response.getEntity(); 
    SampleResult.setBodySize(Math.round(entity.getContentLength())); 
    EntityUtils.consume(entity); 
    

    非常重要的位:

    • 確保您選擇groovy在「語言:下拉
    • 確保你打勾Cache compiled script if available
    • 確保你不會忘記EntityUtils.consume(entity);一行 - 它的全部魔力

爲了更好地理解「正確的答案」,請參閱HttpClient Tutorial關於Apache HTTP Components API的解釋和Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For!關於腳本最佳實踐的文章。

+0

感謝您的回答。我會試試看。我希望在步驟1之前添加一個步驟 - 根據場景的需求增加RAM。 :) – dnafication

+0

看起來像點4作品爲我的方案。它不會將響應存儲在JVM中,因此即使分配堆較少,也不會存在OOM。測試了50個線程,它只需要約150MB的堆內存。 – dnafication

0

新的Apache JMeter 3.1解決了這個問題,並很好地處理了很大的響應。

http://jmeter.apache.org/changes.html#Improvements

錯誤53039 - HTTP請求:能處理其尺寸 超過2147483647個字節(即2GB)

JMeter是現在能夠在度量方面來處理響應大於響應2GB,限制已增加到9223372 TB。爲了處理如此大的響應,它現在也可以截斷響應的一部分,以避免內存過量氾濫。請參閱httpsampler.max_bytes_to_store_per_request 屬性。