如何提高.NET WCF服务的性能?

3
我正在将一个计算密集型的 .net 4.0 windows 应用程序移植到 .net 4.0 wcf 服务。基本上,我只是将 .net 类导入到了 wcf 服务中。
一切都运行良好,除了 wcf 服务的性能 - 在与开发机器相同的 aspx.net wcf 服务上运行任务需要 6267947 个时钟周期 (2539ms),而在本地机器上使用了 815349861 个时钟周期 (13045ms)。
我已经将服务和测试客户端上传到 appharbor,性能与我的本地机器一样差 - 我的测试应用程序链接是:http://www.wsolver.com/。有什么想法可以改善性能吗?

你的服务需要做什么类型的工作? - Johnny Graber
2
实际的“执行”代码应该需要相同的时间。转换到WCF只应影响传输问题,假设您没有使用同步上下文等。您能澄清一下:那个时间是在哪里测量的?“执行”代码?还是传输?或者...? - Marc Gravell
我点击了你的测试网站链接3次,所有3个请求都花费了2.1到2.5秒的时间,这正是你所说的“良好”的性能指标(2539毫秒)。你是否多次访问了你的WCF服务,并且排除了最低和最高的数字来获得平均值?如果你只访问了一次,那么我可以理解第一次访问需要13秒,特别是如果它是IIS托管的第一次访问。 - CodingWithSpike
@rally25rs,我的测试用例比默认值多了更多的机架字母(如果这个问题没有表述清楚,我很抱歉),因此服务端大约需要13秒,而Windows应用程序需要2.5秒。 - Muleskinner
1
@friism tak!在应用程序启动时缓存字典 trie,出于某种原因提高了性能,现在 WCF 服务在本地运行的速度与 Windows 应用程序一样快 - 在线 Apphb 版本大约慢三倍。我猜这与分配的 CPU 资源有关。 - Muleskinner
显示剩余5条评论
5个回答

3

我认为这是一个很好的链接列表,但您能否详细介绍一些您发现有用的特定技术? - MatthewJ

3

检查在请求时间可能构建的您服务上的任何依赖项。这些包括构造函数依赖关系和字段/属性依赖关系。也许其中一个正在导致延迟?如果是这种情况,请考虑使用单例来实例化长时间运行的类。

您是否确认后续请求仍然会导致延迟?

此外,创建一个全新的服务,执行一些简单操作,如Datetime.Now.toString(),并查看是否存在相同的问题。


2
如果需要进行耗时的复杂数据结构初始化,则应在Application_Start()中执行一次,并将生成的数据结构分配给MvcApplication对象上的静态变量。仅在应用程序启动时执行此操作比在每个请求中执行此操作要快得多。

谢谢,您认为在本地运行wcf服务与在appharbor上在线运行(计算速度慢3倍,不考虑网络流量)的性能差异可以解释为appharbor缺乏足够的CPU资源吗?如果是这样,通过购买额外的工作线程,性能是否可以得到优化? - Muleskinner
购买额外的工作人员不会增加个人请求响应时间,但会增加总请求吞吐量,因为您获得了额外的并发性。我们正在考虑是否应该添加更高功率的个人工作人员。您可能需要考虑在同步请求中执行此类资源密集型处理是否合适,以及将其移动到异步 AJAX 请求可能更好。 - friism

1

我会在13秒内(或使用procdump进行多次)进行完整的内存转储,然后实际查看进程中发生了什么(使用windbg和sos.dll)。然后,您可以缩小哪些代码是罪魁祸首。


0

我理解字典树只会被加载一次到缓存中?你不是每次调用都在加载它吧?


目前每次调用都会加载它(这是第一个原型),但这不是问题。Trie 加载时间为 417 毫秒。 - Muleskinner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接