【问题标题】:Maximizing SQL Server Service Broker Throughput最大化 SQL Server 服务代理吞吐量
【发布时间】:2013-05-10 17:58:08
【问题描述】:

我们已经为我们的应用程序实施了 SSB 消息传递解决方案,但现在遇到了扩展问题。任何有扩展 SSB 应用程序经验的人都可以就我们可能做错的地方提供任何建议吗?

设置是我们使用单个启动器队列,该队列为单个目标队列提供激活的过程。激活的过程处理接收到的消息,并有选择地将它们分派给已注册相关类型消息的客户端。

此第二阶段调度再次使用单个发起者队列(与用于初始消息注入的发起者队列不同)并将消息发送到确定为合适的任意数量的客户端队列。

每个客户端都对数据库执行操作,创建发送给所有其他客户端的消息,因此这是一个 N^2 扩展问题。对于相对较少数量的客户端(10 或更少),这对我们来说不是问题,但是当我们扩展到 N=35 或 N=40 范围时,我们开始将消息排入队列的速度比我们处理它们的速度更快工作流程中的点,我们开始遇到严重的延迟问题。不过,我们失败的负载仍远低于所报告的 SSB 实现的最佳性能,因此我确信我们的实现存在缺陷。

相关诊断包括:

  1. 即使在我们见过的最繁重的客户端负载下,我们的服务器也有充足的 CPU、I/O 和网络带宽可用,即使消息正在队列中备份。
  2. 我们已将系统配置为激活从 5 个已激活过程副本到 512 个副本的任意位置,对吞吐量和最终用户性能几乎没有明显影响。
  3. 激活的过程一次对多条消息进行操作,并使用一些温和的 XML 查询和针对一些小型数据库表的 SELECTS 来处理它们。我们在空载条件下测试了这个过程,它的开销很小。
  4. 我们发现 LCK_M_X、PAGELATCH_SH、PAGELATCH_EX 和 WRITELOG 等待的百分比很高(这些是前 4 名违规者)。
  5. 在最重负载下,我们显示的每秒发送次数大约是每秒接收次数的两倍。

如果有其他诊断对任何可能知道我们可以做些什么来加快配置速度的人有所帮助,我可能会找到它们。

【问题讨论】:

  • 您如何管理对话?您是在循环使用对话 ID 还是为每条消息创建一个?
  • 我们正在回收对话 ID——我们为每个连接到服务器的客户端打开一个对话,并通过专用对话为该客户端发送所有消息。

标签: sql-server performance sql-server-2008-r2 service-broker


【解决方案1】:

在我们最重的负载下,我们每秒显示的 SEND 数大约是我们看到的每秒 RECEIVE 数的两倍。

我认为这是问题的症结所在。计数器测量语句执行率,而不是消息。这意味着您的 RECEIVE 在每个结果集上可能只收到一两条消息。由于conversation group locking RECEIVE 仅限于在它返回的每个结果上检索一个对话组。即使队列中有数千条消息可用,如果它们都在单独的对话中,RECEIVE 将只返回一条。正如您所描述的,这通常会导致性能不佳和症状。

为了实现高吞吐量,您必须以某种方式让消息属于少数对话,以便 RECEIVE 可以在有问题的队列上产生重要的结果集。如何实现这一点取决于您的业务工作流程的具体情况。

【讨论】:

  • 接受这个作为答案。绝对使用 MOVE CONVERSATION 将所有对话转移到一组有助于提高检索吞吐量。我还需要做一些额外的工作来优化消息的正确分派(我了解到,XML 查询非常敏感),但这确实超出了 Service Broker 本身的范围。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多