我发现 PERSISTENT 消息的性能比 NON_PERSISTENT 消息慢得多。 我发送和接收non_persistent消息,性能如下。
Method Number of Msg Elapsed Time
Sending - 500 messages - 00:00:0332
Receiving - 500 messages - 00:00:0281
我发送和接收持久化消息,性能如下。
Sending - 500 messages - 00:07:0688
Receiving - 500 messages - 00:06:0934
此行为在 MQMessage 和 JMSMessage 中都会发生。
感谢所有帮助我解决问题的人。
特别感谢 Shashi、T.Rob 和 Pangea。
最佳答案
鉴于新标题,我发现我现在对这个问题有了回应。
是的,在所有其他方面都相同的情况下,持久消息总是比非持久消息花费更长的时间。不过,它们变慢的程度是高度可调的。为了获得您所看到的结果,队列管理器可能进行了许多最坏情况的调整。以下是一些适用的因素:
- 磁盘是本地磁盘还是网络磁盘。对于与安装在旋转磁盘上的 NFS 通信的 100MBS 和更慢的连接,本地驱动器几乎总是快得多。 (然而,使用光纤 channel 和电池支持的缓存 Controller 安装到 SAN 几乎总是比本地旋转驱动器更快。)一个常见的例子是使用消费级 NAS 驱动器。尽管家庭 NAS 设备很棒,但吞吐量总是比本地磁盘慢。
- 对于本地驱动器,驱动器的速度。较新的“绿色”驱动器会改变转速以节省电力。与 10k RPM 驱动器相比,即使是 7200RPM 磁盘也会表现出性能下降。
- 对于本地驱动器,碎片程度。即使消息很小,它们也会被放入可能高度分散的预分配日志文件中。
- 将磁盘和日志文件放在同一个本地卷上。这会导致 head 争用,因为在控制返回到应用程序之前,一条消息会写入两个文件。
- 线性日志与圆形日志。线性较慢,因为日志格式化程序每次都必须分配新的。
- 是否使用同步点。如果在单个工作单元中写入许多消息,WMQ 可以使用缓存写入并优化扇区放置操作。只有 COMMIT 需要成为阻塞调用。
由于非持久性消息完全在内存中处理,或者溢出到最多一个磁盘文件,因此它们不受大多数这些问题的影响。
关于java - PERSISTENT 消息的性能比 NON_PERSISTENT 消息慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11303935/