我正在开发一个调用后端c#服务器应用程序的C#WCF服务。
我们正在对服务进行性能测试。
例如,每个测试可能包含这些步骤 - 登录 - 创建应用程序对象(由服务器应用程序在Sql数据库中创建) - 删除应用程序对象 - 注销
我们使用100个并发用户(即唯一客户端线程)运行测试,没有加速,测试步骤之间没有用户等待时间
我们在服务器端进行了相当多的优化,因此当我们重复运行时测试运行得很好 - 比如100个并发线程,每个线程重复测试步骤25次 - 结果通常大约平均1秒测试中每个步骤的响应时间都可以。
然而,当我们使用100个并发用户运行测试但仅在每个线程中运行一次测试时,结果是不一致的 - 有时测试步骤可能需要更长的时间,测试步骤的平均流逝时间可能是5秒
似乎在突然爆发的活动中,服务返回不一致的性能结果。
我尝试了几项优化性能的方法
(为了与客户端兼容,WCF绑定必须是BasicHttpBinding)
我发现运行测试和变化的参数可用于调整应用程序性能,但是当我们运行100个并发客户端线程重复测试步骤1次时,我们仍然遇到性能结果更差且更不一致的问题。
我的问题是:调整c#WCF服务的最佳方法是什么,以便它能够很好地响应突然爆发的客户端活动?
感谢。
答案 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可以在任何情况下都很好用