一、性能概述

WCF服务的性能取决于很多因素。出了CPU、RAM和网络性能等常见的因素外,实例上下文模式、并发模式、数据契约的设计或使用的绑定等与WCF有关的因素都起着重要的作用。

实例上下文模式用来控制服务对象的实例化行为有PerCall、PerSession和Singleton三种模式可供选择。

绑定决定了传输协议和编码格式。此外,通过绑定可以使用很多的WS*协议。

并发模式决定了是否允许多个线程同时访问同一个对象。并发模式是有[ServiceBehavior]特性来控制的,它的默认值为ConcurrencyMode.Single,其它选项还有ConcurrencyMode.Multiple和ConcurrencyMode.Reentrant。ConcurrencyMode.Single表示服务对象一次只允许一个线程访问,因此,此模式不会产生任何同步问题,因为其它请求会被自动插入到队列中,只有当线程释放了此对象之后,其它请求才可以访问它。ConcurrencyMode.Multiple模式允许任意多个线程同时访问一个对象。如有必要,必须通过手工方法用Monitor和Mutex等传统的.NET工具来控制线程的同步。

然而,原则上只有当使用一个多线程客户端(他访问一个PerSession对象),或者使用Single模式时,ConcurrencyMode才会起作用。当使用PerCall模式时,不管任何时候调用一个方法,都会创建一个新对象,这就从一开始就避免了多线程问题。

下面演示了[ServiceBehavior]特性的用法:

 [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,ConcurrencyMode=ConcurrencyMode.Single)]
public class Service6:IService6
{

二、限流

限流并非直接的实例管理技巧,它允许开发者限制客户端连接数以及服务的负荷。

限流让你可以避免服务过量分配和使用资源。当启用限流配置时,如果超过了限流就会自动把调用者放入等待队列中,让后一次处理这些请求。如果客户端在等待期间超时,就会获得TimeoutException异常。

每个服务类型都可以应用限流技术,也就是说,它会影响到服务的所有实例以及所有终结点。实现方式是为限流与服务使用的每个通道分发器建立关联。

WCF允许开发者控制下列服务参数:

  • 并发会话最大数(maxConcurrentSessions)

它指的是包含在服务传输层的一个会话所有独立的客户端数。简单的说,该数值表示使用TCP、IPC和任何一种WS绑定(具有可靠性、安全性)的独立客户端的最大数目。默认值为处理器计数(或内核)的100倍。

  • 并发调用最大数(maxConcurrentCall)

它指的限制所有服务实例当前正在执行的调用总数。通常来说,该值应该保持为会话最大值的1%或3%.默认值为处理器计数(或内核)的16倍。

  • 并发实例最大数(maxConcurrentInstances)

它指的控制并发上下文实例的数量。除非你显示设置了这个值,否则它会默认等于最大并发调用的数目和最大并发会话数目(单个处理器116个实例)之和。使用会话服务模式,最大的实例数量是并发获得实例和并发会话的总数量。当启用实例停止时,实例的数量有可能远少于上下文数,而且会在上下文数量到达并发实例最大数时阻塞客户端。使用单调服务模式,实例数目实际上与并发调用的数目一致。因此,单调服务模式实例的最大数目小于配置的最大并发数和并发调用数目。对于单例服务模式,这个值会忽略掉,因为它只有一个服务实例。

限流体现的是托管和部署的特征。设计一个服务时,可以不需要配置限流,认为服务能够承受客户端的负荷。这就是为什么限流行为特性易于实现,WCF却没有提供的原因。

配置限流

利用配置文件中Servicebehavior节点的<serviceThrottling>元素可以控制也可以使用编程方式进行控制。

以配置文件方式配置限流

<serviceBehaviors>
</behavior>
<behavior name="throttlingBehavior">
<!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
<serviceDebug includeExceptionDetailInFaults="false"/>
<!--客户端验证方式-->
<serviceThrottling maxConcurrentSessions="400" maxConcurrentCalls="64" maxConcurrentInstances="464"/>
</behavior>
</serviceBehaviors>

以编程方式配置限流

ServiceHost host = new ServiceHost(typeof (Service.Service6));
ServiceThrottlingBehavior throttle;
throttle = host.Description.Behaviors.Find<ServiceThrottlingBehavior>();
if (throttle==null)
{
throttle = new ServiceThrottlingBehavior();
throttle.MaxConcurrentCalls = 64;
throttle.MaxConcurrentSessions = 400;
throttle.MaxConcurrentInstances = 464;
host.Description.Behaviors.Add(throttle);
}
host.Open();

读取限流

可使用以下代码来读取限流的值:

ServiceHost host = new ServiceHost(typeof (Service.Service6));
host.Open();
ChannelDispatcher dispatcher = host.ChannelDispatchers[0] as ChannelDispatcher;
Console.WriteLine("Max concurrten calls {0}",dispatcher.ServiceThrottle.MaxConcurrentCalls);
Console.WriteLine("Max concurrten instance {0}", dispatcher.ServiceThrottle.MaxConcurrentInstances);
Console.WriteLine("Max concurrten sessions {0}", dispatcher.ServiceThrottle.MaxConcurrentSessions); Console.Read();

在调试阶段,最重要的是定义一个基线。修改完配置文件之后哦,把新结果与这个基线进行比较,看看这些变化是否有正面影响,在服务器上整体负荷是否有下降。WCF提供了许多性能计数器一监视系统的性能或建立一个基线。在读取性能计数器之前,必须用配置方法或编程方法启动性能计数器。

如以下用配置文件方式配置性能计数器:

<system.serviceModel>
...
<diagnostics performanceCounters="All"/>
...
</system.serviceModel>

在启动性能计数器和服务宿主后,可以用Windows性能监视器来监视系统的当前性能;WCF也提供有一个监视器,用于监视服务的整体性能——终结点和操作的性能。

三、参考资料

《WCF服务编程》

《WCF4高级编程》

WCF Throttling 限流的三道闸口

[WCF编程]9.性能与限流的更多相关文章

