需要在JMeter中设置多少内存(堆大小)

问题描述:

让我们看一个非常简单的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

  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

新的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 属性。