当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    w3wp进程发生死锁ISAPI aspnet

    栏目:win服务器问题汇总 时间:2019-03-16 09:38

    ISAPI c:\windows\microsoft.net\framework\v2.0.50727\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进程,之前的进程过一会就自动关闭,一会又恢复正常。

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

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