2012-02-01 163 views
3

我在machine1中运行MQ服务器7.1。我有一台运行在机器2上的java应用程序,它使用JMS将消息写入机器1中的队列。java应用程序每秒处理数百条消息(数据来自其他地方)。目前,对于200条文本消息(平均大小为600字节)或每秒2000条消息需要大约100ms才能将消息写入队列。这是合理的表现。人们可以做些什么来进一步提高性能。即更快?WebSphere MQ性能

回答

8

WebSphere MQ性能报告中提供了许多详细的建议。这些发布为SupportPacs。如果您从SupportPac landing page开始,那么您需要的名称全部命名为MPxx,并且可用于每个平台和每个版本。

正如您将从SupportPacs中看到的那样,WMQ开箱即用,针对各种消息大小和类型的多种变化来优化速度和可靠性。通过配置和设计/体系结构进行调整具有相当大的自由度。

从配置的角度来看,存在用于持久和非持久消息的缓冲区,用于减少磁盘写入完整性从三重写入到单一写入的选项,调整日志文件大小和数字,连接复用等,等等。你可以从中推断出QMgr对特定交通特征的调整越多,你就能越快地实现它。另一方面,如果一种新的流量出现在调整规范之外,那么QMgr会进行调整,从而导致严重反应。

我也看到了分配WMQ文件系统以分离主轴的巨大性能改进。当写入持久性消息时,它既将队列文件也记录到日志文件。如果这两个文件系统争用相同的磁盘读写头,则可能会降低性能。这就是WMQ有时在高性能笔记本电脑上运行速度比在大小相同的虚拟机或服务器上慢的原因。如果笔记本电脑具有物理旋转磁盘,其中WMQ文件系统都被分配并且服务器具有SAN,则没有任何比较。

从设计的角度来看,并行性可以获得很多性能。性能报告显示,增加更多的客户端连接可显着提高性能,直至达到平衡并最终开始下降。幸运的是,在客户端崩溃之前,客户端的数量非常多,并且Web应用服务器通常会在WMQ执行之前陷入停顿状态,仅仅需要Java线程的数量。

另一个可以产生巨大差异的实现细节是提交间隔。如果应用程序可以一次放置或获取多条消息,则可以提高性能。在发生COMMIT之前,同步点之下的持久消息不需要刷新到磁盘。在单个工作单元中编写多条消息可以使WMQ更快地将控制权返回给程序,缓冲写入,然后比写一条消息更有效地优化它们。

Of Mice and Elephants文章包含更多的调整选项的深入讨论。它是developerWorks Mission:Messaging系列的一部分,其中包含一些其他也涉及调优的文章。

+0

非常感谢,这对我帮助很大。目前,我正在XA交易中发送100封邮件。我能够以批量插入的方式将100条消息插入数据库,从而提高性能。 MQ的提交间隔方法与DB的批量插入类似吗?这让我感兴趣,我会研究它。 – arrehman 2012-02-01 19:56:19

+2

“提交间隔”我只是在发出应用程序在发出“COMMIT”之前读取和/或写入多少消息,而不是MQ设置。某些应用程序(如请求/回复)在一个工作单元中最适合一条消息。但是对于像批处理或转换这样的东西,可以读取消息,写出结果消息并循环,只对每次x次迭代发出“COMMIT”。由于数据库在每次交易中进行批量更新(100次更新),显而易见的是将WMQ消息包含在XA事务中,导致WMQ提交间隔为100. – 2012-02-01 21:01:32

+0

Rob,这正是我现在所做的。 100将数据库记录为批处理插入,将100条消息记录到队列中(100次发送),所有这些都在XA事务中进行。队列上的队列深度增加了100.所以这对我来说很有用。 – arrehman 2012-02-01 23:33:09

1
+0

请注意,[只提供链接的答案](http://meta.stackoverflow.com/tags/link-only-answers/info),所以答案应该是搜索解决方案的终点(vs.而另一个引用的中途停留时间往往会随着时间推移而过时)。请考虑在此添加独立的摘要,并将链接保留为参考。 – kleopatra 2014-01-13 09:49:20