远程 MSMQ 连接性能

Remote MSMQ connection performance

我们在跨远程私有 MSMQ 队列迭代期间遇到性能不足的问题。我们尝试同时使用 API 方法 - MessageQueue.GetAllMessages() 和 MessageQueue.GetEnumerator2() 并看到相同的结果。

看来问题出在消息队列服务上,因为它总是只使用最多 15% CPU(单核)。例如,如果我们遍历本地队列——我们使用 100% 的 CPU 并且可以在 2 秒内加载 100 万条消息,但对于远程队列,加载 10K 条消息需要 30 秒!网络连接为 100MBPs。

有没有办法提高远程队列的 MSMQ 性能并强制它使用 100% 的 CPU 或网络?

这可能与您的方案相关,也可能不相关,但这是提高 MSMQ 整体性能的一种方式。

如果您要发送包装一致类型的消息 - 例如序列化 class - 在发送之前缓冲它们并发送一条包含项目数组或集合的消息。

我正在处理一些序列化的 class 并发送大量消息。我测试并发现,如果我以 50 个为一组而不是单独发送它们,那么队列的大小会减少 75%。我没有花太多时间从那里进行优化。这取决于您的消息的大小。但这消除了发送单个消息所产生的大部分开销。

尝试使用 TCP 连接语法并使用明确的数字 IP 地址 123.123.123.123。看看这是否会影响您的表现。如果确实如此,则考虑安全性。

您使用术语 GetMessage,但也谈论加载,所以我很困惑您是否希望在消息接收“GetOne”或加载到队列操作上获得性能。

对于核心生产代码,我总是一次对消息进行一个操作,因此除了特定的管理功能外,我从不尝试 GetAllMessages 或 EnumerateAllMessages。

MSMQ 经过优化,可以尽可能快地运行 - 它不会为了激怒您而变慢。

远程队列的性能会很差。这不是使用 MSMQ 的最佳方式。通过"send remote, read local"模型获得高性能。

远程访问使用 RPC,这在 LAN 上会很慢。如果查看网络跟踪,就会看到所有的来回通信。绑定到远程 RPC 服务并查询以查找 MSMQ 正在监听的位置;绑定到远程 MSMQ RPC 侦听器;向听众请求消息;等等