如何调试并查看随着时间的推移存储到线程间通信插件的 FIFO 队列中的内容?
Posted
技术标签:
【中文标题】如何调试并查看随着时间的推移存储到线程间通信插件的 FIFO 队列中的内容?【英文标题】:How can I debug and see what gets stored over time into the FIFO queue of inter-thread communication plugin? 【发布时间】:2022-01-18 02:30:16 【问题描述】:我有以下 JMeter 上下文:
在一个并发线程组 1 中,我有一个 JSR223 采样器,它将请求消息发送到 MQ 队列 1 并始终获取 JMSMessageID 和 epochTimestamp(派生自 JMS_IBM_PutDate + JMS_IBM_PutTime)并将它们放入一个变量中。在这个采样器下面是一个线程间通信 PostProcessor 元素,它从这个变量中获取数据并将其放入一个 FIFO QUEUE。
在另一个并发线程组 2 中,我有另一个带有代码的 JSR223 采样器,用于从 MQ 队列 2 获取在 MQ 队列 1 上发送的所有消息的响应消息。 为此,在 JSR223 采样器执行之前(并且能够计算每条消息的响应时间),我使用了线程间通信预处理器元素,它从 FIFO 队列(60 秒超时)中获取消息 ID 和时间戳,并且将它传递给一个变量,JSR223 采样器可以使用该变量来计算每条消息的请求-响应时间。
我想对系统进行压力测试,这就是为什么我在两个线程组中每 1 分钟(出于脚本测试目的)逐渐动态增加每秒请求数,如下所示:
为此,我使用了并发线程组的tstFeedback
函数:
$__tstFeedback(ThroughputShapingTimerIn,1,1000,10)
我的问题是这样的:
当我逐渐增加所需的 TPS 负载时,在前 4 个目标 TPS 步骤中,消费者线程与生产者线程保持同步(同步),但随着时间的推移和负载的增加,消费者线程似乎占用了更多是时候查找和使用消息了。就好像消费者线程的负载不再能够跟上生产者线程的负载,尽管两个线程组具有相同的负载模式。这最终会导致保持响应消息变满的 queue2。这是我的意思的视觉表示: 消费者样本最终比生产者样本少得多。我的期望是他们应该或多或少相等......
我需要了解如何调试此脚本并找出原因:
我认为在线程间同步级别会发生一些事情,因为有时我会从 FIFO 队列中获取 null 值到消费者线程中 - 我需要了解哪些内容放入了该 FIFO 队列,哪些内容从该 FIFO 中取出队列。 如何在每次迭代时打印 FIFO 列表中的内容? 是否有人对导致此行为的原因以及如何缓解有任何建议?非常感谢任何帮助/建议。
【问题讨论】:
【参考方案1】:首先看一下jmeter.log file,那里至少有 865 个错误,所以我强烈怀疑您的 Groovy 脚本正在做他们应该做的事情
Don't run your test in GUI mode,仅用于测试开发和调试,执行时应使用命令行非GUI模式
当您调用__fifoPop()
时,您可以将值保存到像$__fifoPop(queue-name,some-variable)
这样的JMeter 变量中,该变量可以使用Debug Sampler 进行可视化。可以使用__fifoSize()
函数检查队列的大小
另外,我的期望是,像您这样的 Groovy 专家在 Groovy 代码中打印队列项应该不会有任何问题:
【讨论】:
谢谢迪米特里。我不使用函数从 FIFO 队列中放置和获取消息 - 我使用“开箱即用”测试元素线程间通信后处理器和预处理器。您是说如果我想从队列中打印元素,唯一的选择是更改在 JSR223 采样器中使用线程间通信插件功能的方法? 用什么都没关系 这里是日志错误的摘要:1.我有第一个错误,即消费者从出站队列中获得了一个空对象2. 然后我只有一个这样的错误:javax.script.ScriptException: com.ibm.msg.client.jms.DetailedJMSException: JMSWMQ2008: Failed to open MQ queue 'OUTPUT'. ... stacktrace blabla... Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '3013' ('').
3. 那么据我所知,大部分错误是这样的:com.ibm.msg.client.jms.DetailedResourceAllocationException: JMSWMQ2008: Failed to open MQ queue ... stacktrace blabla... Caused by: com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2017' ('MQRC_HANDLE_NOT_AVAILABLE')
所有错误仅在客户端可见。
截图仅供说明之用,您应该知道自己在做什么并得到想法,而不是从互联网上复制和粘贴代码。特别是在这种情况下,您忘记复制并粘贴第一个字母k
以上是关于如何调试并查看随着时间的推移存储到线程间通信插件的 FIFO 队列中的内容?的主要内容,如果未能解决你的问题,请参考以下文章