JMeter 慢 "Retrieve all embedded resources" - 我该如何缩放?
JMeter slow with "Retrieve all embedded resources" - how do I scale?
TLDR:
- 如果我 select“检索所有嵌入的资源”,JMeter 仅使用 1 个测试用户进行爬网。
- 如果我对 100 个用户进行测试,JMeter 会抛出
Uncaught Exception java.lang.OutOfMemoryError: Java heap space in thread Thread
- 如何最终扩展以测试数千名用户?
更多详情:
我正在使用 BlazeMeter Chrome 扩展程序录制 jmx 脚本。用户登录并完成课程和测试。在此过程中提出了许多 ajax 请求。脚本大约有 350 - 400 个步骤。大多数 ajax POST 请求有 json 响应。
当我在 Chrome 中手动点击时,网站加载速度很快。也许页面加载最多需要 2 秒。
但是当我将该脚本导入 JMeter 并将“检索所有嵌入式资源”和“并行下载”设置为 6,并且 运行 它(在 GUI 中最初只有 1 个用户)时,它将比如说,快速完成 7 步,然后就挂起,有时会挂 10 分钟以上,然后再进入下一步。如果我取消选中“检索所有嵌入式资源”,则不会发生这种情况,但我不想这样做,因为那不是一个现实的测试。
如果我对 100 个用户进行同样的测试 运行(从命令行使用 JVM_ARGS='-Xms4096m -Xmx4096m' sh jmeter -n -t myfolder/mytest.jmx -l myfolder/testresults.jtl
),我会得到 Uncaught Exception java.lang.OutOfMemoryError: Java heap space in thread Thread
,我的电脑风扇会发疯。
我配置了一个 HTTP 缓存管理器,仅选中“在处理 GET 请求时使用 Cache-Control/Expires header”,并且我已将“缓存中的最大元素数降低到 10,因为那是只有这样我才能得到测试 运行ning。
理想情况下,我想一次测试数千个用户,但如果我不能可靠地测试 100 个用户,我不明白我应该如何扩展到数千个。
我看到还有其他 cloud-based 测试选项,我现在已经尝试了一些,但是在配置如何测试登录用户时我总是停顿下来。似乎大多数解决方案都不支持这个。
感觉应该是很多人过去应该遇到过的事情,但我发现几乎没有人遇到过这些问题。在 Web 应用程序上对数千 logged-in 用户进行负载测试的正确方法是什么?
如果 JMeter 在检索嵌入式资源时“挂起”10 分钟,则此特定资源有问题,您可以使用 View Results Tree listener and either raise a bug for this particular "slow" component or exclude it from the scope using HTTP Request Defaults 查看每个资源的响应时间。您还可以在那里指定超时,如果请求不会 return 在给定的时间范围内做出响应 - 它将被标记为失败,因此您不必等待 10 分钟:
您增加堆的方式是正确的,看起来 4Gb 不够,您要么必须提供更多,要么考虑切换到 distributed testing
确保在任何情况下都遵循JMeter Best Practices。如果您的“计算机风扇发疯”,则意味着 CPU 使用率非常高,因此 JMeter 很可能无法足够快地发送请求,因此您将获得 false-negative 结果。
TLDR:
- 如果我 select“检索所有嵌入的资源”,JMeter 仅使用 1 个测试用户进行爬网。
- 如果我对 100 个用户进行测试,JMeter 会抛出
Uncaught Exception java.lang.OutOfMemoryError: Java heap space in thread Thread
- 如何最终扩展以测试数千名用户?
更多详情:
我正在使用 BlazeMeter Chrome 扩展程序录制 jmx 脚本。用户登录并完成课程和测试。在此过程中提出了许多 ajax 请求。脚本大约有 350 - 400 个步骤。大多数 ajax POST 请求有 json 响应。
当我在 Chrome 中手动点击时,网站加载速度很快。也许页面加载最多需要 2 秒。
但是当我将该脚本导入 JMeter 并将“检索所有嵌入式资源”和“并行下载”设置为 6,并且 运行 它(在 GUI 中最初只有 1 个用户)时,它将比如说,快速完成 7 步,然后就挂起,有时会挂 10 分钟以上,然后再进入下一步。如果我取消选中“检索所有嵌入式资源”,则不会发生这种情况,但我不想这样做,因为那不是一个现实的测试。
如果我对 100 个用户进行同样的测试 运行(从命令行使用 JVM_ARGS='-Xms4096m -Xmx4096m' sh jmeter -n -t myfolder/mytest.jmx -l myfolder/testresults.jtl
),我会得到 Uncaught Exception java.lang.OutOfMemoryError: Java heap space in thread Thread
,我的电脑风扇会发疯。
我配置了一个 HTTP 缓存管理器,仅选中“在处理 GET 请求时使用 Cache-Control/Expires header”,并且我已将“缓存中的最大元素数降低到 10,因为那是只有这样我才能得到测试 运行ning。
理想情况下,我想一次测试数千个用户,但如果我不能可靠地测试 100 个用户,我不明白我应该如何扩展到数千个。
我看到还有其他 cloud-based 测试选项,我现在已经尝试了一些,但是在配置如何测试登录用户时我总是停顿下来。似乎大多数解决方案都不支持这个。
感觉应该是很多人过去应该遇到过的事情,但我发现几乎没有人遇到过这些问题。在 Web 应用程序上对数千 logged-in 用户进行负载测试的正确方法是什么?
如果 JMeter 在检索嵌入式资源时“挂起”10 分钟,则此特定资源有问题,您可以使用 View Results Tree listener and either raise a bug for this particular "slow" component or exclude it from the scope using HTTP Request Defaults 查看每个资源的响应时间。您还可以在那里指定超时,如果请求不会 return 在给定的时间范围内做出响应 - 它将被标记为失败,因此您不必等待 10 分钟:
您增加堆的方式是正确的,看起来 4Gb 不够,您要么必须提供更多,要么考虑切换到 distributed testing
确保在任何情况下都遵循JMeter Best Practices。如果您的“计算机风扇发疯”,则意味着 CPU 使用率非常高,因此 JMeter 很可能无法足够快地发送请求,因此您将获得 false-negative 结果。