问题描述:

      某二次开发的项目反馈,不定期出现应用服务器无响应的情况,登录服务器发现任务管理器中有大量的w3wp僵尸进程。

分析过程:

针对同一进程每隔15秒抓取dump,连续抓取3个,对比发现线程信息没有变化,并且每个线程的CPU时间和堆栈都没有变化,奇怪???

以其中一个僵尸进程的dump日志为例,总计61个工作线程,其中正在运行的为15个,但我们仅能查看其中3个线程的信息。

0:000> .load d:\dumps\sos.dll
0:000> !tp
CPU utilization: 3%
Worker Thread: Total: 61 Running: 15 Idle: 46 MaxLimit: 5600 MinLimit: 56
Work Request in Queue: 0
--------------------------------------
Number of Timers: 263
--------------------------------------
Completion Port Thread:Total: 1 Free: 1 MaxFree: 112 CurrentLimit: 0 MaxLimit: 5600 MinLimit: 56
0:000> !runaway
User Mode Time
Thread Time
1:259e4 0 days 0:02:57.107
2:1fa68 0 days 0:01:45.706
0:1bc54 0 days 0:00:49.561

进一步对比这三个可见线程的堆栈显示,都在等待异构系统Webservice的网络返回。调用异构系统的具体实现为同步的HttpSoap方式,经过ESB调用第三方的认证接口。。。,按照常理来说,该WebService服务应该很简单,什么原因呢?不超时吗?

根据堆栈我们能够看到SoapHttpClientProtocol ---》HttpWebClientProtocol ---》WebClientProtocol ---》HttpWebRequest 依次的调用关系,最终的实现是HttpWebRequest。

按照msdn上官方的文档显示,HttpWebRequest 类有三个关于Timeout的设置:Timeout、ContinueTimeout、ReadWriteTimeout

https://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest(v=vs.110).aspx

根据进程现象和活动线程的堆栈信息,推测是“远程异构系统”先响应返回HttpHeader信息后,使得Timeout超时属性失效; 之后每5分钟内都有flush回一些信息,ReadWriteTimeout也会失效;当应用程序池在设定的空闲超时限内没有接到新的request请求,触发应用程序池的回收事件;但关闭进程时发现当前进程仍有未处理完的工作进程,当前进程在等待所有工作线程执行完毕然后再退出。当应用收到新的web请求时,应用程序池创建新的w3wp进程接收处理,依次推理,长时间后便出现了很多的僵尸进程。。。。

为什么“第三方系统能够持续的反馈数据,却没有执行完成呢”? 这基本上也是不可能的,个人感觉应该是中间网络设备(防火墙、路由器、交换机)或ESB出现问题导致的,但是如果正向的联调测试话,难度太大,需要协调很多不同的外协单位。。。。

解决办法:

将同步的WebService调用改为异步调用,对超过指定的时限仍未获得返回结果的请求,提示响应超时并对异步请求做Abort处理。

参考:https://msdn.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol(v=vs.110).aspx

核心的示例代码如下:

   TestSoapHttpClient webClient = new TestSoapHttpClient();
Console.WriteLine("testing webservice: " + webClient.HelloWorld1()); // 同步调用示例 object asyState = new object();
var asyResult = webClient.BeginHelloWorld2((x) => { }, asyState); // 设置超时时限,超时后主动终止web请求
for (int i = ; !asyResult.IsCompleted && i <= ; i += )
{
Thread.Sleep();
}
if (asyResult.IsCompleted)
{
string result = webClient.EndHelloWorld2(asyResult); // 根据远程Webservice返回的结果,继续业务处理
Console.WriteLine("request succeed: " + result);
}
else
{
webClient.Abort();
webClient.Dispose(); // 记录必要的日志,根据情况决定是否抛出异常
Console.WriteLine("web request is aborted after timeout");
// log ......
// throw new Exception("远程Webservice请求超时");
}

完整的Demo:http://files.cnblogs.com/files/zhaoguan_wang/ConsoleApplication1_%E5%BC%82%E6%AD%A5%E8%B0%83%E7%94%A8WebService%E8%B6%85%E6%97%B6%E7%BB%88%E6%AD%A2%E8%AF%B7%E6%B1%82.zip

