关于wcf 的连接超时问题

今天网上的系统突然报错,经过排查是调用wcf报错了,报错信息如下:

System.TimeoutException: The request channel timed out while waiting for a reply after 00:00:00. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The request operation did not complete within the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout.
   at System.ServiceModel.Channels.ReliableRequestSessionChannel.SyncRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   --- End of inner exception stack trace ---

网上找了半天资料,这篇帖子是很有价值的

I also had this timeout problem.  The client requests to my WCF service would work 3 to 6 times, then it would fail with a timeout.  I was passing tiny messages back and forth, so I knew "I cannot accomplish such big error with such tiny messages" ;-)

The problem was I was forgetting to call .Close() on the WCF client object!  Once I added the appropriate ".Close()", the error disappeared.

So once you‘re done calling the WCF service, make sure to call Close(), probably in your Finally block.

经过排查确实是相关的部门调了这个服务,没有加.Close().导致的.

在这个部门没有修改代码之前,服务器的配置如果需要修改,可以增加service的配置连接数

<serviceBehaviors>

<behavior name="ServiceBehavior">

<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->

<serviceMetadata httpGetEnabled="true"/>

<dataContractSerializer maxItemsInObjectGraph="10000000"/>

<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->

<serviceDebug includeExceptionDetailInFaults="true"/>

<serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100" maxConcurrentInstances="100" />

</behavior>

</serviceBehaviors>

如果wcf是宿主在iis上的,可以增加iis的全局配置

http://www.cnblogs.com/z2002m/archive/2012/10/26/1918342.html

这篇很有价值了

IIS的MaxConnection的验证

最近公司有位仁兄写了一个监控IIS的软件,里面提到一个连接数, 此连接数主要是收集WMI信息,

把代码写一下:

// 取到IIS的各个站点

System.Management.ManagementClass mc = new System.Management.ManagementClass("Win32_PerfFormattedData_W3SVC_WebService");

// 每个站点

foreach (System.Management.ManagementObject obj in mc.GetInstances())

{

// 这里就是每个站点当前的连接数

Convert.ToInt64(obj.Properties["CurrentConnections"].Value);    //

}

乍一看, 此 CurrentConnections是做什么用的呢? 由于我一直想了解一个IIS站点默认在同一时刻究竟能接受多少连接请求,  上网查了查,查到了maxconnection。 

首先看看微软是怎么解释的:

The maxconnection parameter determines how many connections can be made to a specific IP address.

这个 maxconnection参数用来确定: 对于每个IP能容纳多少个连接数(翻译的并不一定准)。

<connectionManagement>

<add address="*" maxconnection="2"> // 这里就说明是2个

</connectionManagement>

这个 maxconnection会不会是并发连接数呢?

我们来看看 http://www.microsofttranslator.com/BV.aspx?ref=CSSKB&from=en&to=zh-chs&a=http://support.microsoft.com/kb/821268/en-us?fr=1

里面有一段写的很明白,

  • maxWorkerThreads 参数和 maxIoThreads 参数的值设置为 100
  • maxconnection 参数的值设置 12 * N (其中,N 是您的 cpu 的数量)。
  • 设置要 minFreeThreads 参数的值 88 * N 和 minLocalRequestFreeThreads 参数,76 * N
  • minWorkerThreads 的值设置为 50。请记住 minWorkerThreads 不是默认的配置文件中。您必须添加它。

这些建议的一些涉及一个简单的公式,涉及在服务器上的 cpu 数量。N 表示公式中的 cpu 数量的变量。这些的设置如果您有超线程启用,您必须使用逻辑 cpu 数而不是物理 cpu 数。例如如果启用超线程与四个处理器的服务器然后 N 公式中的值将是 8,而不是 4

请注意在使用此配置时您可以执行的每个 CPU 12 ASP.NET 请求最多在同一时间因为 100-88 = 12。因此,至少 88 * N 工作线程和 88 * N 完成端口线程都可用的其它用途 (例如 Web 服务回调)。

基本上就明白了。  maxconnection = 12*CPU数量。   我们公司的服务器是使用双核的, 也就是说,在默认的情况下,

