我正在写一个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
。我确实得到了改进(即需要更多的负载来达到上限),但我也遇到了同样的例外。
非常感谢您的宝贵时间
乔治
嗨,感谢您的回复。那么我使用单身的理由是我无法控制的。这个配置已经签发了,因为这个配置是无法完成的。 我现在需要推理的是,消息丢失在高峰负载时是不可避免的。 – Giorgos 2011-04-08 09:52:23
@Gioros:在那种情况下,我担心你可能会被卡住。您的更改请求应该包括单例行为的描述,以及与其他实例管理配置的比较。 Juval Lowy有一些很好的msdn文章和书籍供您参考。祝你好运,我有兴趣听听什么设计决定导致你使用单身配置。 – stephenl 2011-04-08 10:03:09
我会对自己感兴趣:-)我想虽然这是可靠性的原因,因为没有多线程回调(=>少多线程头痛)将涉及.. – Giorgos 2011-04-08 12:29:56