优化突发负载下WCF服务的性能

时间:2015-01-13 16:40:01

标签: c# .net multithreading wcf load

我正在开发一个调用后端c#服务器应用程序的C#WCF服务。

我们正在对服务进行性能测试。

例如,每个测试可能包含这些步骤 - 登录 - 创建应用程序对象(由服务器应用程序在Sql数据库中创建) - 删除应用程序对象 - 注销

我们使用100个并发用户(即唯一客户端线程)运行测试,没有加速,测试步骤之间没有用户等待时间

我们在服务器端进行了相当多的优化,因此当我们重复运行时测试运行得很好 - 比如100个并发线程,每个线程重复测试步骤25次 - 结果通常大约平均1秒测试中每个步骤的响应时间都可以。

然而,当我们使用100个并发用户运行测试但仅在每个线程中运行一次测试时,结果是不一致的 - 有时测试步骤可能需要更长的时间,测试步骤的平均流逝时间可能是5秒

似乎在突然爆发的活动中,服务返回不一致的性能结果。

我尝试了几项优化性能的方法

(为了与客户端兼容,WCF绑定必须是BasicHttpBinding)

  • 在WCF配置中更改serviceThrottling maxConcurrentCalls和maxConcurrentSessions参数
  • 使用信号量来限制Wcf服务中的并发请求数
  • 在wcf服务中实现方法作为任务(.net版本为4.5)
  • 制作方法异步任务
  • 使用setMinThreads调整ThreadPool的大小
  • 使用自定义属性扩展WCF以根据此Msdn文章(http://msdn.microsoft.com/en-us/magazine/cc163321.aspx)实现自定义ThreadPool

我发现运行测试和变化的参数可用于调整应用程序性能,但是当我们运行100个并发客户端线程重复测试步骤1次时,我们仍然遇到性能结果更差且更不一致的问题。

我的问题是:调整c#WCF服务的最佳方法是什么,以便它能够很好地响应突然爆发的客户端活动?

感谢。

1 个答案:

答案 0 :(得分:1)

决定发布答案,所以这里有好处:

1 - 检查concurency连接。有时小型服务器可能会限制在2到50之间,这非常低。您的服务器管理员应该知道该怎么做。

2 - 可以在WCF上进行负载均衡,并且可以在多个服务器上进行分配时提供帮助。

3 - 让IIS主机服务器只进行IIS工作。即没有运行SQL

4 - 不要在每个请求中打开WCF服务连接,查询,关闭连接。每次都需要握手,并且随着时间的推移,多个用户因此而失去了很多时间。而是在应用程序启动时打开一次连接,在退出时关闭(或明显错误)

5 - 在服务中使用较小的类型。尝试避免使用十进制,int64等类型。十进制是128位,int64是64位,执行速度比float / double / int慢得多。显然,如果您绝对需要使用它们,请尝试限制。

6 - 一个单一的大方法会让每个人的整体时间变得更慢,因为等待线增长得更快,IIS更慢,如果由于超时而有很多用户,可能会松开新的连接。但是较小的方法对于每个人来说都需要更长的时间,因为数据的来回额外来回,但是用户会看到更多的进展,并且即使实际上没有,也会觉得软件更快。

BasicHttpbinding可以在任何情况下都很好用