【问题标题】:How much memory (heap size) is required to be set in JMeter在JMeter中需要设置多少内存(堆大小)
【发布时间】:2016-11-17 23:32:09
【问题描述】:

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

场景: 10 个或更多线程同时运行,节奏为 5 秒。假设网络带宽不受限制。

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

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

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

【问题讨论】:

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


    【解决方案1】:
    1. 快速回答:对于 10 个线程下载 128Mb 文件来说,512 Mb 太低了。将堆增加到总物理可用 RAM 的 80%。
    2. 更长的答案:阅读关于Java Performance Tuning, Profiling, and Memory Management 的资料,辞掉你的测试员工作,成为JVM 专家。
    3. 好答案:不要问或猜,衡量它。使用即JVisualVM:

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

    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 组件 API 解释和 Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! 文章以了解脚本最佳实践。

    【讨论】:

    • 感谢您的回答。我会试试看。我想在第 1 步之前添加一个步骤 - 根据场景的需求增加 RAM。 :)
    • 看起来第 4 点适用于我的场景。它不会将响应存储在 JVM 中,因此即使分配的堆较少,也不会出现 OOM。使用 50 个线程进行测试,我只花费了大约 150MB 的堆内存。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2021-11-25
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2014-02-26
      相关资源
      最近更新 更多