在这种情况下导致瓶颈的原因是什么?

时间:2011-09-29 18:35:19

标签: .net iis asmx nservicebus

我正在寻找一些我们遇到的生产问题的帮助。

我们有一个NServiceBus处理程序,它在处理消息时向IIS 6.0上运行的asmx(.net 2.0)Web服务发送请求,然后Web服务向第三方Web服务发送第二个http请求,平均第三方服务需要500毫秒才能响应,但我们被告知只有当11个同时请求正在进行时才会开始排队请求。

为了满足我们的处理SLA,我们需要能够每小时处理79,000条消息或每分钟处理大约1300条消息。有11个请求被并行处理并平均需要500毫秒,如果我们能够获得11个并发请求,那么这应该是可以实现的,每秒我们应该能够处理大约20个消息。

我们遇到的问题是我们无法接近这些数字。我们部署的解决方案如下。我们有一个服务,每个轮询一个数据库 5秒钟检索一批100条新消息,它将它们发送给分销商,该分销商在两台服务器上运行的四个工作窗口服务之间进行负载平衡。我叫他们NsbServerA& NSbServerB。每个工作服务配置有2个线程,因此我们总共有8个线程。我们有两台运行asmx网络服务的服务器,我称之为asmx1& asmx2,ServerA向asmx1发送请求,ServerB向asmx2发送请求。

目前的吞吐量是每小时30,000条消息,每分钟约500条,每秒约8条消息,所以我们有一个瓶颈问题就在哪里?

我已经看过这篇文章http://support.microsoft.com/default.aspx?scid=kb;en-us;821268,这似乎表明如果你想对同一个webservice进行多次并发调用,你必须调整IIS 6.0进程模型。

引用文章: “如果要从每个ASPX页面调用一个IP地址进行一次Web服务调用,Microsoft建议您使用以下配置设置: 将maxWorkerThreads参数和maxIoThreads参数的值设置为100。 将maxconnection参数的值设置为12 * N(其中N是您拥有的CPU数)。 将minFreeThreads参数的值设置为88 * N,将minLocalRequestFreeThreads参数设置为76 * N. 将minWorkerThreads的值设置为50.请记住,默认情况下,minWorkerThreads不在配置文件中。你必须添加它。“

如果有人能够了解正在发生的事情或解决方案是什么,我将非常感激。

谢谢,

查理

3 个答案:

答案 0 :(得分:2)

一种可能的可能性:

ServicePointManager通过其路由所有.NET Web请求,每个对象默认有两个并发连接。请参阅ServicePointManager.DefaultConnectionLimit

因此,如果您的第三方Web服务平均需要500毫秒才能响应,那么单个服务器每秒只能对该服务执行四次请求。 (即每500毫秒有两个并发请求)。

乘以两台服务器,每秒收到大约8条消息。

尝试在启动程序时设置ServicePointManager.DefaultConnectionLimit = 4;,看看是否会增加吞吐量。

答案 1 :(得分:0)

听起来可能很多事情。

  1. 您使用的是商用的NServiceBus标准版吗?没有它,你的处理程序将工作单线程。
  2. 您的中间层Web服务是否异步?如果同步进行第二次服务往返,则线程将被绑定并且无法处理传入的请求。
  3. 您是否配置了足够的工作线程来处理传入的请求? 更新:针对高吞吐量建议,请参阅此页http://msdn.microsoft.com/en-us/library/ff647787.aspx#scalenetchapt06_topic9(“表6.1:用于减少争用的建议线程设置”)。您应该查看的设置是minFreeThreads,maxconnection,maxWorkerThreads,minWorkerThreads。
  4. 如果没有大规模的优化,如果你无法可靠地实现这一点,那么我会紧张地承诺每秒20条消息的吞吐量SLA。

    也可能是一个愚蠢的问题,但为什么你不能直接从你的消息处理程序调用远程服务?

答案 2 :(得分:0)

我建议单独测试系统的每一层。

具体来说,首先将数据库层折扣作为问题。我将一些简单的集成式单元测试放在一起,这些测试可以实现数据库的峰值吞吐量,理想情况下使用类似Parallel.ForEach的内容来同时运行几百个线程。

然后向上移动一个图层并使用类似存根的东西来“模拟”数据库调用并验证服务层的行为是否正常。

然后,至少你将能够缩小效率低下并处理它们。