当前位置: 首页 > 编程日记 > 正文

WCF优化的几个常规思路

前几天用WCF做项目时发现了一个效率问题,由于系统对效率要求较高,困扰了很长时间终于将问题解决了,写下来为以后的兄弟们参考,第一次写博客有不准确的地方还望同行们多喷多指点,先行谢过啦...

问题场景是这样的,我上传很多数据到服务器端,测试用的是100万条,由于服务器端需要对数据筛选并过滤,那么就将数据驻留在内存中,在处理完以后才写入到文件,需要的时候再从文件中读取出来,当然向文件写入和读取都是单独的线程来并发执行的...就是这样看似谁都不影响谁的完美策略竟然导致后续Server端接收WCF请求的延迟,并不是服务方法的内部有多复杂,而是请求就不能立即进入响应方法中...困扰了三天之后也查阅了很多网上资料终于找到了原因,原因是我数据存到Server端以后因为某些需要又用了一个线程把数据挪到另外一个内存缓存中,按理说只是多占些内存而已不应该影响接收请求的速度啊,其实想来想去除了多占了很多内存以外还多开了好几个线程,而且伴有大量的内存到文件的IO写入写出,就这样造成了线程开启的延迟,其实WCF的一次请求也是开启一个线程响应的,这是我这次总结出来的,如果有不准确的地方希望兄弟们给指正,再次感谢

顺便总结一下WCF效率优化设置的常规思路:


1、针对ServerHost端能接收的最大请求数量限制

在服务端设置ServiceHost,如:

1 host.Description.Behaviors.Add(new ServiceThrottlingBehavior() 
2 { 
3 MaxConcurrentInstances = 2000, 
4 MaxConcurrentCalls = 2000, 
5 MaxConcurrentSessions = 2000 
6 }); 

2、针对Server端服务对象的管理及并发方式

设置服务的InstanceContextMode 及ConcurrencyMode 特性,设置方法是在实现服务契约的类上面用如下特性:

1 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,
2 ConcurrencyMode = ConcurrencyMode.Multiple, 
3 UseSynchronizationContext=false)]
4 public class MyService : IInterface{...}

说明:

(1)InstanceContextMode.PerCall表示每接收一个新的请求WCF都会新建一个服务实例来响应,这样本质不同请求的响应就是并发执行的

(2)将ConcurrencyMode设置为ConcurrencyMode.Multiple也是为了保险起见,个人认为这个多线程访问只有在InstanceContextMode.Single的时候也就是服务端针对每个请求都是一个对象响应的时候才谈得上多线程并发访问,因为InstanceContextMode.PerCall每个请求都是不同实例响应的,人家本来就是并发的

(3)如果不需要WCF服务内部帮你协调同步,那么设置UseSynchronizationContext=false,以后有多线程共享数据自己拿Lock去控制,我就是这么干的,因为我Lock的东西跟WCF没啥关系

3、针对首次访问速度很慢,以后访问速度快的问题

如果是用的类似HttpBasicBinding,访问服务端时首次很慢,可以考虑将binding的useDefaultWebProxy设置为"false",如果是用的类似NetTcpBinding,是没有这个属性的,这个属性默认是true,意思是在wcf客户端向Server端请求的时候总是尝试先查找代理,找不到再去直接连接,如果您的服务端确定的话,干脆直接连接算了,不让客户端再去找代理,设置为false得了...

4、针对WCF串行处理造成的延迟

默认WCF的代理都是自动打开的,即使您将ConcurrencyMode设置为Multiple,WCF依旧会以串行的而不是并行的方式响应,因为选择自动打开代理时,多个请求同时来到服务端,服务端会对请求进行排序等待且执行反序列化等,等这些都执行完了才会并发执行,这就造成了有先有后执行,既然是这样我们就不要WCF自动打开代理,而是我们手动的显示打开,具体方法如:((ICommunicationObject)client).Open();

