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

时间:2016-11-17 23:32:09

标签: java http get jmeter out-of-memory

让我们采用一个非常简单的jmeter脚本,它在HTTP请求(GET)中下载128MB的文件。目的是强调被测服务器,因此不需要将文件存储在本地或存储在jvm的内存中以备将来使用。该文件应该完全下载,因为它与服务器保持连接。

情境: 10个或更多线程同时运行,起步时间为5秒。假设网络带宽不受限制。

档案位置:https://storage.googleapis.com/videos12/dummy.txt

问题是 - 你为jmeter的jvm的堆大小设置了多少内存,这样你就不会得到java OOM错误?什么是进行基本计算的方法?

$watch - >这可以在jmeter.bat文件中设置。

a sample test plan in jmeter

2 个答案:

答案 0 :(得分:3)

  1. 快速回答:对于下载128Mb文件的10个线程,512 Mb太低。将堆增加到物理可用RAM总量的80%。
  2. 更长的答案:阅读有关Java Performance Tuning, Profiling, and Memory Management的资料,退出测试人员工作并成为JVM专家。
  3. 答案好:不要问或猜测,测量它。使用ie 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);行 - 它会完成所有魔法
  5. 为了更好地理解“正确答案”,请参阅解释的Apache HTTP Components API的HttpClient Tutorial和脚本最佳实践的Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For!文章。

答案 1 :(得分: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   属性。