.net - 企业服务器 WCF 压力/线束测试

标签 .net performance wcf http stress-testing

我写信是为了问一个关于 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,但经过大量阅读和调整 session 后,我只遇到了两个异常(仅在非常高的负载下)

  • 底层连接已关闭: 预期的连接 keep alive 被服务器关闭了。
  • 接收时发生错误 对 的 HTTP 响应。这可能是由于 到服务端点绑定(bind)不 使用 HTTP 协议(protocol)。这可以 也可能是由于 HTTP 请求 上下文被服务器中止 (可能是由于服务关闭 向下)。查看服务器日志了解更多 详细信息。

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

<强>3。采取的行动

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

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

跟踪日志中没有报告任何错误

<强>4。理想情况下...

...我希望有一个服务器随着负载的增加而变慢,但不会错过消息。 (即,如果有 500 位其他人正在使用该服务,如果一个客户需要 10 秒才能得到答复,这没问题)

在 WCF over Http 和单线程、单上下文服务下这可能吗?我是否缺少此处的设置,或者我是否达到了上限并获得了预期的 WCF 行为?

注意:我试过使用 ConcurrencyMode.Multiple .我确实得到了改进(即需要更多负载才能达到上限)但我确实遇到了相同的异常。

最佳答案

您最好的选择是使用 netMsmqBinding . Here is an overview如果您不熟悉它是如何工作的。此绑定(bind)将允许您的服务使用 MSMQ 对超额负载进行排队,这样消息就不会丢失。这应该可以解决您的问题。

关于.net - 企业服务器 WCF 压力/线束测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5592605/

相关文章:

c# - 在 C# 中使用已知模式解析 Lisp S-Expressions

c++ - 减少 C++ 代码中的循环次数是否有助于提高速度?

javascript - 这个 JavaScript 函数的时间复杂度是线性的还是二次的?

java - 一个有效的 equals(Object o) 实现

c# - 如何在 .NET 中启用或禁用 Windows 服务?

.net - 如何提高 .NET 中的 WMI 性能?

.net - 分布式应用的高性能中间件通信

WCF 数据服务 - 更新记录而不是插入记录

c# - WCF REST 服务和状态轮询

.NET 内省(introspection) VS 反射