我们公司服务器上的IIS站点的默认最大连接数是24,

接下来验证一下, 测试的目的是为了证明: 当超过24个访问连接候,IIS的站点还能不能接受其他的连接,

实现准备:

1 写一个WEBService,里面包括A和B方法,其中A方法里面就一句Thread.Sleep(十分钟), 而B方法则直接Return "OK";

2  VS2008负载测试(模拟24个用户同时访问一台服务器上的webServiceA方法,因为A方法是会让线程休眠十分钟)

3  同时在服务器上收集WMI信息来观测WEBService当前的连接数, 使用: obj.Properties["CurrentConnections"].Value (具体收集方法看本文开头)

   这是负载测试,

  这是负载测试调用的测试方法。

OK, 准备就绪, 开吃。。哦,不对, 开始测试,这里我就不贴出来当时测试的图,  我把我测试的结果告之一下,

当负载测试开始,  Webservicer  的 obj.Properties["CurrentConnections"].Value 值,一直在增加, 当增加到24时,也就是我们模拟的24个用户,

我们在本机再模拟编写一段访问WebServiceB方法的代码,注意B方法是不会使线程休眠的,直接Return "ok" . 结果一直等到超时,也没有OK显示,

但此时 obj.Properties["CurrentConnections"].Value的值为25,

如果我们把负载并发数的设为23呢,再启动负载测试, 当连接数达到23时, 再调用B方法,结果发现,大约在三秒钟,调用B方法成功了,显示“OK”,

顺便提一句:在ASP.NET 2.0中,引入了autoConfig属性:

1 <processModel autoConfig="true"/>

当值为true时,autoConfig在运行时修改配置如下:

  • 设置maxWorkerThreaders和maxIoThreads为100
  • 设置maxconnection 为12*CPU数量
  • 设置minFreeThreads为88*CPU数量
  • 设置minWorkerThreads为50


如果大家说, 我有一台猛机, 配置牛B, 这些默认的设置不够,我需要自已动用配置, OK, 可以直接在machine.config里修改,

下面是示例代码,

<system.net>
   <connectionManagement>
      <add address = "*" maxconnection = "24" />
    </connectionManagement>
 </system.net>
  <system.web>
    <httpRuntime minFreeThreads="176"  minLocalRequestFreeThreads="152"/>
    <processModel autoConfig="false" maxWorkerThreads="100" maxIoThreads="100"/>

有些人会问: 这个东东一定要在 machine.config里修改吗? 能不能在web.config里面呢,目前我在Webserive程序里面的Web.config

修改了   <add address = "*" maxconnection = "30" />, 但使用负载测试时,发现还是不行,只能达到24, 这就说明30并未起作用。

有知道的说明一下,为什么不行? 按照微软的说明,应该在web.config里面是可以起作用的,

需要注意的是: 如果增加了maxconnection 数量, maxWorkerThreads的数量也需要增加相当的数量, 比如在双核的CPU上, 修改maxconnection = 25,

则 maxWorkerThreads也需要修改为101, 因为 maxconnection = maxWorkerThreads --minFreeThreads



还有一个疑问: 如果IIS崩溃了, 这里正好有一个HTTP请求过来,那么IIS会怎么处理?  答案中最好有微软的官方说明。



结论: IIS的站点默认的并发连接数是12*CPU,也就是说默认设置下IIS在同一时刻能处理的最大请求数是12*CPU数量 。

欢迎猛烈拍砖,有什么好建议你老就使劲的提吧。谢谢你了。

时间: 2024-11-09 02:05:44

关于wcf 的连接超时问题的相关文章

引用:WCF链接服务超时解决办法

WCF客户端在实际应用中,有许多应用技巧需要我们不断的去积累经验来掌握.这样才能避免或者更好的解决一些应用中出现的问题.在这里我们将会为大家介绍一下WCF链接服务超时的相关处理方法. 调用服务器端时,当点击十次后,客户端就会出现死机,然后是一份钟超时. System.TimeoutException: 对“http://localhost:3768/”的 HTTP 请求已超过为 00:01:00 分配的超时.为此操作分配的时间可能是较长超时的一部分. 查找原因后发现客户端在使用完通道后,没有进行

