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错误? 进行基本计算的方法是什么?
好的答案:不要问或猜,不要测量。使用即JVisualVM:
- 使用1个虚拟用户运行测试。测量使用的堆
- 使用2个虚拟用户运行测试。测量使用的堆。
- 使用4个虚拟用户运行测试。测量使用的堆。
- 做复杂的算术运算
-
根据结果??设置JMeter堆
正确答案:由于您根本不关心响应,因此请不要使用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.