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

How much memory (heap size) is required to be set in JMeter

让我们来看一个非常简单的jmeter脚本,该脚本在HTTP请求(GET)中下载128MB的文件。 目的是对受测服务器进行压力测试,因此没有必要将文件存储在本地或jvm的内存中以备将来使用。 该文件应完全下载,因为它与服务器保持连接。

场景:
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


  • 快速解答:512 Mb对于10个线程下载128Mb文件来说太低了。将堆增加到总物理可用RAM的80%。
  • 更长的答案:阅读有关Java Performance Tuning,Profiling和Memory Management的材料,退出测试人员的工作并成为JVM专家。
  • 好的答案:不要问或猜,不要测量。使用即JVisualVM:

    • 使用1个虚拟用户运行测试。测量使用的堆
    • 使用2个虚拟用户运行测试。测量使用的堆。
    • 使用4个虚拟用户运行测试。测量使用的堆。
    • 做复杂的算术运算
    • 根据结果??设置JMeter堆

      JVM JMeter visual VM

  • 正确答案:由于您根本不关心响应,因此请不要使用HTTP Request sampler,而应使用JSR223 Sampler。示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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);行-它确实发挥了所有作用
  • 为了更好地理解"正确答案",请参阅ApacheHTTP组件API的HttpClient教程,以及Beanshell,JSR223和Java JMeter脚本:您一直在等待的性能下降!脚本最佳实践的文章。


    新的Apache JMeter 3.1解决了这个问题,并很好地处理了大问题。

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

    Bug 53039 - HTTP Request : Be able to handle responses which size
    exceeds 2147483647 bytes (that is 2GB)

    JMeter is now able to handle in terms of metrics responses bigger than
    2GB, limit has been increased to 9223372 TB. To handle such big
    responses, it can also now truncate part of the response to avoid
    overflooding memory. See httpsampler.max_bytes_to_store_per_request
    property.