(大家可以看看这个博客,我是在这里学到的:http://www.cnblogs.com/tyb1222/archive/2012/05/23/2515535.html)

5、WCF接收请求本质上也是开启一个线程来响应client请求的,那么就涉及到windows线程池,一般线程池虽然可以通过ThreadPool.SetMinThreads方法设置最小的线程数量,但是系统内部其实对空闲线程过16s就清理一次的(即使你现在的活动线程没有达到最小的线程池数量),只留一个空闲线程接收请求,如果刚刚清理完线程池而且这个空闲线程又刚好正接受请求的时候又来了一个新的请求,这时候CLR就会重新new一个线程,这时就会消耗一些时间,而且消耗时间的长短是时随机的视系统情况而定(这个问题据说.net 4.0还有),为了防止这些情况发生就需要时刻提醒Windows多留出一个空闲的线程别被回收以备随时调用,我们首先想到的就是定时提醒,但是如果每提醒一下就新建一个线程那么以后线程会越来越多cpu就不用干别的了,在那里只切换线程就够它忙活一阵子了,好在系统有更好的机制叫完成端口(IOCP),这个东西大家可以去网上搜搜,说的都比我好多了,个人理解这种机制说白了就是有一个公共的消息队列和几个特定的线程,您cpu有几核就会有几个线程对应,它能保证空闲的cpu内核有空闲的线程,而且也不会没有数量限制的新建线程,说白了就是您往完成端口发东西就会激活一个线程...因此我们要做的是就是定时往完成端口队列中写点东西,让那个队列去通知完成端口开辟出线程来,而且线程的回调方法什么都不做,说白了就是为了打开一个空闲的线程留给新的请求调用,节约时间,具体的实现方法如下(注:第5条观点及代码引自http://blogs.msdn.com/b/wenlong/archive/2010/02/11/why-does-wcf-become-slow-after-being-idle-for-15-seconds.aspx,建议大家去看看,虽然是英文的,写的可比我好多了,哈):

 1 static ManualResetEvent s_dummyEvent;
 2 
 3 static RegisteredWaitHandle s_registeredWait;
 4 
 5 /// <summary>
 6 /// 函数功能:每隔0.5秒都向IO完成端口发送一个空的数据包,进而激活一个空闲的线程,
 7 /// 保证时刻有一个空闲的线程来响应,这样wcf就避免请求因为新建线程延时了
 8 /// 备 注:防止.net线程池每16秒回收只留一个线程的情况发生
 9 /// </summary>
10 public static void DoWorkaround()
11 {
12 // Create an event that is never set
13 
14 //创建一个永远都不启动的事件
15 s_dummyEvent = new ManualResetEvent(false);
16 
17 // Register a wait for the event, with a periodic timeout. This causes callbacks
18 // to be queued to an IOCP thread, keeping it alive
19 
20 //注册一个等待时间,每500ms注册一次,这样针对完成端口线程队列的回调会保证完成端口线程的活跃(英文不好,大家忍下吧)
21 s_registeredWait = ThreadPool.RegisterWaitForSingleObject(
22 s_dummyEvent,
23 (a, b) =>
24 {
25 // Do nothing
26 },
27 null,
28 500,
29 false);
30 }

写完上边的这个方法在代码中那里调用一下就行了...我修改了自己的程序结构以后那个请求延迟的问题没有了,思来想去我的问题应该是大量的IO线程导致的...

以上就是我总结出来的几点优化思路,希望能对其它兄弟有帮助,有不足的地方希望同行们多多指正

转载于:https://www.cnblogs.com/Taburensheng/p/5261374.html

相关文章:

使复选框选中_勾选复选框单元格变色,自动计数,在Excel中是如何实现的?

Excel中&#xff0c;我们经常会使用复选框来打勾打叉&#xff0c;这是复选框最基本的功能&#xff0c;相信很多小伙伴都会&#xff0c;但今天我跟大家分享的是复选框的其他操作技巧&#xff0c;勾选复选框变色&#xff0c;统计人数。下图中&#xff0c;我们要利用复选框是否打钩…

[短文速读] 重载有暗坑,JVM是如何执行方法的

前言 这将是一个系列文章。原因是自己写了很多文章&#xff0c;也看了很多文章。从最开始的仅仅充当学习笔记&#xff0c;到现在认认真真去写文章去分享。中间发现了很多事情&#xff0c;其中最大发现是&#xff1a;收藏不看&#xff01;总是想着先收藏以后有时间再看&#xff…

一笔画问题【数据结构-图论】

回家路上听到2个人在说&#xff1a;田字怎么一笔写成&#xff0c;并且笔划不重复。 田 我回家想了许久&#xff0c;觉得无论如何走正常的途径肯定是不行的&#xff0c;投机取巧脑筋急转弯的我不讨论。 那么是否可以找到数学定理&#xff1f; 其实就是欧拉七桥问题&#xff1a;1…

解析并符号 读取dll_Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

一. 前言Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展&#xff0c;也就是一个基础容器和一个高级容器的区别。本篇就以BeanFactory基础容器接口的默认实现类XmlBeanFactory启动流程分析来入门Spring源码的学习。二. 概念要点1. 概念定义Be…

安装多个gcc

删除gcc #yum remove gcc 安装最新的 #yum install gcc 查找gcc源 可先通过“yum list compat-gcc*”查看版本&#xff0c;然后再利用“yum install compat-gccXXX”安装 #yum list compat-gcc* #sudo yum install compat-gcc-34.i686 查看gcc版本 #gcc -v #gcc34 -v参考&…

JAVA - HashMap和HashTable

1. HashMap 1) hashmap的数据结构 Hashmap本质就是一个数组&#xff0c;只是当key值重复时&#xff0c;使用链表的方式来存储重复的key值&#xff08;拉链法&#xff09;&#xff0c;注意&#xff1a;链表中存放的仍然是key值。如下图示&#xff1a; 当我们往hashmap中put元素…

empress和queen区别_queen与empress

(1)「queen」和「empress」不仅可以用来指称「king」和「emperor」的妻子&#xff0c;也能指代握有正式权力的女性君主。(2) 英国的君主(queen或king)之所以曾经有过empress或emperor的头衔&#xff0c;是因为英国曾统治过印度次大陆, 他们曾是印度的empress或emperor。如今&am…

在UIWindow上加类似于“回到顶部”的按钮

在公司上个版本的开发中遇到了一个UI布局的小问题&#xff1a; 某个页面需要增加一个分享按钮&#xff0c;但是该页面是二级页面&#xff0c;导航栏右边也已经放置了2个button。 起初和老大谈论这个问题的时候想到的方法是导航栏右边加三个button得了~但是一回想&#xff0c;这…

修改mysql 默认字符集 , 默认引擎

cd /var/lib/mysql/gamell vim db.optdefault-character-setutf8default-collationutf8_general_ciwq service mysqld restart或者service mysqld reload默认字符集修改完毕vim /etc/my.cnf[mysqld]datadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sockusermysqldefault-stor…

bzoj2724: [Violet 6]蒲公英(分块)

传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块&#xff0c;觉得这种基于暴力的数据结构一点美感都没有。然而今天做了这道分块的题才发现分块的暴力之美&#xff08;如果我空间没有开小就更美了&#xff09; 我们先将整个…

Linux0.01内核根目录Makefile注释

# # Makefile for linux. # If you dont have -mstring-insns in your gcc (and nobody but me has :-) # remove them from the CFLAGS defines. ## #8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码 # AS86 as -0 -a CC86 cc -0 LD86 ld -0# #G…

快速滚动_方老师教滚动快速作文

五年级第一单元作文集阴沉天空中有一小束照着你的阳光。亲爱的孩子&#xff0c;让时间在知识的枝条上、智慧的绿叶上、成熟的果实上留下它勤奋的印痕&#xff01;罗婉汀作文集自律且努力&#xff0c;别让生活太安逸。亲爱的孩子&#xff0c;耕耘者最信得过自己的汗水&#xff0…

liunx复制备份命令,copy命令,liunx命令

2019独角兽企业重金招聘Python工程师标准>>> 拷贝到的文件夹 /usr/local/文件夹/需要拷贝的路径文件夹 /usr/local/tomcat/webapps/文件夹/复制命令cp -r /usr/local/文件夹/ /usr/local/tomcat/webapps/文件夹/ 转载于:https://my.oschina.net/u/2336787/blog/635…

20.Valid Parentheses (python)

这道题主要用栈来实现的。什么是栈呢&#xff0c;参照书上的后缀表达式的例子谈谈自己的理解&#xff0c;栈最明显的特征是先进后出。所以可以有效的结合题目中 &#xff08;&#xff09;对匹配问题&#xff0c;可以把从列表中获取的符号先存到栈中。 首先建个空列表用于映射栈…

The HipHop Virtual Machine

目前Facebook已将该HipHop虚拟机开源&#xff0c;源代码发布在GitHub上。关于该工具的技术原理在Facebook的开发者页面上有一篇详细的文章介绍&#xff0c;查看这里。如果看不到的可以看下面的转载&#xff1a;Were always looking for ways to make our computing infrastruct…

node建立博客系统遇到的问题,1,乱码。2,multer的使用错误。3使用session问题...

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff0c;乱码 文件存储为utf-8格式后还是报错。 原来这个设置只对新建文件编码有效&#xff0c;旧文件不处理的&#xff0c;我还以为旧文件也给转换了。 2&#xff0c;上传文件的multer模块使用错误。 throw new Ty…

python时间函数入门_calendar在python3时间中有哪些常用函数?怎么用?

想要在python中写代码游刃有余&#xff0c;没有函数的支持是万万不行的。很多小伙伴反映&#xff0c;最近函数的应用知识不够了&#xff0c;所以小编挑选了python3时间中的函数&#xff0c;希望可以帮助大家在处理日历方面更加的迅速。其他更多的函数&#xff0c;大家也可以自行…

9.spark core之共享变量

简介 spark执行操作时&#xff0c;可以使用驱动器程序Driver中定义的变量&#xff0c;但有时这种默认的使用方式却并不理想。 集群中运行的每个任务都会连接驱动器获取变量。如果获取的变量比较大&#xff0c;执行效率会非常低下。每个任务都会得到这些变量的一份新的副本&…

【CSDN2012年度博客之星】需要您的一票,感谢大家的支持

从2004年9月&#xff0c;本人一直将自己工作和学习经验写成博文分享给大家&#xff0c;本人有幸被选为&#xff12;&#xff10;&#xff11;&#xff12;年&#xff18;&#xff18;位候选博客之星&#xff0c;如果各位IT‘er喜欢我的博文&#xff0c;请投我一票&#xff0c;做…

双绞线和同轴电缆

线缆作为连接器件&#xff0c;相当于不同系统之间沟通的“桥梁”&#xff0c;选择线缆类型的好坏&#xff0c;也决定着传输信号的质量&#xff0c;影响着整个系统的稳定性。 &#xff08;1&#xff09;特性阻抗 先说一下关于线缆在传输过程中的特性阻抗问题。 特性阻抗是指电缆…

keras训练完以后怎么预测_使用Keras建立Wide Deep神经网络,通过描述预测葡萄酒价格...

你能通过“优雅的单宁香”、“成熟的黑醋栗香气”或“浓郁的酒香”这样的描述&#xff0c;预测葡萄酒的价格吗&#xff1f;事实证明&#xff0c;机器学习模型可以。在这篇文章中&#xff0c;我将解释我是如何利用Keras(tf.keras)建立一个Wide & Deep神经网络&#xff0c;并…

如何发布自己的NPM包(模块)?

1.注册NPM 账号 注册地址&#xff1a;https://www.npmjs.com/。 2.初始化自己要发布的项目 搭建本地环境&#xff1a;安装node.js&#xff0c;包含了npm命令。新建目录&#xff0c;在该目录下&#xff0c;初始化项目&#xff1a;npm init。按照提示填写初始化信息&#xff0c;我…

PHP对于浮点型的数据需要用不同的方法去解决

Php: BCMathbc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale]&#xff0c;比如string bcadd(string $left_operand, string $right_operand[, int $scale])&#xff0c;如果scale没有提供&#xff0c;就用bcscale的缺省值。这里大数直接用一个…

