6

私たちのウェブサイトは .NET ですが、古い ASP と 32 ビットのライブラリも含まれています。しばらくの間(2年間)正常に動作していました。しかし、この 1 か月間、IIS7 サーバーで次のエラーが発生し、追跡して修正することができませんでした。

「障害のあるアプリケーション w3wp.exe、バージョン 7.0.6001.18000、タイム スタンプ 0x47919413、障害モジュール kernel32.dll、バージョン 6.0.6001.18215、タイム スタンプ 0x4995344f、例外コード 0xe053534f、障害オフセット 0x0002f328、プロセス ID 0x%9、アプリケーション開始時刻 0x% 10.」

エラーを再現できます。

  • .ASPX ページの 1 つが読み込みを開始し、コードとクエリを実行します (コードが壊れた場所を追跡するために、ページ全体に response.flush() があります)、突然停止し、IIS で上記のエラーが発生します。

  • ページの読み込みが停止し、response.flush() がないと、(web.config で構成されているように) error.aspx ページにリダイレクトされません。

  • エラーは常に発生するわけではありません。場合によっては、3 回連続して発生し、その後、error.aspx への適切なリダイレクトにより、15 分間ノンストップで正常に動作します。

  • そのときに表示されるエラーは、「BOF または EOF のいずれかが True であるか、現在のレコードが削除されました」という典型的なものです。

  • エラーが発生すると、ページがハングし、ブラウザーからの同じコンピューター上の他のすべてのセッションでも Web ページがハングします (ところで、テスト中は 1 つのワーカー プロセスのみを許可します)。他のコンピューターから、サイトは正常に読み込まれます。

  • アプリケーション プールをリサイクルし、w3wp.exe を強制終了し、IIS を再起動できます。何もしません。ページを再度正常にロードする唯一の方法は、セッション状態を処理する MS SQL を再起動することです。これがなぜなのかはわかりませんが、ユーザーのブラウザーのセッション Cookie が (上記のクラッシュにより) 適切に終了されなかったスレッドを指しており、IIS がさらにコードを処理するためにそのスレッドが終了するのを待っていると推測しました (? )。誰かがこれをよりよく説明できれば、それは本当に役に立ちます。スレッドを「終了」するために設定できるタイムアウトはありますか? これは MS SQL 関連の問題ですか?

プライベート メモリと仮想メモリの使用状況も調べました。これは、コードが最も効果的ではなく、メモリ リークが残っていると確信しているためです。ただし、プライベート メモリと仮想メモリの両方がまだ非常に少ない (それぞれ 100MB 未満) にもかかわらず、ページがクラッシュするのを見ました。

ここに示されているように、Debug Diag と WinDbg を使用しました。 .aspxですが、windbg を機能させることができません。これは、現時点で実行しようとしていることです。

誰かが私たちを助けてくれたり、本当に素晴らしい正しい方向に向けてくれたら、ありがとう。

4

4 に答える 4

2

「BOF または EOF のいずれかが True であるか、現在のレコードが削除されています」は、テーブルが空で、MoveNext を実行しようとしていることを意味します。したがって、移動を行う前に eof を確認してください

IIS は、このような w3wp.exe でカーネル エラーをスローすることで有名です。セッション状態のすべてのエラーは、クラッシュしたプロセスの症状にすぎません。複数の APP プールはあまり役に立ちません。エラーが広がるだけです。

ユーザー環境の変化による SQL のデッドロックだと思います。これにより、SQL がどのクエリを強制終了するかを決定しようとするため、10 秒の遅延が発生します。1 人が勝ち、1 人が負けます。敗者は予期せず空のテーブルへのポインターを取得し、移動を試みてクラッシュします。DB を ODBC 接続に向けてトレースをオンにするか、SQL をログに記録させる方法を考え出すことができます。

Perlで上記と同じ症状がすべてありました。ラッパー fn() を作成して、すべての SQL クエリを実行し、すべての sql、+ params、およびすべてのエラーをディスクに記録して、問題を追跡することができました。それはデッドロックでしたが、自動再試行でコーディングすることができ、最終的にクエリの順序を再コーディングし、列をスキャンしてデッドロックを解消しました。

于 2010-12-16T05:32:03.933 に答える
0

参照/リンクされたアセンブリの1つが、ディスク上でランダムに破損している(発生する可能性があります)可能性があります。使用している最新のxyzドライバーの同じ統計、フレッシュインストールを使用して、新しいクリーンなマシンで問題を再現してみてください。

この方法で分離するのに何ヶ月もかかった不思議な問題を解決しました。クリーンで、同じ仕様と事前に必要なドライバーを備えた新しいマシンは問題なく動作するように見えました。同じ仕様の一部の古いマシンのみが一貫して障害を起こしていました。最終的にすべて(IIS、ASP.NET、.NET、データベース、クライアント)をアンインストールし、最初からやり直しました。私が分離したときの最終的な原因は、古いマシンでdbクライアントドライバーが破損していることでした(そして、すべての古いマシンは互いにクローンであったため、破損が発生した後にクローンされたと思います)、それは混乱しているように見えました直接呼び出していなくても、.NETメモリスペース。「このモンスターのデバッグを手伝って」とはまだ返信していません誰かに役立つとは思えなかったので、この回答を投稿してください。

于 2010-12-11T13:49:32.337 に答える