mongo 自动创建索引导致应用连接超时

2016年10月16日一个周末的时光遇到了一个很是让人恼火的问题!tomcat总是抛出连接超时问题错误,让人甚是恼火啊!!! 报错信息如下: [2016-10-15 18:30:58] 113578459   INFO - ----- PermissionsInterceptor ----- - 登录人pin--------WUJIE 十月 15, 2016 6:30:58 下午 com.mongodb.DBApiLayer$Result killCursor 警告: can't clean 1

FileZilla MLSD错误:连接超时、读取目录列表失败

昨天更换完主机后,用FileZilla ftp客户端连接ftp服务器,出现以下错误: 命令: MLSD错误: 连接超时错误: 读取目录列表失败 于是网上百度了一下,找到两种解决方法. 1. 将filezilla的模式更改成主动模式(PORT Mode) 原理(网上复制的)FTP协议的数据传输存在两种模式:主动模式(PORT Mode)和被动模式(Passive Mode).这两种模式发起连接的方向截然相反,主动模式是从服务器端向 客户端发起:被动模式是客户端向服务器端发起连接.是否采取被动模式取

ORA-12170 TNS 连接超时!

最近突然有段时间通过plsql连接本地oracle数据库的时候报:ORA-12170 TNS 连接超时! 现象是:开机的时候没有连上网络,然后可以通过plsql连接oracle,但是通过无线网卡连接无线Unicom,然后通过360免费wifi分享网络hswf,就不能通过plsql连接oracle,同时eclipse中项目数据库配置成<jdbcurl>jdbc:oracle:thin:@127.0.0.1:1521:orcl</jdbcurl>也不能连接数据库了. 真心狠奇怪,在网上

XML 解析 连接超时

本文转载自: http://blog.csdn.net/chjttony/article/details/7720873 说在前面 读取XML的时候,很多人总是不明白为什么会连接超时,XML解析怎么还会访问网络,其实在XML解析之前,如果XML指定了DTD文件,那么Java会根据DTD文件的路径去本地寻找或远程下载,下载的时候就会出现连接超时!所以想要避免连接超时这个问题,就可以采用避免DTD下载,下面通过两种方式避免DTD下载,本人亲测,确实是一篇好文章,谢谢作者! 下面是正文: Java程序

ftpClient的连接超时设置

FTPClient ftpClient = new FTPClient(); ftpClient.setConnectTimeout(10*1000); // 10s,如果超过就判定超时了 ftpClient.connect(hostName, 21); http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/SocketClient.html#setConnectTimeout(int) Class

sql连接超时

超时时间已到.在操作完成之前超时时间已过或服务器未响应”初步分析原因为对MSSQL操作时连接超时,知道这事,以前没留意,大概是在配置文件中设置连接时限,在网上找了下解决方法,大多说在数据库连接字符串里解决 SqlConnection con = new SqlConnection("server=.;database=myDB;uid=sa;pwd=password;") 改为: SqlConnection con = new SqlConnection("server=.;

axis 连接超时

本次场景:此次本工程有两次servletA.B,供外部请求使用: 产生: (1)第一步外部请求A正常响应,本工程向外发送get请求,本次流程结束: (2)第二步外部请求B正常响应,调用wsdl客户端,总是报连接超时错误: 办法:最后写了个Thread线程去调用wsdl客户端,成功,原因不明,是否涉及同步异步问题? 但是如果直接请求B去调用wsdl客户端,能成功.

HttpClient 4.5版本设置连接超时时间

HttpClient升级到4.5版本后,API有很多变化,HttpClient 4之后,API一直没有太稳定,我感觉4.5版本抽象后,很多API应该快稳定了. 使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间.这两个参数很重要,目的是为了防止访问其他http时,由于超时导致自己的应用受影响. 4.5版本中,这两个参数的设置都抽象到了RequestConfig中,由相应的Builder构建,具体的例子如下: CloseableHttpClient httpclient = H