Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 最大化SQL Server Service Broker吞吐量_Sql Server_Performance_Sql Server 2008 R2_Service Broker - Fatal编程技术网

Sql server 最大化SQL Server Service Broker吞吐量

Sql server 最大化SQL Server Service Broker吞吐量,sql-server,performance,sql-server-2008-r2,service-broker,Sql Server,Performance,Sql Server 2008 R2,Service Broker,我们已经为我们的应用程序实现了SSB消息传递解决方案,但现在遇到了扩展问题。在SSB应用程序的扩展方面有经验的人能否就我们可能做错的地方提供一些建议 设置是我们使用一个启动器队列,它向一个目标队列提供一个激活的过程。激活的过程处理接收到的消息,并有选择地将它们发送给已注册相关类型消息的客户端 第二阶段调度再次使用一个不同于初始消息注入所用的初始化器队列,并将消息发送到确定为适当数量的客户机队列 每个客户端都对数据库执行操作,创建发送到所有其他客户端的消息,因此这是一个N^2缩放问题。对于数量相对

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

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

第二阶段调度再次使用一个不同于初始消息注入所用的初始化器队列,并将消息发送到确定为适当数量的客户机队列

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

相关诊断包括:

我们的服务器拥有大量的CPU、I/O和网络带宽,即使在我们看到的最重的客户端负载下,即使消息正在队列中备份。 我们已将系统配置为激活已激活过程的5个副本到512个副本,对吞吐量和最终用户性能几乎没有明显影响。 激活的过程一次对多条消息进行操作,并使用一些温和的XML查询对它们进行处理,并根据一些小的数据库表进行选择。我们已经在空载条件下测试了这个程序,它的开销很小。 我们显示,LCK_M_X、PAGELATCH_SH、PAGELATCH_EX和WRITELOG waits的比例很高,这四个都是前四名的违规者。 我们显示的每秒发送数大约是我们在最重负载下每秒接收数的两倍。 如果有其他诊断方法对任何人都有帮助,他们可能知道我们可以做些什么来加速配置,我可能会找到它们

我们显示的每秒发送数大约是我们在最重负载下每秒接收数的两倍

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


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

您如何管理对话?您正在循环会话ID还是为每条消息创建一个会话ID?我们正在循环会话ID-我们为连接到服务器的每个客户端打开一个会话,并通过专用会话发送该客户端的所有消息。接受此作为答案。当然,使用移动会话将所有会话转移到一个组中有助于提高检索吞吐量。我还需要做更多的工作来优化消息的正确分发。据我所知,XML查询非常敏感,但这实际上超出了ServiceBroker本身的范围。非常感谢你的帮助!