1

我们正在开发一个使用 WCF + SQL Azure 进行数据访问的多租户系统。基本上,我们在 Azure 中托管了 WCF 服务,我们的客户端连接到该服务,然后此 WCF 服务查询 SQL 数据库以获取数据并将数据返回给客户端。其他一切都运行良好,但客户端和 WCF 之间的通道存在一些奇怪的性能问题。

似乎如果有足够多的并发用户使用我们的服务,WCF 就会开始阻塞连接。“足够”是指大约 20 到 30 个用户每秒进行大约 1 次查询,这反过来应该是我希望 WCF 能够毫无问题地处理的事情。每次查询花费在 WCF 服务上的时间不到 1 秒,通常为 100 到 200 毫秒。

我们认为 WCF 阻塞连接的原因是:

  1. 我们记录了在 WCF 服务中花费的时间和 WCF 调用的总时间,它们之间存在很大差异。例如,在 WCF 服务中花费的时间可能是 100 毫秒,而总时间(从客户端的角度来看)可能是 5000 毫秒甚至 10000 毫秒。
  2. 客户端可能运行良好,直到它达到第一个峰值。随后的调用将花费很长时间甚至超时。
  3. 有时客户端根本无法连接到服务。

WCF 服务正在使用 netTcpBinding 并配置了以下设置:

ServicePointManager.DefaultConnectionLimit = 1024;
netTcpBinding.MaxConnections = 1024;
netTcpBinding.SendTimeout = 5 minutes
netTcpBinding.ReceiveTimeout = 5 minutes
serviceThrottlingBehavior.MaxConcurrentCalls = 1024;
serviceThrottlingBehavior.MaxConcurrentInstances = 1024;
serviceThrottlingBehavior.MaxConcurrentSessions = 1024;

我不确定这是否重要,但所有客户端都在同一个 IP 地址后面。此外,每个请求都会打开和关闭通道(主要是因为 Azure 在连接空闲 1 分钟后关闭连接,而我们无法弄清楚如何以稳健的方式处理此问题)。

有任何想法吗?

以下问题与此相关,但它们确实没有提供答案: 如何扩展 SQL azure? SQL Azure 与 WCF 性能对比

4

1 回答 1

1

在 WCF 中启用诊断,它将帮助您识别问题。

再次查看您的节流配置:

http://msdn.microsoft.com/en-us/library/ms731379.aspx

http://msdn.microsoft.com/en-us/library/vstudio/ms735114(v=vs.100).aspx

http://www.codeproject.com/Articles/33362/WCF-Throttling

如果您要传输大型对象,请将默认的 TransferMode 更改为 Streammed。

于 2013-11-01T16:41:17.473 回答