2011-04-08 77 views
3

我正在写一个WCF性能问题。企业服务器WCF压力/线束测试

1.背景

我们有一个基于.NET 3.5上运行的客户端 - 服务器系统。该服务器是一个C#服务,客户端是一个silverlight应用程序

我写了一个应力测试机是一个WinForms应用程序和工作方式是:

  • 它生成工作进程
  • 工作进程火不同 应力负载[eg for (i=0;i<100;i++) Send(payload)]
  • 的服务正在运行的 [ServiceBehavior(InstanceContextMode =InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
  • 所有超时(操作,发送接收 ,..)已经被设置为最大
  • serviceThrottling: maxConcurrentSessions="200"
  • 消息启用跟踪并打印 一切

2.问题

经过一些阈值(取决于压力测试负载和测试环境),我的工作进程(正常.NET 3.5 C#控制台应用程序)开始抛出异常。我最初得到timeoutExceptions但很多读&的调整会议后,我到了一个地步,我得到的只有两个例外(仅适用于极高负荷下)

  • 基础连接被关闭: 这是一个连接预计将被服务器关闭的 保持活着。
  • 接收到 HTTP响应时发生错误。这可能是由于 到服务端点绑定不是 使用HTTP协议。这也可能是由于HTTP请求 上下文被服务器 中止(可能由于服务关闭了 而导致)。请参阅服务器日志以获取更多 的详细信息。

除此之外,我可以看到实质性的信息丢失。服务器永远不会失败(这很好)。我认为服务器只是拒绝它无法处理的消息。

3.采取的行动

我已阅读的文章很多和调整很多参数(包括限制,超时等)。例如,我尝试了所有的建议:http://www.codeproject.com/KB/WCF/WCFThrottling.aspx

我确实获得了性能改进,但取决于我运行服务器的环境,我将达到此上限并开始拒绝邮件。

完全没有错误报告跟踪日志中

4.理想的情况下...

...我想有,随着负载的增加变慢的服务器,但不错过消息。 (即,如果客户端需要10秒才能得到答复,如果500人正在使用该服务,则可以)

这是可能在WCF上通过Http和单线程,单一上下文服务?我在这里是否错过了一个设置,或者我是否达到了上限并获得了预期的WCF行为?

注意:我试过使用ConcurrencyMode.Multiple。我确实得到了改进(即需要更多的负载来达到上限),但我也遇到了同样的例外。

非常感谢您的宝贵时间

乔治

回答

1

我想我'找到'我的答案!

我会在这里解释我在遇到别人碰到这个时做了什么。

首先,你可以检查呼叫超出计数器,这就像一个T * CP积压*。

另外在perfmon可以看到有多少个呼叫正在同时处理,有多少个正在排队。

这两个指标让我可以验证我的确是在打顶。因此我需要在发送消息时发送/ rcv一些ACK的代码。幸运的是MS已经为我们做了这个!其名为可靠的WCF消息

http://msdn.microsoft.com/en-us/library/ms730123.aspx http://msdn.microsoft.com/en-us/library/aa480191.aspx

通过实施WsHttpBinding的服务器下,而这在以前失败的负载可以应付。另外,服务器能够处理两倍于之前的负载。

显然有一个性能开销,但它确实是可靠的。

好极了,所以我想,现在我发现了解决方案,我可以告诉用户所有那些奇妙的东西都在那里,但是他们不会得到这个,因为他们的客户端运行在silverlight 3上没有可靠的WCF实现... yey!

0

有你为什么要运行一个单独服务特别的原因?除非你想与你的所有服务分享一些状态,否则我会完全避免它。 singleton的问题是它的状态可以通过连接到它的多个工作线程中的任何线程来更改,因此它必须同步访问以避免状态损坏。这是相当昂贵的,并且确保一次只有一个客户端可以访问单例。

如果您需要在多个请求之间维护状态,则更喜欢使用每个呼叫或会话。

+0

嗨,感谢您的回复。那么我使用单身的理由是我无法控制的。这个配置已经签发了,因为这个配置是无法完成的。 我现在需要推理的是,消息丢失在高峰负载时是不可避免的。 – Giorgos 2011-04-08 09:52:23

+1

@Gioros:在那种情况下,我担心你可能会被卡住。您的更改请求应该包括单例行为的描述,以及与其他实例管理配置的比较。 Juval Lowy有一些很好的msdn文章和书籍供您参考。祝你好运,我有兴趣听听什么设计决定导致你使用单身配置。 – stephenl 2011-04-08 10:03:09

+0

我会对自己感兴趣:-)我想虽然这是可靠性的原因,因为没有多线程回调(=>少多线程头痛)将涉及.. – Giorgos 2011-04-08 12:29:56

0

您还应该尝试trouting ASP.NET Threapool配置:http://support.microsoft.com/kb/821268由于服务在IIS下托管。

问候, 阿米特·巴蒂亚

+0

感谢您的答案阿米特。 WCF服务托管在自定义的Windows服务&&!IIS下。 加号不是(InstanceContextMode =InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)意味着一切都只有一个线程? – Giorgos 2011-04-08 16:23:24

1

你最好的办法是使用netMsmqBinding。如果你不熟悉它的工作原理,请致电Here is an overview。此绑定将允许您的服务使用MSMQ排队多余的负载,以便消息不会丢失。这应该可以解决你的问题。

+0

感谢您的回复。这也应该解决我的问题。但像可靠的绑定选项,这也不是在Silverlight 3 .. – Giorgos 2011-04-08 14:31:01

+0

我还没有尝试过这一点,但你可以让你的Silverlight客户端使用basicHttpBinding调用WCF路由服务,然后让你的路由服务将呼叫路由到实际服务netMsmqBinding。理论上可能有效。我之前使用过Silverlight的路由服务,它工作得很好。无论如何要尝试一些东西。 – BrandonZeider 2011-04-08 14:40:33

+0

有趣的想法,谢谢!我能想到的唯一的怪癖是如果路由服务没有正确的负载平衡=>我们最终在获得问题之前淹没这个问题 – Giorgos 2011-04-08 14:58:40