一、性能概述

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. Python黑帽编程2.4 流程控制

    Python黑帽编程2.4  流程控制 本节要介绍的是Python编程中和流程控制有关的关键字和相关内容. 2.4.1 if …..else 先上一段代码: #!/usr/bin/python # - ...

  2. Python黑帽编程 3.1 ARP欺骗

    Python灰帽编程 3.1 ARP欺骗 ARP欺骗是一种在局域网中常用的攻击手段,目的是让局域网中指定的(或全部)的目标机器的数据包都通过攻击者主机进行转发,是实现中间人攻击的常用手段,从而实现数据 ...

  3. LVS原理与使用(1)

    负载均衡,无论是否真正了解过,但我相信所有跟编程打交道的读者都有听说.同时,它(负载均衡)也是被认为一个大型网站的标识性技术之一(但负载均衡的作用肯定不止这点用途).虽然网上也有不少关于LVS配置实用 ...

  4. [ASP.NET MVC 大牛之路]03 - C#高级知识点概要(2) - 线程和并发

    本人博客已转移至:http://www.exblr.com/liam  我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验给大家一些指引,带着大家一起 ...

  5. iOS------苹果设备处理器指令集(iPhone初代到iPhone5s)

    (via 雅香小筑) Arm处理器,因为其低功耗和小尺寸而闻名,几乎所有的手机处理器都基于arm,其在嵌入式系统中的应用非常广泛,它的性能在同等功耗产品中也很出色. Armv6.armv7.armv7 ...

  6. js实现匀速运动及透明度动画

    1.html代码 <body> <div id="container"> <span id="btn"></span& ...

  7. 【原创】开源Math.NET基础数学类库使用(01)综合介绍

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  8. L2 Population 原理 - 每天5分钟玩转 OpenStack(113)

    前面我们学习了 VXLAN,今天讨论跟 VXLAN 紧密相关的 L2 Population. L2 Population 是用来提高 VXLAN 网络 Scalability 的. 通常我们说某个系统 ...

  9. How to write perfect C code

    Several days ago, I was involved in an argument about choice of C or C++. What I ignored was "l ...

  10. Android动画学习(一)——Android动画系统框架简介

    2015-11-09补充:Drawable Animation极有可能是Frame Animation 这几天在找工作,面试的时候被问到了Android动画,之前完全没接触过这部分,直接给懵了,当然其 ...