分析案例:应用服务无响应,任务管理器中发现大量w3wp僵尸进程----等待异构系统WebService返回值的更多相关文章

  1. 排错技能:任务管理器中追踪某w3wp.exe是哪个IIS站点的application pool

    如果Windows的任务管理器中发现某个w3wp.exe占用了100%CPU,那我们就要揪出这是那个网站的application pool在作怪, 首先,每个站点一定要单独使用各自的applicati ...

  2. Selenium2学习-036-WebUI自动化实战实例-034-JavaScript 在 Selenium 自动化中的应用实例之六(获取 JS 执行结果返回值)

    Selenium 获取 JavaScript 返回值非常简单,只需要在 js 脚本中将需要返回的数据 return 就可以,然后通过方法返回 js 的执行结果,方法源码如下所示: /** * Get ...

  3. Ubuntu中找到并杀死僵尸进程

    Ubuntu中产生zombie进程让人很懊恼啊.Windows中在任务管理器里直接找到无响应的进程并结束他就行了,但是ubuntu中需要用命令去解决. System information as of ...

  4. JSF页面中使用js函数回调后台bean方法并获取返回值的方法

    由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的, ...

  5. Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话

    1.    前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...

  6. shell脚本中 杀死可能成为僵尸进程的方法

    交互式 Bash Shell 获取进程 pid 在已知进程名(name)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 -v gr ...

  7. 在idea中相同的字符串使用equals()进行比较时,返回值是flase问题

    最近在idea中遇到了一个编码的问题,我的程序是从前台传过来一个字符串,判断用户的角色(学生,教师,管理员), 在进行equals()判断时,返回的确是false,然后就在网上查了查,发现是编码的问题 ...

  8. Angular中ViewChild\ngAfterViewInit\Promise的使用,在父组件初始化时等待子组件的返回值

    1.子component中的异步方法 initCreateJob = () => new Promise((resolve, reject) => { setTimeout(() => ...

  9. 正则表达式中的match,test,exec,search的返回值

    今天突然被问到了正则表达式,因为长时间不用突然不知道怎么用了,只知道有这么个东西.然后去网上查了一下,感觉写的不少,但解释的有点模糊,今天我来浅谈一下. 1,match的用法 A,在不加全局“g”的情 ...

随机推荐

  1. JAVA String,StringBuffer与StringBuilder的区别??

    String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...

  2. $("").click与onclick的区别

    onclick是绑定事件,click本身是方法作用是触发onclick事件,只要执行了元素的click()方法,下面示例 Html代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

  3. E-Form++图形可视化源码库新增同BCGSoft的Ribbon结合示例

    2015年11月20日,来自UCanCode E-Form++源码库的开发团队消息,E-Form++正式提供了同BCGSoft的Ribbon界面风格相结合的示例,如下图: 下载此示例请访问: http ...

  4. MySql使用游标Cursor循环(While)更新数据

    #要修改的变量 DECLARE var_ID VARCHAR(50) DEFAULT ''; #需要修改的数据的数量 DECLARE var_UpdateCount INT; #当前循环次数 DECL ...

  5. amazon oa2 - insert a value into a cycled linked list

    遍历,一共有三种情况, 1. pre <= x <= current 2. 遍历到了head时,x>tail 或者 x<=head (不会等于tail) 3. 遍历回aNode ...

  6. wampserver 403 禁止访问

    解决方法:修改Apache配置文件httpd.conf,注释掉 deny from all:将Allow from 127.0.0.1改为Allow from all

  7. OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )

    实验平台:Win7,VS2010 先上结果截图:    本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...

  8. js 常见弹出框学习

    模拟系统的弹出框 系统自带的弹出框 总结 链接  http://blog.csdn.net/anhuidelinger/article/details/17024491 参考这个网站学习模态框的动态弹 ...

  9. 2016年4月面试题(Unity)

    一. C#中值类型和引用类型的区别? A: 值类型的数据存储在内存的栈中:引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的地址. 值类型存取速度快,引用类型存取速度慢 值类型表示实际数据, ...

  10. [翻译]Primer on Cognitive Computing(认知计算入门)

    Source Kelly J., Primer on Cognitive Computing 20150216. 侵删,联系方式:zhoujiagen\@gmail.com. 按A candidate ...