【问题标题】:Optimising performance of WCF service under sudden load突发负载下 WCF 服务性能优化
【发布时间】:2015-01-13 16:40:00
【问题描述】:

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

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

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

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

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

但是,当我们对 100 个并发用户运行测试但在每个线程中只运行一次测试时,结果会不一致 - 有时测试步骤可能需要相当长的时间,平均经过时间可能是 5 秒测试中的一个步骤.

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

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

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

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

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

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

谢谢。

【问题讨论】:

  • 确保 IIS 主机能够处理大量并发连接。然后,如果这已经完成并且它无助于使用 WCF 进行负载平衡。我过去曾经使用 3 台服务器来完成它。如果这仍然不够,您有大量数据正在进行,并且可能正在研究云节点类型服务器或 azure 托管上的外部托管。
  • 您是从单台计算机生成测试负载吗?我的猜测是它只能生成如此快的负载,并且每个线程只有一个测试是不同类型的负载,并且服务要处理的负载更难。

标签: c# .net multithreading wcf load


【解决方案1】:

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

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

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

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

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

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

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

BasicHttpbinding 在任何情况下都很好用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2014-03-28
    相关资源
    最近更新 更多