Apache JMeter 负载测试中的并发具有奇怪的行为
Concurrency in Apache JMeter load testing has strange behaviour
我正在使用 JMeter 中的一些基本设置对 API 进行一些负载测试。
这里的想法是 线程组 生成一堆 clients/threads 并且每个客户端都有一堆 循环 以 并行 运行(使用 Bzm - 并行控制器)。
每个循环代表用户可以执行的某种操作,每个循环都有一个统一定时器控制器来调整给定操作为每个客户端执行的频率。
其中一个动作由两个调用组成,第一个 (1) 获取 som id,然后用 JSON 提取器 提取并用 [=25 修改一点=]BeanShell Post 处理器。 post 处理器的结果然后用作下一次调用 (2) 的参数。
我面临的问题是,在我的摘要报告中,第一个 HTTP 请求 (1) 显示的结果比第二个 (2) ).我希望他们总是被调用相同的次数。
我的猜测是,这一切都归结为我对 JMeter 中的流和并发(也许还有计时器)缺乏一些基本的了解,但我一直无法弄明白,所以我需要帮助。
这是设置,假设有多个 循环。
Thread group
+
|
+------ ---+ Parallel controller
| +
| |
| +-----------+ Loop
| +
| +----------+ Transaction
| | +
| | |
| | +---------+ Uniform random timer
| | +
| | |
| | |
| | +
| | (1) HTTP request
| | +
| | +---------+ JSON extractor
+ | | +
| | |
Summary Report | | +
| | BeanShell Post processor
| |
| |
| |
| +
|
| (2) HTTP request
|
|
|
Loop +----------------------------------+
|
|
好的,我明白了。这一切都归结为理解测试的结构,深入研究文档真的很有帮助,因为它们非常详细。
这是相关部分:
Note that timers are processed before each sampler in the scope in
which they are found; if there are several timers in the same scope,
all the timers will be processed before each sampler. Timers are only
processed in conjunction with a sampler. A timer which is not in the
same scope as a sampler will not be processed at all. To apply a
timer to a single sampler, add the timer as a child element of the
sampler. The timer will be applied before the sampler is executed. To
apply a timer after a sampler, either add it to the next sampler, or
add it as the child of a Flow Control Action Sampler.
https://jmeter.apache.org/usermanual/component_reference.html#timers
另一个需要理解的极其重要的事情是,一些构建块(与树结构相关)是分层的,一些是有序的,一些是两者兼而有之。这在此处有详细描述 https://jmeter.apache.org/usermanual/test_plan.html#scoping_rules
总而言之,我的问题可以通过将 统一随机计时器 作为第一个 HTTP 调用 (1) 的子项使其仅影响该调用来解决,或者通过在第二次调用 (2) 后添加 Flow Control Action 作为同级,并添加 Uniform random timer 作为子级。
我正在使用 JMeter 中的一些基本设置对 API 进行一些负载测试。
这里的想法是 线程组 生成一堆 clients/threads 并且每个客户端都有一堆 循环 以 并行 运行(使用 Bzm - 并行控制器)。
每个循环代表用户可以执行的某种操作,每个循环都有一个统一定时器控制器来调整给定操作为每个客户端执行的频率。
其中一个动作由两个调用组成,第一个 (1) 获取 som id,然后用 JSON 提取器 提取并用 [=25 修改一点=]BeanShell Post 处理器。 post 处理器的结果然后用作下一次调用 (2) 的参数。
我面临的问题是,在我的摘要报告中,第一个 HTTP 请求 (1) 显示的结果比第二个 (2) ).我希望他们总是被调用相同的次数。
我的猜测是,这一切都归结为我对 JMeter 中的流和并发(也许还有计时器)缺乏一些基本的了解,但我一直无法弄明白,所以我需要帮助。
这是设置,假设有多个 循环。
Thread group
+
|
+------ ---+ Parallel controller
| +
| |
| +-----------+ Loop
| +
| +----------+ Transaction
| | +
| | |
| | +---------+ Uniform random timer
| | +
| | |
| | |
| | +
| | (1) HTTP request
| | +
| | +---------+ JSON extractor
+ | | +
| | |
Summary Report | | +
| | BeanShell Post processor
| |
| |
| |
| +
|
| (2) HTTP request
|
|
|
Loop +----------------------------------+
|
|
好的,我明白了。这一切都归结为理解测试的结构,深入研究文档真的很有帮助,因为它们非常详细。
这是相关部分:
Note that timers are processed before each sampler in the scope in which they are found; if there are several timers in the same scope, all the timers will be processed before each sampler. Timers are only processed in conjunction with a sampler. A timer which is not in the same scope as a sampler will not be processed at all. To apply a timer to a single sampler, add the timer as a child element of the sampler. The timer will be applied before the sampler is executed. To apply a timer after a sampler, either add it to the next sampler, or add it as the child of a Flow Control Action Sampler.
https://jmeter.apache.org/usermanual/component_reference.html#timers
另一个需要理解的极其重要的事情是,一些构建块(与树结构相关)是分层的,一些是有序的,一些是两者兼而有之。这在此处有详细描述 https://jmeter.apache.org/usermanual/test_plan.html#scoping_rules
总而言之,我的问题可以通过将 统一随机计时器 作为第一个 HTTP 调用 (1) 的子项使其仅影响该调用来解决,或者通过在第二次调用 (2) 后添加 Flow Control Action 作为同级,并添加 Uniform random timer 作为子级。