[WCF编程]9.性能与限流
一、性能概述
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编程]9.性能与限流的更多相关文章
- WCF之并发,吞吐量和限流
并发 Single重入模式.对于每一个服务实例,同一时刻只能处理一个请求,其他对该实例的请求被排队. PerCall,每一线程会分配一个新的服务实例上.不会有并发性问题.不影响吞吐量. PerSess ...
- SpringCloud zuul 网关限流分析
最近项目中 spring cloud zuul 运用到限流功能,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结果 yml.pom配置 强烈推荐,按最新gith ...
- WCF Throttling 限流的三道闸口
WCF Throttling 限流的三道闸口 一.WCF Throttling 流量限制简介 我们期望WCF服务端能够处理尽可能多的并发请求,但是资源是有限的,服务不可能同时处理无限多的并发请求,如 ...
- WCF 项目应用连载[8] - 绑定、服务、行为 大数据传输与限流 - 下 (ServiceThrottlingAttribute)
因为ORM的原因,对Attribute编程有一种情节..所以这节的出现,完全是因为在WCF对自定义Attribute的一种应用. WCF 项目应用连载[7] - 绑定.服务.行为 大数据传输与限流 - ...
- WCF学习笔记之并发与限流
最近一直在学习WCF相关知识:本文章将针对并发与限流知识进行一个梳理,由于很多理论的知识所以做一个简单的记录,为今后回顾做一个记录: 一:并发知识 WCF将服务实例封装在一个称为实例上下文的对象中,并 ...
- wcf利用IDispatchMessageInspector实现接口监控日志记录和并发限流
一般对于提供出来的接口,虽然知道在哪些业务场景下才会被调用,但是不知道什么时候被调用.调用的频率.接口性能,当出现问题的时候也不容易重现请求:为了追踪这些内容就需要把每次接口的调用信息给完整的记录下来 ...
- 《 .NET并发编程实战》一书中的节流为什么不翻译成限流
有读者问,为什么< .NET并发编程实战>一书中的节流为什么不翻译成限流? 这个问题问得十分好!毕竟“限流”这个词名气很大,耳熟能详,知名度比“节流”大多了. 首先,节流的原词Thrott ...
- 快速入门系列--WCF--06并发限流、可靠会话和队列服务
这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的 ...
- [WCF编程]6.绑定行为
一.绑定行为概述 为了支持服务端的其它本地特性,WCF定义了行为的概念.行为就是服务的本地特性,不会影响服务的通信模式.客户端并不知道服务端行为,所以行为不会出现在服务的绑定和发布的元数据中.说下WC ...
随机推荐
- 浅谈Android应用保护(零):出发点和背景
近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点.各种新的思路和玩法层出不穷.所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章. 这5篇文 ...
- avascript中的this与函数讲解
徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...
- Atitit wsdl的原理attilax总结
Atitit wsdl的原理attilax总结 1.1. 在 W3C 的 WSDL 发展史1 1.2. 获取wsdl,可能需要url后面加wsdl,也可能直接url1 1.3. Wsdl的作用2 1. ...
- salesforce 零基础学习(四十九)自定义列表分页之使用Pagination实现分页效果 ※※※
上篇内容为Pagination基类的封装,此篇接上篇内容描述如何调用Pagination基类. 首先先创建一个sObject,起名Company info,此object字段信息如下: 为了国际化考虑 ...
- mock.js
mock.js http://mockjs.com/ https://github.com/nuysoft/Mock/wiki 为了完成angularjs的karma测试,看到这个好东东,这货能拦截a ...
- ora-01652无法通过128(在表空间temp中)扩展temp段
今天提交请求后,提示ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段.最后通过ALTER DATABASE TEMPFILE '/*/*/db/apps_st/d ...
- OpenCASCADE Conic to BSpline Curves-Hyperbola
OpenCASCADE Conic to BSpline Curves-Hyperbola eryar@163.com Abstract. Rational Bezier Curve can repr ...
- C#中的readonly与const的比较
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景.工作原理 readonly为运行时常量,程序运行时进行赋 ...
- MySql事务概述
事务是访问并更新数据库中各种数据项的一个程序执行单元.在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一. 严格上来说,事务必须同时满足4个特性, ...
- bootstrap 学习
<!DOCTYPE html> <html> <head> <title>Bootstrap</title> <meta name=& ...