  1. WCF之并发,吞吐量和限流

    并发 Single重入模式.对于每一个服务实例,同一时刻只能处理一个请求,其他对该实例的请求被排队. PerCall,每一线程会分配一个新的服务实例上.不会有并发性问题.不影响吞吐量. PerSess ...

  2. SpringCloud zuul 网关限流分析

    最近项目中 spring cloud zuul 运用到限流功能,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结果 yml.pom配置 强烈推荐,按最新gith ...

  3. WCF Throttling 限流的三道闸口

    WCF Throttling 限流的三道闸口 一.WCF Throttling  流量限制简介 我们期望WCF服务端能够处理尽可能多的并发请求,但是资源是有限的,服务不可能同时处理无限多的并发请求,如 ...

  4. WCF 项目应用连载[8] - 绑定、服务、行为 大数据传输与限流 - 下 (ServiceThrottlingAttribute)

    因为ORM的原因,对Attribute编程有一种情节..所以这节的出现,完全是因为在WCF对自定义Attribute的一种应用. WCF 项目应用连载[7] - 绑定.服务.行为 大数据传输与限流 - ...

  5. WCF学习笔记之并发与限流

    最近一直在学习WCF相关知识:本文章将针对并发与限流知识进行一个梳理,由于很多理论的知识所以做一个简单的记录,为今后回顾做一个记录: 一:并发知识 WCF将服务实例封装在一个称为实例上下文的对象中,并 ...

  6. wcf利用IDispatchMessageInspector实现接口监控日志记录和并发限流

    一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用.调用的频率.接口性能,当出现问题的时候也不容易重现请求:为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来 ...

  7. 《 .NET并发编程实战》一书中的节流为什么不翻译成限流

    有读者问,为什么< .NET并发编程实战>一书中的节流为什么不翻译成限流? 这个问题问得十分好!毕竟“限流”这个词名气很大,耳熟能详,知名度比“节流”大多了. 首先,节流的原词Thrott ...

  8. 快速入门系列--WCF--06并发限流、可靠会话和队列服务

    这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的 ...

  9. [WCF编程]6.绑定行为

    一.绑定行为概述 为了支持服务端的其它本地特性,WCF定义了行为的概念.行为就是服务的本地特性,不会影响服务的通信模式.客户端并不知道服务端行为,所以行为不会出现在服务的绑定和发布的元数据中.说下WC ...

随机推荐

  1. 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  2. Linux sudo

    200 ? "200px" : this.width)!important;} --> 介绍 本篇文章主要介绍sudo配置和用法,为了给某个用户控制权限比如执行某个命令或者关 ...

  3. .Net组件程序设计之远程调用(二)

    .Net组件程序设计之远程调用(二) 激活模式 引用封送对象激活类型两种, 一种是客户端激活类型,一种是服务器端激活. 客户端激活对象 客户端激活方式:当客户端创建一个远程对象时,客户端得到的是一个新 ...

  4. 《App研发录》 源码

    第1章源码: 1.1 重新规划Android项目结构 1.1.zip 1.2 为Activity定义新的生命周期 1.2.zip 1.3 统一事件编程模型 1.3.zip 1.4 实体化编程 1.4. ...

  5. hibernate用注解替代映射文件

    1.首先把原来的映射文件删掉,给实体类添加注解: @Entity //声明当前类为hibernate映射到数据库中的实体类 @Table(name="news") //声明tabl ...

  6. HTML5系列:HTML5与HTML4的区别

    1. 语法的改变 1.1 DOCTYPE声明 DOCTYPE声明在HTML文件中必不可少,位于文件第一行. HTML4中声明方法: <!DOCTYPE html PUBLIC "-// ...

  7. jQuery插件:jqGrid使用(一)

    1. Loading Data Load from JavaScript Array BundleConfig.cs using System.Web; using System.Web.Optimi ...

  8. WebService 学习之路(一):了解并使用webService

    webService主要用于向其他系统提供接口以便调用,系统间可能开发语言等完全不同,根据约定的接口规范,调用者传递相关参数进行接口调用,服务方根据传入的条件进行业务处理并进行结果返回. webSer ...

  9. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型

    有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...

  10. CentOS 7中如何安装mysql server

    以前一直用RHEL 6.3和6.4,系统盘里自带了mysql server,配置好yum源后,直接yum install mysql-server就可安装mysql服务器端了,最近用CentOS 7. ...