这是一个帖子的翻译,个人感觉不错,对于很多学习WCF编程的人来说是个不错问题。特别是想了解WCF底层的线程模型实现机制的有所帮助。由冰红茶提出,问题个人花费2周多时间,查阅资料,这个帖子是我发到WCF英文论坛的帖子,包括数位网友的回复,这里做个整理和翻译,供大家参考。
Frank Xu Lei
:
Hi,
I have one question for WCF ?Does WCF use or Supports IOCP in Data Communication?as we know,IOCP supplies a solution to improve pefermance of the Data communicatioin for a lot of cocurrent clients.There is the same problem
for WCF like too many cocurrent clients.So I like to know more detail about IOCP and WCF.Does WCF use or Supports IOCP?Is there any offical docs or aticles for this question?
Thanks a lot.
-----------------------------------------------------------------------------------
翻译如下:
Does WCF use or Supports IOCP?
2009年7月7日 11:33Frank Xu Lei
大家好,
我有一个关于WCF的问题?WCF在数据通信过程中使用或者支持IOCP模型吗?IOCP是一种针对大量并发客户请求改善性能的方式。
现在对于WCF来说也有处理大量并发客户端的问题。所以我想知道更多关于WCF和IOCP的细节,WCF在数据通信过程中使用或者支持IOCP模型吗?
是否有关于这个问题的什么官方的文档或者文章?
谢谢。
------------------------------------------------------------------------------------
答案
2009年7月8日 4:09Dominick BaierMVP
我不确定这个是否明确的文档化过,但是WCF使用IO线程和IOCP。
你可以通过调用线程池来查看IO线程的使用情况。从你操作里获取可用线程。也可以查看关于使用IO begin/end操作的
AsyncPattern = true 属性设置的文(例如:Stream.BeginRead)。
----------------------------------------------------------------------------------------
2009年7月10日 21:28rfreire
实际上,WCF使用了IOCP。确实没有关于此的文档,但是你可以通过
System.ServiceModel.Channels.IOThreadScheduler类来调度和队列话线程。
为了确认IOCP的使用。。。你应该使用反射器打开这个类。。。在一些驻留的类里,你会发现它使用
IOCompletionCallback委托来接受来自线程池上的IO操作输出。
--------------------------------------------------------------------------------------
2009年7月12日 8:08Frank Xu Lei
0Hi,Rodrigo.
我已经查看了System.ServiceModel.Channels.IOThreadScheduler的代码。发现它定义了一个私有的类CriticalHelper。
它有3个方法:
1.private static void CompletionCallback(object state);
2.public static void ScheduleCallback(WaitCallback callback, object state,
bool flow, bool lowPri);
3.IOCompletionCallback,
顺便说一下,我也发现了另外一个驻留的TYPE:private class
ScheduledOverlapped.new IOCompletionCallback(this.IOCallback)),它是WCF使用IOCP模型的来改善大规模并发客户端的证据。
正如以前的Windows API一样,他们也使用IOCP模型。
我这里有点疑惑:
public unsafe ScheduledOverlapped(WaitCallback callback)
{
this.nativeOverlapped = new Overlapped(0, 0, IntPtr.Zero,
null).UnsafePack(DiagnosticUtility.Utility.ThunkCallback(new
IOCompletionCallback(this.IOCallback)), null);
this.callback = callback;
}
大家都知道,IOCP相对重叠端口来说性能更高。那为什么驻留类里命名为“overlapped”?。它是否使用了IOCP?
这个一个关于IOCP不错文章: http://www.theukwebdesigncompany.com/articles/iocp-thread-pooling.php
------------------------------------------------------------------------------------
2009年7月13日 6:47Steven Cheng - MSFTMSFT, 版主
0Hi Frank,
是的,WCF在服务端内部使用了IOCP来处理并发请求。.NET 线程池内部实现了IOCP,更细节的东西没有公开。然而,你可以使用
reflector来查看WCF channel的相关类库。
此外,对于超过性能(吞储量或规模性)大量的并发客户端,你可以使用限流配置(例如会话,实例和并发模式)。
http://kennyw.com/indigo/150
http://blogs.msdn.com/rickrain/archive/2009/06/26/wcf-instancing-concurrency-and-throttling-part-3.aspx
------------------------------------------------------------------------------------------------
2009年7月13日 16:47Zhou Yong
作为一个开发者,底层的通道层的线程模型是一种实现细节,你不应该过多依赖它。
因为有一天Windows平台上的IOCP模型或许不会在如此的高效。
(例如Windows核心开发团队里的大牛,发明了一种新的算法来调服IO操作,或者他们重构了一种新的机制API来处理IO线程),
不论WCF使用哪种线程模型,也不管类型如何改变,一点可以确定的是,WCF能够提供连续的API去包装这些特性。
这就是使用高级别API的好处。
另外,知道WCF使用IO完成线程做异步IO操作并不能使你成为更出色的WCF开发者。
----------------------------------------------------------------------------------
Hi,
你好,非常感谢你的回复,我猜测WCF传输(WCF运行时)使用了完成端口。但是关于这个问题的资料太少。
下面本论坛的连接是关于这个问题的有帮助的主题:
1.http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/1f035ee4-0b7c-47d8-9595-f99d87dafac8/;
2.http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/1f035ee4-0b7c-47d8-9595-f99d87dafac8/
;
3.http://blogs.msdn.com/wenlong/archive/2008/04/21/wcf-request-throttling-and-server-scalability.aspx;
4.http://winterdom.com/2007/04/wcfchannellisteners in the 3rd one.作者说使用debugger可以找到更多细节:
System.ServiceModel.Diagnostics.Utility+IOCompletionThunk.UnhandledExceptionFrame(UInt32,
UInt32, System.Threading.NativeOverlapped*)+0x2f 01fbf744 79e7c74b
mscorlib_ni!System.Threading._IOCompletionCallback.PerformIOCompletionCallback
这个是证据吗?我不确定。
------------------------------------------------------------------------------------------------
2009年7月13日 10:42Steven Cheng - MSFTMSFT, 版主
0Hi Frank,
因为WCF IOscheduler封装了.NET现有的托管线程池的IO线程接口。下面的就是WCF使用的方法:
#ThreadPool..::.UnsafeQueueNativeOverlapped Method
http://msdn.microsoft.com/en-us/library/system.threading.threadpool.unsafequeuenativeoverlapped.aspx
所以.NET 托管线程池,在线程池类里已经实现了IOCP线程处理。Junfeng Zhang发布的一篇文章介绍了这个:
#ThreadPool.UnsafeQueueNativeOverlapped
http://blogs.msdn.com/junfeng/archive/2008/11/24/threadpool-unsafequeuenativeoverlapped.aspx
另外,你能解释一下为什么IOCP相对OverLapped 重叠IO更高效吗?
--------------------------------------------------------------------------------------------------
2009年7月13日 16:37Frank Xu Lei
0Hi,
我阅读了这本书:Windows网络编程,2版。它介绍了所有的Windows IO模型:blocking, select, WSAAsyncSelect,
WSAEventSelect, overlapped I/O, 和 completion port。我在第8章里找到一些对这个问题有用的描述:
1.重叠IO:重叠IO模型的设计允许你的应用程序使用重叠数据结构发送一个或者多个异步IO请求。
2.本质上说,IOCP模型需要你创建一个Windows 完成端口对象来管理重叠IO请求,它使用一定数量的线程来处理完成重叠IO请求。
3.完成端口是目前讨论的模型里提供了最好的可扩展性的模型之一。这个模型非常适合处理数百乃至数千的sockets.
根本上说,IOCP利用了Windows重叠IO机制(更多细节你可以在那个书里找到)。
现在我可以确定的是:WCF确实使用了IOCP模型来处理大量并发用户请求。System.ServiceModel.Channels.IOThreadScheduler类的
代码实现可以证明这一点。
----------------------------------------------------------------------------------------
2009年7月14日 5:23Frank Xu Lei
Hi, Yong,
我是一个开发者,知道.net framework 或 Window APIs封装了许多很棒的模型和算法。我们可以不需要任何考虑就直接调用。
确实非常的方便。但是对于个人学习来说,我应该弄清楚细节,尽管这是一个别人问我问题。我对这个问题也非常感兴趣,
所以愿意花费如此多的时间来求证它。
实际上,在我查找资料和与别人讨论的过程中,我也学习到很多东西。
也许这个问题也会帮助那些学习WCF的人。
仅仅是我个人的学习态度。。
谢谢。
---------------------------------------------------------------------------------
2009年7月15日 4:15Frank Xu Lei
0Hi,All
Thanks a lot ,anyone who replyed or payed attention to this question~
统计信息
发起日期: 2009/7/7上次回复: 2009/7/15认为此贴有帮助的投票: 0
回复次数: 16
查看次数: 179
1.原问题:
http://www.cnblogs.com/frank_xl/archive/2009/06/25/1509840.html#1585252
2.原帖子:
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/3f45500d-6de0-4c90-8a62-f08e1ede053e/
参考资料:
Windows 网络编程,2版