mysql提示符详解_MySQL字符集使用详解

查看字符集相关变量mysql> show variables like character%;————————–——————————-| Variable_name | Value |————————–——————————-| character_set_client | latin1 || character_set_connection | latin1 || character_set_database…

Apache漏洞修复

今天受同事的委托&#xff0c;修复一台服务器的Apache漏洞&#xff0c;主要集中在以下几点&#xff1a; 1.Apache httpd remote denial of service&#xff08;中危&#xff09; 修复建议&#xff1a;将Apache HTTP Sever升级到2.2.20或更高版本。 解决方法&#xff1a;升级HTT…

Java遍历Map对象的四种方式

关于java中遍历map具体哪四种方式&#xff0c;请看下文详解吧。 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 1 2 3 4 Map<Integer, Integer> map new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Intege…

Tokyo Cabinet 安装

tokyocabinet :一个key-value的DBM数据库&#xff0c;但是没有提供网络接口&#xff0c;以下称TC。 tokyotyrant :是为TC写的网络接口&#xff0c;他支持memcache协议&#xff0c;也可以通过HTTP操作&#xff0c;以下称TT。 Tokyo Cabinet 是一款 DBM 数据库&#xff0c;Tokyo …

Packagist / Composer 中国全量镜像

Packagist 镜像 请各位使用本镜像的同学注意&#xff1a; 本镜像已经依照 composer 官方的数据源安全策略完全升级并支持 https 协议&#xff01;请各位同学 按照下面所示的两个方法将 http://packagist.phpcomposer.com 修改为 https://packagist.phpcomposer.com 还没安装 co…

centos yum mysql-devel 5.5_CentOS 6.5下yum安装 MySQL-5.5全过程图文教程

在linux安装mysql是一个困难的事情&#xff0c;yum安装一般是安装的mysql5.1&#xff0c;现在经过自己不懈努力终于能用yum安装mysql5.5了。下面通过两种方法给大家介绍CentOS 6.5下yum安装 MySQL-5.5全过程&#xff0c;一起学习吧。方法一&#xff1a;具体方法和步骤如下所示&…

py 的 第 31 天

1.osi 7层模型 5层&#xff1a; 应用层 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 4层&#xff1a; 应用层 应用层 表示层 会话层 传输层 网络层 物理层 数据链路层 物理层 注意&#xff1a;7层背会。 2.tcp的三次握手&…