今天网上的系统突然报错,经过排查是调用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
这篇很有价值了
最近公司有位仁兄写了1个监控IIS的软件,里面提到1个连接数, 此连接数主要是搜集WMI信息,
把代码写1下:
// 取到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); //
}
乍1看, 此 CurrentConnections是做甚么用的呢? 由于我1直想了解1个IIS站点默许在同1时刻究竟能接受多少连接要求, 上网查了查,查到了maxconnection。
首先看看微软是怎样解释的:
这个 maxconnection参数用来肯定: 对每一个IP能容纳多少个连接数(翻译的其实不1定准)。
<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
里面有1段写的很明白,
请注意在使用此配置时您可以履行的每一个 CPU 12 ASP.NET 要求最多在同1时间由于 100⑻8 = 12。因此,最少 88 * N 工作线程和 88 * N 完成端口线程都可用的其它用处 (例如 Web 服务回调)。
基本上就明白了。 maxconnection = 12*CPU数量。 我们公司的服务器是使用双核的, 也就是说,在默许的情况下,
我们公司服务器上的IIS站点的默许最大连接数是24,
接下来验证1下, 测试的目的是为了证明: 当超过24个访问连接候,IIS的站点还能不能接受其他的连接,
实现准备:
1 写1个WEBService,里面包括A和B方法,其中A方法里面就1句Thread.Sleep(10分钟), 而B方法则直接Return "OK";
2 VS2008负载测试(摹拟24个用户同时访问1台服务器上的webServiceA方法,由于A方法是会让线程休眠10分钟)
3 同时在服务器上搜集WMI信息来观测WEBService当前的连接数, 使用: obj.Properties["CurrentConnections"].Value (具体搜集方法看本文开头)
这是负载测试,
这是负载测试调用的测试方法。
OK, 准备就绪, 开吃。。哦,不对, 开始测试,这里我就不贴出来当时测试的图, 我把我测试的结果告之1下,
当负载测试开始, Webservicer 的 obj.Properties["CurrentConnections"].Value 值,1直在增加, 当增加到24时,也就是我们摹拟的24个用户,
我们在本机再摹拟编写1段访问WebServiceB方法的代码,注意B方法是不会使线程休眠的,直接Return "ok" . 结果1直等到超时,也没有OK显示,
但此时 obj.Properties["CurrentConnections"].Value的值为25,
如果我们把负载并发数的设为23呢,再启动负载测试, 当连接数到达23时, 再调用B方法,结果发现,大约在3秒钟,调用B方法成功了,显示“OK”,
顺便提1句:在ASP.NET 2.0中,引入了autoConfig属性:
1 | < processModel autoConfig = "true" /> |
当值为true时,autoConfig在运行时修改配置以下:
如果大家说, 我有1台猛机, 配置牛B, 这些默许的设置不够,我需要自已动用配置, OK, 可以直接在machine.config里修改,
下面是示例代码,
有些人会问: 这个东东1定要在 machine.config里修改吗? 能不能在web.config里面呢,目前我在Webserive程序里面的Web.config
修改了 <add address = "*" maxconnection = "30" />, 但使用负载测试时,发现还是不行,只能到达24, 这就说明30并未起作用。
有知道的说明1下,为何不行? 依照微软的说明,应当在web.config里面是可以起作用的,
需要注意的是: 如果增加了maxconnection 数量, maxWorkerThreads的数量也需要增加相当的数量, 比如在双核的CPU上, 修改maxconnection = 25,
则 maxWorkerThreads也需要修改成101, 由于 maxconnection = maxWorkerThreads --minFreeThreads
还有1个疑问: 如果IIS崩溃了, 这里正好有1个HTTP要求过来,那末IIS会怎样处理? 答案中最好有微软的官方说明。
结论: IIS的站点默许的并发连接数是12*CPU,也就是说默许设置下IIS在同1时刻能处理的最大要求数是12*CPU数量 。
欢迎猛烈拍砖,有甚么好建议你老就用力的提吧。谢谢你了。
上一篇 PHP读取EXCEL的方法 下
下一篇 ogg_级联复制'