为啥 WCF 服务能够处理来自不同进程的调用而不是来自线程的调用
Posted
技术标签:
【中文标题】为啥 WCF 服务能够处理来自不同进程的调用而不是来自线程的调用【英文标题】:Why WCF service able to process more calls from different processes than from thread为什么 WCF 服务能够处理来自不同进程的调用而不是来自线程的调用 【发布时间】:2015-07-22 20:13:50 【问题描述】:为什么配置了每次调用实例化和多个并发的 WCF 服务在使用不同进程运行时会执行不同的操作,而从线程调用时则完全不同?
我有一个应用程序通过线程数分发数据并对 WCF 服务进行调用(不要认为代码中发生锁定,将再次测试)。在测试期间注意到分发应用程序中增加的线程数量不会提高 wcf 处理服务的整体性能,平均约为 800 mpm(每分钟处理的消息数),因此吞吐量不会真正改变,但是如果您运行第二个应用程序,那么平均吞吐量会增加到~1200 英里/分钟。
我做错了什么?我错过了什么?我无法理解这种行为。
更新 #1(对 cmets 中的问题的回答)
感谢您如此快速的回复。 配置中的最大连接数设置为 1000(在 system.net 中是)。 参考这篇文章wcf Instances and threading 最大调用应该是 16 x 核心数,所以我假设如果在 2 cpu wcf 服务上调用约 30 个线程应该接受大部分线程调用?
这和共享内存有什么关系吗?因为我认为这可能是多线程和进程之间的唯一区别。
现在没有机会用更多的 cpu 或单个来测试它。什么时候可以做。
【问题讨论】:
您是在单 CPU 核心环境中测试这个吗?我猜想涉及多个核心。尝试在单核环境中运行您的测试。 你使用什么交通工具? 尝试在您的应用程序配置(不是 wcf 配置)的 system.net 部分增加 maxconnection 值<system.net> <connectionManagement> <add address = "*" maxconnection = "24" /> </connectionManagement> </system.net>
我猜是由于线程之间的上下文切换造成的。
@weazel,您是否尝试过增加 naxconnection 值? danielroot.info/2009/02/…
【参考方案1】:
所以我认为要了解这种行为,您首先需要了解 WCF 如何使用每个调用实例化处理调用。提示在名称中 - Per Call。
任何客户端进行的每个调用都由服务的新实例提供服务(此情况的例外是可重入性,但这在您的场景中并不重要)。
所以,为服务行为配置服务并发makes no practical difference。无论调用来自单个、多线程客户端还是多个客户端,服务的行为都是相同的:它将为每个调用创建一个服务实例。
因此,整体系统性能的差异必须是由于客户端的某些原因。如果我不得不大胆猜测,我会说一个客户端比两个客户端慢,因为与 context switching 相关的成本通过在两个单独的进程中运行客户端来减轻(通过一种未识别的机制)。
如果我是正确的,那么您应该能够通过运行多个单线程客户端来获得每个线程的最高性能,这是您可以做的测试。
【讨论】:
【参考方案2】:在此操作的实现中,应将以下属性添加到类中。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class MyService : IMyService
您可以在此处阅读更多内容: http://wcftutorial.net/Per-Call-Service.aspx
【讨论】:
以上是关于为啥 WCF 服务能够处理来自不同进程的调用而不是来自线程的调用的主要内容,如果未能解决你的问题,请参考以下文章
WCF 上的 CORS - 为啥在请求来自客户端机器时指定 Web 服务器?