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

本文关键字:服务 性能 WCF 优化 突然 负载 | 更新日期: 2023-09-27 18:37:19

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

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

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

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

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

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

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

我尝试了几种方法来优化性能

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

  • 改变服务限制 WCF 配置中的 maxConcurrentCalls 和 maxConcurrentSessions 参数
  • 使用信号量限制 WCF 服务内的并发请求数
  • 将 WCF 服务中的方法实现为任务(.net 版本为 4.5)
  • 使方法异步任务
  • 使用 setMinThreads 调整线程池的大小
  • 使用自定义属性扩展 WCF 以实现自定义线程池,如此 Msdn 文章 ( http://msdn.microsoft.com/en-us/magazine/cc163321.aspx )

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

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

谢谢。

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

决定发布作为答案,所以这里是好事:

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

2 - 使用 WCF 进行负载平衡是可能的,并且在拆分到多个服务器时有很大帮助。

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

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

5 - 在服务中使用较小的类型。尽量避免使用十进制、int64 等类型。十进制是 128 位,int64 是 64 位,执行速度比浮点/双精度/整数慢得多。显然,如果您绝对需要使用它们,请使用它们,但请尝试限制。

6 - 单个大方法会使每个人的整体计时变慢,因为等待线增长得越来越快,IIS 变慢,并且如果您由于超时而有很多用户,则可能会丢失新连接。但是较小的方法对每个人来说都需要更长的时间,因为额外的数据来回,但用户会看到更多的进步,并且会觉得软件更快,即使它真的不是。

BasicHttpbinding 在任何情况下都很好用