w3wp进程发生死锁ISAPI aspnet_isapi.dll报告它自身有问题,原因Deadlock detected

这个问题,字面意思是程序发生死锁了,它会导致w3wp进程重启。通常这个问题不好查到原因。我知道两个可能导致此问题的实例

1. 在程序中使用了lock或者ReaderWriterLock,锁资源发生了争用
下面是一小段代码:

代码如下:

//_rwLock的类型是ReaderWriterLock
_rwLock.AcquireWriterLock(100);
DoSomething();
_rwLock.ReleaseWriterLock();

这行代码是有问题的,如果在DoSomething()方法执行中发生一次异常,这个写锁就释放不了了,再次请求时就会等待直到超时,在多线程的情况下就会发生死锁'Deadlock detected'
正确的写法应该是:

代码如下:

try
{
_rwLock.AcquireWriterLock(100);
DoSomething();
}
finally
{
if (_rwLock.IsWriterLockHeld)
_rwLock.ReleaseWriterLock();
}

这样就算在DoSomething方法执行时发生了异常,也可以释放写锁。

2. 数据库连接的超时时间设置的很长而在设定的超时时间之内连接耗尽了,再次要求打开数据库连接时也可能会出现此问题。这个是数据库连接串的配置问题,超时时间要设置的适当,不要过长。

发生这个问题时的日志写的很笼统:
ISAPI 'c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll' 报告它自身有问题,原因如下: 'Deadlock detected'。

有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。

这样导致不容易找到问题发生在哪块,所以我记录两种发生此问题的实例,希望有用。

问题分析方法(这个很有必要的)

今天系统突然折了,但是问题在哪呢?很费周折。

  错误信息:

  ISAPI'c:windowsmicrosoft.netframeworkv2.0.50727aspnet_isapi.dll'报告它自身有问题,原因如下:'检测到死锁'。

  有关更多信息,请参阅在http://go.microsoft.com/fwlink/events.asp的帮助和支持中心。

  症状:系统总是不稳定,一会能用,一会儿又死掉了。

  分析过程:

  这个版本已经跑了很长时间,估计不是程序死锁的问题。倒底是什么问题呢。应该是外部环境的问题。由于错误信息比较的抽象,之前没有遇到过,所以google了下,但是好像遇到此问题的人很少,不过在博客园还是遇到一位受到同样遭遇的人,但是并没有一种很好的解决方案,也没有确切的指出问题的症结。所以只有自己进行一些检查。

  <1>查看最近的系统更新,看是否有关于IIS之类的更新

  <2>查看系统的杀毒软件的日志文件,看是否收到了攻击

  但是,检查上述两个步骤,并没有发现问题。看系统是有一些更新,迫于无奈,只好重启系统试一下(也顺便重启IIS)。重启之后,问题依旧。

  观察进程管理器,发现:

  W3WP的线程数,一直在变化,一会增加一个高峰值,重新增加一个W3WP进程,之前的进程过一会就自动关闭,一会又恢复正常。

  这说明网站,在不断的死亡、重启。到底是哪里的问题呢?应该还是系统自己的问题了。但是它自身的版本并没有问题,为了确定这一点,我也试了之前稳定的版本,同样出现此类问题。最后,是否是系统中调用的第三方服务,将整个系统给拖死了呢?

  罪魁祸首:经过检查,果然是由于程序中实时调用了一个服务,由于此服务已经停止,请求无果,出现了死锁。

  教训:

  <1>最大大限度保证系统与第三方服务的稳定、安全,并在请求过程中做超时判断、消息分级处理。

  <2>遇到问题,首先应全面分析系统的问题可能性,因为系统本身的运行环境一般都是固定不变的,出现问题的可能性很小。

  有的时候在写程序的时候,如果出了问题,首先应该怀疑自己的思路、代码哪里出了问题,而不应该去怪罪IDE或者OS出了什么BUG。这样你就少走很多弯路。

通过上边的介绍,我出现此问题的原因是:(在此贴出备注一下)


首选我代码里没有用到加锁代码(例如:Application.Lock(), Application.UnLock()等);

其次在此问题之前,没有出现过此问题,并且良好运行过很长时间;

最后发现,由于我代码里调用c/c++ DLL, 而DLL里要链接网关服务,然后网关服务此时没有开启,从而出错,开启DLL需要的网关服务,就可以了。

(0)

