【问题标题】:WebSphere MQ Connection TuningWebSphere MQ 连接调优
【发布时间】:2017-06-25 09:27:08
【问题描述】:

我有一个应用程序,它使用 MDB、激活规范和队列连接工厂从 WMQ 获取/放置消息。该应用程序预计最大负载为 80 tps。 Websphere Application Server 和 WMQ 都是集群的,每个应用程序服务器都连接到单独的主机和通道。应用程序的 onMessage 方法的实现方式是,在使用消息并发送响应后,会话和连接都会关闭。

根据我们的配置,我们的 WAS 版本是 8.5,IBM MQ 队列管理器版本是 7,每个节点的行为规范的最大服务器会话数设置为 40。连接工厂中每个节点的最大连接数为 40,连接工厂会话池中的最大会话数为 10。 现在,在峰值负载下,我们预计最多可以创建 80 个 MQ 通道实例,但根据调查,我们可以看到它超过 200,这会导致达到最大实例限制时出现问题。

这是因为连接工厂会话池中的最大会话数设置为 10 造成的吗?

是否有可能即使我们在 onMessage 中关闭了会话和连接,但一个连接仍然可以有多个会话。如果是这种情况,将此属性设置为 1 是否明智? 也可以在 WMQ 中设置一些属性,这可能会导致 MQ 通道实例的增加。

【问题讨论】:

  • WAS 版本是 8.5。 IBM MQ 队列管理器版本 7。我现在不知道的 MQ 资源适配器版本,但应该是 Was 8.5 的默认版本

标签: websphere ibm-mq connection-pooling


【解决方案1】:

您没有提及 WAS 或 MQ 的特定版本,并且在特定版本中可能存在会改变行为的已知问题,但通常它应该如下所述工作。

IBM 有一篇不错的技术说明“TCP/IP Connection usage between WebSphere Application Server V7 and V8, and WebSphere MQ V7 (and later) explained”,其中详细介绍了这个主题。

您没有提及您将 SVRCONN 通道的 SHARECNV 设置为什么,如下所示,这将影响观察到的通道实例的数量,我将假设默认值为 10 进行计算。

请注意,下面的块引用来自技术说明


  • 我们已将每个节点的行为规范的 最大服务器会话数设置为 40

上面的链接说:

最大会话数 = 最大服务器会话数 + 1

最大会话数 = 40 + 1 = 41

该链接还指出:

TCP/IP 通道实例的最大数量 = 正在使用的通道的最大对话数 / SHARECNV

最大 TCP/IP 通道实例数 = 41 / 10 = 5(四舍五入到最近的连接)


  • 连接工厂中的最大连接数到每个节点的40
  • 会话池中的最大会话10 的连接工厂。

最大会话数 = 连接池最大连接数 +(连接池最大连接数 * 会话池最大连接数)

最大会话数 = 40 + (40 * 10) = 440

最大 TCP/IP 通道实例数 = 最大会话数 / SHARECNV 用于正在使用的通道

最大 TCP/IP 通道实例数 = 440 / 10 = 44


如果您的 MQ SVRCONN 通道的 SHARECNV 设置为 10,那么基于连接到单独通道的每个节点,每个通道的通道实例不应超过 49 个。

如果您达到 200 个通道实例,我怀疑您的 SHARECNV 小于 10。如果它是 1,则 WAS 尝试创建的通道实例的最大数量将上升到 481,这将受到限制频道的MAXINST200


在应用程序完成 JMS 连接并将其关闭后,它会从活动池移动到空闲池,以供重用。连接池属性未使用超时定义了 JMS 连接在断开连接之前将在空闲池中停留多长时间。该属性的默认值为 1800 秒,即 30 分钟。


从 WebSphere MQ 消息传递提供程序连接工厂创建的每个 JMS 连接都有一个关联的 JMS 会话池,其工作方式与连接池相同。可以从单个 JMS 连接创建的最大 JMS 会话数由连接工厂会话池属性最大连接数确定。此属性的默认值为 10。

会话在首次创建 JMS 会话时开始,并且将保持活动状态直到 JMS 会话关闭,因为它在空闲池中停留的时间超过了会话池的未使用超时属性的值。

当您的应用在 onMessage 中关闭会话和连接时,连接被移动到空闲池以供重用,并且会话被移动到空闲池以供重用,直到达到各自的超时时间才会关闭 MQ Channel 实例.

如果您想将最大通道数保持在 200 以下,那么您可以将 会话池最大连接数) 调整为 1,结合您的激活规范和 SHARECNV(1) 的最大值为121 个频道实例。

您还可以增加通道的 SHARECNV 值,这将导致通道实例除以该数字。

您的连接或会话可能没有正确关闭并且您有“泄漏”。

【讨论】:

  • 很抱歉没有提及 WAS 和 MQ 版本。我现在在问题中添加了这一点。感谢您的解释,这消除了我的疑问。我将更改 SHARECNV 或会话池最大连接数并检查问题是否得到解决。还有一个问题,您共享的链接还提到了在连接工厂或激活规范中设置属性 SHARECONVALLOWED。如果我增加 SHARECNV 值,则行为规范和连接工厂或仅其中一个都需要存在。
  • 乔希的好文章。谢谢你。
  • @JoshMc 我在 Test Env 中的缩小版本中尝试了这些设置,该版本具有相同版本的 WAS 和 MQ,并将 act spec 的设置 max server sessions 设置为 10 。连接工厂中的最大连接数为 10,连接工厂的会话池中的最大会话数为 10。通道中的 SHARECNV 属性设置为 10,并且在行为规范和队列连接工厂中 SHARECONVALLOWED 属性设置为 yes。但在进行了一次触发一个请求 5 分钟的小型负载测试后,通道实例上升到 54 个,这不是计算所期望的。
  • 是否只有一个 WAS 节点与该通道建立连接? DIS CHS(CHL_NAME) CONNAME 可以帮助您验证所有这些连接都来自同一个 IP。另请注意,共享对话仅适用于来自同一 JVM 的连接/会话。
  • 我还建议您提供我要求的完整版本信息,例如:WAS 8.5.x.x。 MQ v 7.x.x.x(您只提到 7,但有 7.0.x.x、7.1.x.x 和 7.5.x.x)。 IBM 记录了应该与特定 WAS 版本一起提供的 RA MQ 版本,但我遇到的问题是 RA 没有与 WAS 版本一起更新,例如:WAS 7.0.0.33 应该包含 MQ RA 7.0.1.12,但由于其他一些问题,它一直使用 WAS 7.0.0.0 附带的 MQ RA 7.0.0.0 版本。您可以使用以下命令从队列管理器中检查:DIS CHS(CHL_NAME) RVERSION
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2015-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多