我们在远程私有MSMQ队列的迭代过程中遇到了性能不足的问题。我们尝试使用两种API方法 - MessageQueue.GetAllMessages()和MessageQueue.GetEnumerator2(),并看到相同的结果。
似乎问题出现在消息队列服务中,因为它总是只使用高达15%的CPU(单核)。例如,如果我们遍历本地队列 - 我们使用100%的CPU并且可以在2秒内加载100万条消息,但对于远程队列,只需加载10K就需要30秒!网络连接是100MBPs。
有没有办法提高远程队列的MSMQ性能并强制它使用100%的CPU或网络?
答案 0 :(得分:3)
MSMQ经过优化,可以尽可能快地进行 - 只是为了激怒你,它不会变慢。
远程队列的性能很差。这不是使用MSMQ的最佳方式。通过“发送远程,读取本地”模型获得高性能。
远程访问使用RPC,它在LAN上会很慢。如果您查看网络跟踪,您将看到所有来回通信。绑定到远程RPC服务并查询以查找MSMQ正在侦听的位置;绑定到远程MSMQ RPC侦听器;请求来自听众的消息;等等。
答案 1 :(得分:0)
这可能与您的场景相关,也可能不相关,但它是提高MSMQ整体性能的一种方法。
如果您正在发送包装一致类型的消息 - 例如序列化类 - 在发送之前缓冲它们并发送一条包含数组或项集合的消息。
我正在处理一些序列化的类并发送大量的消息。我测试并发现,如果我分批发送它们而不是单独发送它们,那么队列的大小减少了75%。我没有花太多时间从那里优化。这取决于您的邮件大小。但这消除了发送单个消息所产生的大量开销。
答案 2 :(得分:0)
尝试使用TCP连接语法并使用显式数字IP地址123.123.123.123。看看这是否会影响您的表现。如果确实如此,则考虑安全性。
你使用术语GetMessage但也谈论加载所以我很困惑你是否想要在Message Receive“GetOne”上表现或加载到队列操作中。
对于核心生产代码,我总是在消息上一次操作一个,所以除了特定的管理功能外,我从不尝试GetAllMessages或EnumerateAllMessages。