相关推荐

  • 强制SQL Server执行计划使用并行提升在复杂查询语句下的性能

    通过观察执行计划,发现之前的执行计划在很多大表连接的部分使用了Hash Join,由于涉及的表中数据众多,因此查询优化器选择使用并行执行,速度较快.而我们优化完的执行计划由于索引的存在,且表内数据非常大,过滤条件的值在一个很宽的统计信息步长范围内,导致估计行数出现较大偏差(过滤条件实际为15000行,步长内估计的平均行数为800行左右),因此查询优化器选择了Loop Join,且没有选择并行执行,因此执行时间不降反升. 由于语句是在存储过程中实现,因此我们直接对该语句使用一个undocument

  • php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE eval()'d code error

    复制代码 代码如下: 1.调用模板中的判断语句不正确. 2.调用php或SiteEngine的一些函数不正确. 3.一些单引号或双引号引起的问题.

  • 深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及private用法.相信对于大家深入掌握C++程序设计会有很大的帮助. 这里我们首先要明白下面几点. 1.类的一个特征就是封装,public和private作用就是实现这一目的.所以: 用户代码(类外)可以访问public成员而不能访问private成员:private成员只能由类成员(类内)和友元访问.

  • PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法

    今天在写PHP程序的时候总是出现这样的错误:Parse error: syntax error, unexpected end of file in *.php on line *,然后我就根据提示,找到那个文件,然后错误中总是提示最后一行出错,我找到最后一行发现是</html>,晕的,这能有什么错误,找了好久才找到问题所在,拿来分享. 出现这个错误的原因就是语法错误,肯定是PHP程序的书写不规范造成,我后来一条一条看才发现,原来是PHP语句标识符错了,正常情况下应该是这样的:<?php

  • pycharm 使用心得(九)解决No Python interpreter selected的问题

    初次安装完PyCharm后,新建项目时,遇到了No Python interpreter selected的问题. 意思是说没有找到Python解释器.那我们添加Python解释器即可. Python–Preferences–Project Interpreter–Python Interpreter 点击"+"号选择系统安装的Python. 然后再返回Project Interpreter,选择刚添加的解释器. 现在就能新建项目了. 开始你的Python之旅吧.

  • php iconv() : Detected an illegal character in input string

    开始是这样用的$str = iconv('UTF-8', 'GB2312', unescape(isset($_GET['str'])? $_GET['str']:''));上线后报一堆这样的错:iconv() : Detected an illegal character in input string 考虑到GB2312字符集比较小,换个大的吧,于是改成GBK:$str = iconv('UTF-8', 'GBK', unescape(isset($_GET['str'])? $_GET['

  • 问个高难度的复杂查询(在一个时间段内的间隔查询)

    我想在一个时间段内然后按照间隔时间来查询数据 select * from 监控温度表 where 监控温度表.时间 between '" + Str(dtStart.Value) + "'AND '" + Str(dtEnd.Value) + "'order by id 这个是在一个时间段内查询,现在要加个时间间隔来查询,不知所云,望高手解答 其中dtStart.Value和dtEnd.Value是DTPicker1控件 举例:比如说我查询时间段在 2007-1-5

  • PHP syntax error, unexpected $end 错误的一种原因及解决

    Parse error: syntax error, unexpected $end in script.php on line xx 调试了一会后发现产生错误的行是文件中间某行 //$str .= "?>\n"; 想起来了 PHP 解释器允许的结尾标记那行还可以用单行注释,即 //$str .= "?>\n"; 被解释成结尾标记前有注释,注释的内容是 //$str .= ",而 ?> 后面的 \n"; 会被解释作 PHP 块外

  • PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法

    其实,这是一个非常容易解决掉的问题.在我看来,似曾相识,呵呵,最近学JavaScript可是学会了使用var声明变量. 其实,在PHP中根本不需要使用var声明的,但是当一个变量作为一个类的成员变量的时候,使用var还是没有问题的. 在外部使用var就报错Parse error: syntax error, unexpected T_VAR in...,例如我的出错信息: Parse error: syntax error, unexpected T_VAR in D:\Apache2.2\ht

  • 在sqlserver中如何使用CTE解决复杂查询问题

    最近,同事需要从数个表中查询用户的业务和报告数据,写了一个SQL语句,查询比较慢: Select S.Name, S.AccountantCode, ( Select COUNT(*) from ( Select Distinct BusinessBackupId from Biz_BusinessBackupCustomer where Id in ( Select BusinessBackupCustomerId from Rpt_RegistForm where ( SignatureCP

  • jQuery中:selected选择器用法实例

    本文实例讲述了jQuery中:selected选择器用法.分享给大家供大家参考.具体分析如下: 此选择器能够匹配被选择的<option>元素. 语法结构: 复制代码 代码如下: $(":selected") 此选择器可以和其他选择器配合使用,比如类选择器.元素选择器等等.例如: 复制代码 代码如下: $(".myselect :selected").css("color","red") 以上代码能够将类名为myse

  • PHP Parse Error: syntax error, unexpected $end 错误的解决办法

    这几天写php程序,感觉很多地方不如asp,asp.Net,jsp顺手,比如session使用先得session_start();,文件跳转header用的也不方便.... 也许是不熟悉的php的一些特性吧,不过写多了,也就慢慢适应将就了..... 这里就整理一个代码编写调试问题,错误如下: Parse error: syntax error, unexpected $end in D:\xampp\htdocs\guestBook\guestBook.php on line 330 看看程序

  • C++中的三种继承public,protected,private详细解析

    三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员函数访问 三种继承方式 public 继承 protect 继承 private 继承 组合结果 基类中 继承方式 子类中 public & public继承 => public public & protected继承 => protected public & private继承 = > private protected &am

  • CodeIgniter框架提示Disallowed Key Characters的解决办法

    打开ci框架的源码不难发现,在ci的核心input类中有这样一个函数: 复制代码 代码如下: function _clean_input_keys($str)    {        if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))        {            exit('Disallowed Key Characters.');        } // Clean UTF-8 if supported        if (U

  • jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误

    jquery.bgiframe.js在IE9下的错误 复制代码 代码如下: SCRIPT5022: DOM Exception: INVALID_CHARACTER_ERR (5) jquery.bgiframe.js, 行8 字符976 错误代码 复制代码 代码如下: 1 {if(!$('iframe.bgiframe',this)[0])this.insertBefore(document.createElement(html),this.firstChild);});};})(jQuery

  • jQuery选中select控件 无法设置selected的解决方法

    解决办法:把选中option的语句放到setTimeout中,例: 复制代码 代码如下: setTimeout(function() { var selSorts = $("select[id^='" + controls.selsort + "']"); $.each(selSorts, function(index, sort) { var ope = $(sort).find("option[value='" + arrSort[index

随机推荐