如何调试并查看随时间推移存储到线程间通信插件的 FIFO 队列中的内容?
How can I debug and see what gets stored over time into the FIFO queue of inter-thread communication plugin?
我有以下 JMeter 上下文:
在一个并发线程组 1 中,我有一个 JSR223 采样器,它将请求消息发送到 MQ queue1 并始终获取 JMSMessageID 和 epochTimestamp(派生自 JMS_IBM_PutDate + JMS_IBM_PutTime)并放入他们变成一个变量。在这个采样器下面是一个线程间通信后处理器元素,它从这个变量中获取数据并将其放入一个 FIFO 队列中。
在另一个并发线程组 2 中,我有另一个 JSR223 采样器,其代码用于从 MQ 队列 2 获取 MQ 队列 1 上发送的所有消息的响应消息。
为此,(并能够计算每条消息的响应时间)在 JSR223 采样器执行之前,我使用了线程间通信预处理器元素,它从 FIFO 队列中获取消息 ID 和时间戳(60 秒超时)和将它传递给一个变量,JSR223 采样器可以使用该变量来计算每条消息的请求-响应时间。
我想对系统进行压力测试,这就是为什么我在两个线程组中每 1 分钟逐渐动态增加每秒请求数(出于脚本测试目的),如下所示:
我为此使用并发线程组的 tstFeedback
函数:
${__tstFeedback(ThroughputShapingTimerIn,1,1000,10)}
我的问题是:
当我逐渐增加所需的 TPS 负载时,在前 4 个目标 TPS 步骤中,消费者线程与生产者线程保持同步(同步),但随着时间的推移和负载的增加,消费者线程似乎是花更多时间来查找和使用消息。就好像消费者线程的负载不再能够跟上生产者线程的负载,尽管两个线程组具有相同的负载模式。这最终会导致保持响应消息的 queue2 变满。这是我的意思的直观表示:
消费者样本最终比生产者样本少得多。我的期望是他们应该或多或少相等......
我需要了解如何调试此脚本并找出原因:
- 我认为在线程间同步级别发生了一些事情,因为有时我从 FIFO 队列中获取空值到消费者线程中 - 我需要了解放入 FIFO 队列的内容以及从中取出的内容先进先出队列。
我如何在每次迭代时打印 FIFO 列表中的内容?
- 对于这种行为的可能原因以及如何缓解这种情况,有人有什么建议吗?
非常感谢help/suggestion。
首先看看 jmeter.log file,那里至少有 865 个错误,所以我强烈怀疑你的 Groovy 脚本是否在做它们应该做的事情做
Don't run your test in GUI mode,仅用于测试开发和调试,执行时应使用命令行非GUI模式
当您调用 __fifoPop()
时,您可以将值保存到 JMeter 变量中,例如 ${__fifoPop(queue-name,some-variable)}
,可以使用 Debug Sampler 可视化该变量。可以使用 __fifoSize()
函数
检查队列的大小
或者我的期望是,像您这样的 Groovy 专家在 Groovy 代码中打印队列项目应该没有任何问题:
我有以下 JMeter 上下文:
在一个并发线程组 1 中,我有一个 JSR223 采样器,它将请求消息发送到 MQ queue1 并始终获取 JMSMessageID 和 epochTimestamp(派生自 JMS_IBM_PutDate + JMS_IBM_PutTime)并放入他们变成一个变量。在这个采样器下面是一个线程间通信后处理器元素,它从这个变量中获取数据并将其放入一个 FIFO 队列中。
在另一个并发线程组 2 中,我有另一个 JSR223 采样器,其代码用于从 MQ 队列 2 获取 MQ 队列 1 上发送的所有消息的响应消息。 为此,(并能够计算每条消息的响应时间)在 JSR223 采样器执行之前,我使用了线程间通信预处理器元素,它从 FIFO 队列中获取消息 ID 和时间戳(60 秒超时)和将它传递给一个变量,JSR223 采样器可以使用该变量来计算每条消息的请求-响应时间。
我想对系统进行压力测试,这就是为什么我在两个线程组中每 1 分钟逐渐动态增加每秒请求数(出于脚本测试目的),如下所示:
tstFeedback
函数:
${__tstFeedback(ThroughputShapingTimerIn,1,1000,10)}
我的问题是:
当我逐渐增加所需的 TPS 负载时,在前 4 个目标 TPS 步骤中,消费者线程与生产者线程保持同步(同步),但随着时间的推移和负载的增加,消费者线程似乎是花更多时间来查找和使用消息。就好像消费者线程的负载不再能够跟上生产者线程的负载,尽管两个线程组具有相同的负载模式。这最终会导致保持响应消息的 queue2 变满。这是我的意思的直观表示:
我需要了解如何调试此脚本并找出原因:
- 我认为在线程间同步级别发生了一些事情,因为有时我从 FIFO 队列中获取空值到消费者线程中 - 我需要了解放入 FIFO 队列的内容以及从中取出的内容先进先出队列。 我如何在每次迭代时打印 FIFO 列表中的内容?
- 对于这种行为的可能原因以及如何缓解这种情况,有人有什么建议吗?
非常感谢help/suggestion。
首先看看 jmeter.log file,那里至少有 865 个错误,所以我强烈怀疑你的 Groovy 脚本是否在做它们应该做的事情做
Don't run your test in GUI mode,仅用于测试开发和调试,执行时应使用命令行非GUI模式
当您调用
检查队列的大小__fifoPop()
时,您可以将值保存到 JMeter 变量中,例如${__fifoPop(queue-name,some-variable)}
,可以使用 Debug Sampler 可视化该变量。可以使用__fifoSize()
函数或者我的期望是,像您这样的 Groovy 专家在 Groovy 代码中打印队列项目应该没有任何问题: