【必杀】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
之前写过一篇文章,https://www.cnblogs.com/qidian10/p/6028784.html 解释如何解决此类问题,但现在回过头来想一下,之前的文章还是太过浅显,无法完全有效的彻底解决此类问题。
近期因为工作原因,这个问题又凸显出来,这里做下解决思路,通过如下的解决思路基本可以应对任何此类这样的问题,能够快速准确的定位原因。
一、事发背景
谋SaaS架构产品,基于.net framework 跑在iis上,负载均衡3台web;
情况是每天的非固定时间会报一次cpu 100%的警告,部分情况下可在1分钟左右的时间自动恢复;访问量大的情况下持续很久需要人工干预;直观的表现如下:
1)cpu瞬间打满
2)iis请求队列排队严重
3)附加着带来若干redis请求异常,部分第三方api请求异常等
4)总之客户怨声载道,给系统打上“卡”的标签,投诉不断
二、分析问题
由于系统不是经常性的卡顿,是偶发性的,基本定性为几个方向:
1、某一个不是特别常用的请求触发,或者某一个不是经常能够被操作的功能点,触发导致的;
2、redis请求堵塞导致:这个最先排除,因为卡顿的时候,其他负载组的并不卡;
3、最后一张图的直观反馈是session阻塞
由于历史原因,系统保留了部分session的代码,根据资料显示,大并发情况下请求同一个session,利用session默认管理器的时候会导致请求排队。
https://stackoverflow.com/questions/16570855/requests-hanging-on-session-module-on-iis-7-5/27481000#27481000
https://blog.csdn.net/anyi2404/article/details/102251579
花了一个晚上时间,把系统里所有带session的引用全部重构掉,上线生产后,但是问题依旧
那么只有第一个可能了,按照这个思路排查这个期间发生的所有请求,按照每个请求的参数等情况去模拟,是可以复现问题的,但是这个工作量大的惊人,卡顿期间的url请求是几乎千条记录,靠人工是不现实的,另一主要原因是即使通过该方法解决了本问题,也不可以复制解决方案去应对未来的问题。所以这个方案放弃掉了。
三、开始抓dump分析
按照以往的惯例,每次卡顿的时候只需要在任务管理器进程-右键转存储,即可获取到dump文件,然后分析问题即可;但是该方式有个“坑”就是你抓取dump的时候不能存在应用程序池重启的情况,必须保证都是同一个应用程序池进程,否则的话你可能无法分析到真正的原因。
所以通过人工的方式抓取存在一定的运气性,常规类的一般都可以解决。但这次我们事后分析恰好踩了这次的坑,每次分析dump,几乎都是常规类的请求,代码复盘上基本不会有性能问题。
四、如何抓取到正确的dump包(工具一)
利用procdump:https://docs.microsoft.com/en-us/sysinternals/downloads/procdump 基本命令如下
procdump -ma -s 5 -n 2 -c 70 2160
定义:当-c 70 cpu超过70%的时候,连续超过-s 5秒的时候,抓取-n 2个dump,该操作绑定进程2160
利用工具抓取可以有效避免dump不准确的问题,执行上述命令后,服务器会自动开启监控任务,一单触发,自动打包dump文件
五、分析dump
之前写过一份简易版本的分析方案:http://www.cnunify.com/help/helpDetail?id=6abdffd4-c4c6-4310-ac02-32d62e7e62a7&title=%E7%9F%A5%E8%AF%86%E5%BA%93
更全面的可以参考园子大佬的:https://www.cnblogs.com/huangxincheng/category/1967355.html
毫无疑问大量的请求在等待被执行,正在队列中的还有283,足以让cpu高起来,那么接下来就看,到底是什么原因导致请求堵塞了。
经过不断的抓包分析,最终根据请求cpu占用时间排序靠前的线程,定位到一个方法BulkInsert(当然804个请求队列里面还有很多个其他类型的方法请求,需要专业,也需要运气)
之前没有特别注意这个方法,认为就是一个普通的批量插入,而且本地执行的时候也会很快,经过各种反复猜想后,最后突然想起一个问题:
因为EF自身的问题,批量插入、更新等效率太低,所以替换了一个第三方组件来支持:Z.EntityFramework.Extensions,这个组件有一个毛病,就是预热的时候会非常慢,必须等待预热完成才可以正常执行,预热期间的请求都会排队等待。
讲人话就是:第一次调用BulkInsert方法,会触发预热,会非常慢(看你实体模型数量),之后就正常毫秒级别了。
那么是什么原因会导致Z.EntityFramework.Extensions预热呢?
只有一个可能就是这个期间发生了应用程序池的重启,某些原因导致了异常,触发了重启。
恍然大悟,之前分析的时候就注意到was进程会崩溃,并报错“为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号”
六、确认逻辑
到目前为止,基本定性了问题原因:某些请求,导致was(w3pw.exe)崩溃,进而应用程序池重启,重启触发了Z.EntityFramework.Extensions预热,预热过程带来了所有请求排队,访问量越高,阻塞越长,严重情况下服务器可能整体宕机!
七、究其根本,解决问题
两个方式:要么替换Z.EntityFramework.Extensions组件,但治标不治本;要么找到真正触发w3pw.exe崩溃和应用程序池重启的代码;很显然必须究其根本。
八、如何抓取到正确的dump包(工具二)
本块是文章重点,如何在异常情况下抓到最正确的dump包是分析问题的关键,上面介绍了一种抓dump方式,但是应对应用程序池崩溃问题,procdump工具并不奏效!
此处必须祭出大杀器:DebugDiaog2.0,实际只需要这一个工具即可。https://www.microsoft.com/en-us/download/details.aspx?id=49924
微软官方的参考demo:https://docs.microsoft.com/en-us/iis/troubleshoot/performance-issues/troubleshooting-high-cpu-in-an-iis-7x-application-pool
中文翻译版:https://cloud.tencent.com/developer/article/1619150?from=15425
基本按照文章的内容照做即可抓到正确的dump包。
DebugDiaog提供了当cpu、内存等资源异常时候自动监控和抓dump,也提供了当应用程序crash的时候自动抓dump。
按照对应操作步骤去创建规则rule即可
性能的抓包参考:https://docs.microsoft.com/en-us/iis/troubleshoot/performance-issues/troubleshooting-high-cpu-in-an-iis-7x-application-pool
crash抓包参考:https://stackoverflow.com/questions/18335678/how-to-debug-w3wp-clr-dll-error?noredirect=1
crash抓包的时候注意里面有个步骤需要选择类型,比如是栈溢出,还是其他异常,这个信息来自
九、显出原形
利用第八步骤,抓到合适dump之后,即可正常分析问题了,也没必要用windbg分析了,直接用debugdiag自带的分析器,挂上去分析
结果:
至此罪魁祸首已经定位,找相关人员处理掉即可。
十、能学到点什么,总结精髓
1、dump是什么
2、如何抓取普通的dump,工具procdump
3、如何抓取特殊异常情况下最正确的dump,工具debugdiag,这是最重要的一步
4、如何分析dump内容,!t、!tp、.cordll -lp <path>、!runaway、!~[thread]s、!clrstack等等
5、Z.EntityFramework.Extensions的坑不得不重视
参考文献:
https://stackoverflow.com/questions/18335678/how-to-debug-w3wp-clr-dll-error?noredirect=1
【必杀】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。的更多相关文章
- [转帖]为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
[终极解决方案]为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误.该进程 ID 为“XXXX”.数据字段包含错误号. ...
- 为应用程序池“XX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误
场景 WCF应用程序部署在IIS7中,使用net.tcp协议对外给几百台客户端提供服务,应用程序池不断崩溃重启. 分析过程 在事件查看器中看到的错误信息类似于 为应用程序池“XX”提供服务的进程在与 ...
- IIS 为应用程序池提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误的解决方法
系统环境:Windows Server 2008 R2 64位, IIS 7.0 错误信息: 为应用程序池提供服务的进程在与 Windows Process Activation Service 通信 ...
- 【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
困扰我大半年的错误,今天偶然间被解决了,特此分享给被同样问题纠结的朋友们! 之前的求助帖,无人应答: http://www.cnblogs.com/freeton/archive/2012/08/28 ...
- IIS故障 应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
(尝试失败,但觉得有可行性) 参考https://www.cnblogs.com/qidian10/p/6028784.html https://yq.aliyun.com/articles/6434 ...
- 为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。 改进查找流程
原文链接:https://www.cnblogs.com/qidian10/p/6028784.html 为防止原作者删除,留作解决方法备份 ---------------------------- ...
- 为应用程序池 'DefaultAppPool' 提供服务的进程无法响应Ping
打开Windows 2008 的事件查看器,应用警告提示: 为应用程序池 'DefaultAppPool' 提供服务的进程无法响应 Ping.进程 ID 是 '2144'. 注意: 需要重新注册一vb ...
- 加载为应用程序池‘DefaultAppPool'提供服务的进程失败,应用程序池被禁用【解决方法】
iis应用程序池不能启动2008年03月13日 星期四 15:29iis应用程序池不能启动.WINDOWS2003 ENT SERVER(64位)环境下(测试过32位系统一样操作无此问题),当打开“应 ...
- 为应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制
服务器经常产生“应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制.进程 ID 是 '2068'.”的错误,导致iis处于假死状态,经了解是IIS应用程序池的设置问题.解决 ...
随机推荐
- re模块计算器作业
1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )
- ss命令用来显示处于活动状态的套接字信息。
ss命令用来显示处于活动状态的套接字信息.ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比net ...
- Sharepoint 恢复列表文件
当在Sharepoint中恢复列表字段,列表数据时,恢复的是stp文件,可按照如下步骤恢复: 1.打开http://liuqiang17-1/sites/flsharepoint/_catalogs/ ...
- 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...
- Log4j未平,Logback 又起!再爆漏洞?
前段时间 Log4j接连爆漏洞的事儿相比把大家都折腾的不轻,很多开发都被连夜叫起来修复漏洞.这几天终于平复一些了. 可是,昨晚,忽然看到技术群和朋友圈,有人开始聊Logback 又爆漏洞了. 这是什么 ...
- c++指针常量和常量指针概述
个人理解,欢迎指正 这个简单,简单,简单(不要有心里压力:认为很难) 本文将会解决: A.变与不变 B.判断指针常量和常量指针. C.常量指针指针常量.本文不涉及. 1.概述 A.指针: 说到底,还 ...
- 【LeetCode】1128. Number of Equivalent Domino Pairs 等价多米诺骨牌对的数量(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典统计 代码 复杂度分析 日期 题目地址:http ...
- 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...
- 【剑指Offer】合并两个排序的链表 解题报告(Python)
[剑指Offer]合并两个排序的链表 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interview ...
- 【LeetCode】896. Monotonic Array 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...