代码之家  ›  专栏  ›  技术社区  ›  theburningmonk

wcf是否使用threadpool为percall服务提供新实例?

  •  13
  • theburningmonk  · 技术社区  · 15 年前

    对于限制设置为高的PerCall WCF服务(例如,200个最大并发调用),WCF是否会打开一个新实例并在线程池线程上调用请求?

    如果是,那么这会对允许的并发调用总数产生影响吗?

    我这样问是因为我似乎从来没有达到我在服务限制配置中设置的最大并发调用数,而是该数的一小部分-在100 maxConcurrentCalls设置中最多50个,在200 maxConcurrentCalls设置中最多160个。

    谢谢,

    1 回复  |  直到 15 年前
        1
  •  16
  •   Dan Terry    15 年前

    看来,WCF使用来自clr threadpool的托管I/O线程来服务请求,附加的警告是使用自己的线程调度程序。

    Wenlong Dong's Blog - Why Are WCF Responses Slow and SetMinThreads Does Not Work?

    首先, WCF使用托管I/O线程处理请求 . clr threadpool可以防止销毁一定数量的空闲I/O线程。当需要更多的I/O线程时,它们是由线程池创建的,这有点昂贵。

    Wenlong Dong's Blog : WCF Request Throttling and Server Scalability

    在.NET 3.0和3.5中,您将看到一种特殊的行为,用于承载IIS的WCF服务。每当一个请求出现时,系统将使用两个线程来处理该请求:一个线程是clr threadpool线程,它是来自ASP.NET的工作线程。 另一个线程是由wcf iothreadscheduler管理的I/O线程(实际由threadpool.unsafequeuentativeoverlapped创建) .

    有过多的设置会影响到WCF吞吐量。因为wcf使用托管线程池,所以线程池的miniothreads和maxiothreads设置将影响结果。在所有空闲的I/O线程(如果使用这些线程,则为工作线程)从线程池中取出之后,线程池将延迟一段时间,然后再旋转一个新线程以服务排队的请求。通过增加miniothreads,可以防止这种延迟。如果您达到了maxiothread限制,这肯定会限制您将看到的并发请求的数量;但是,在50/100测试中似乎不是这样,因为您的下一个测试成功地运行了160个并发请求。如果我记得正确,我相信您使用的宿主环境(IIS、WAS、SELF)可以指定一些线程池设置。此外,如果您从第二个链接阅读博客文章,您将看到当WCF在其单独的I/O线程上处理请求时,如何阻止IIS工作线程。因此,在这种情况下,工作线程设置和IIS设置将对WCF并发性产生影响。你是如何主持这项服务的?

    您的标题提到一个Percall InstanceContextMode,它将使ConcurrencyMode不相关。但是,对于PerCall,您需要了解MaxConcurrentInstances设置以及MaxConcurrentCalls。根据您的绑定,您可能还需要关注maxConcurrentSessions属性。您使用什么绑定来承载此服务?

    不管以上这些,令人困惑的是,在50/100测试之后的160/200测试。

    推荐文章