.NETアプリでコンピューターがフリーズする原因は何ですか?
質問
これはおそらく正規の「それは依存する...」であることを知っています。質問ですが、どこから探し始めるかについてのポインタをいただければ幸いです。
イーサネット経由で通信するクライアント/サーバーアプリがあります。あるコンピューターではサーバーとクライアントを実行し、別のコンピューターではクライアントのみを実行します。 1つはVistaを実行し、もう1つはXPを実行します。約3週間の稼働時間の後、コンピューター全体がフリーズし、何も機能せず、マウスもキーボードも何も機能しません。電源を切るだけです。サーバーは10秒ごとにpingメッセージを送信して、クライアントが生きているかどうかを確認します。それ以外は、毎日数件の小さなメッセージが行き来します。
私がそれを引き起こしているのか、それとも他の何かを引き起こそうとしているのかを見つけようとしています。セッションを開始し、数日後、メモリ使用量の奇妙な増加をチェックしたいと思ったが、それ以上のアイデアはほとんどない。
解決
考慮すべきいくつかの考え:
- コンピューターが応答しないことはわかっていますが、コンピューターがハングしているわけではありません。 pingに応答しますか?
- ディスクアクティビティランプが常に点灯している可能性がありますか?
- 「キーボードなし」と言います。 -Caps Lockなし、またはNum Lockランプが点灯しないということですか?
- .NETアプリケーションがその時点で実行している唯一のアプリケーションである場合もありますが、それが問題の原因であることを意味するものではありません。バックグラウンドジョブがそれを実行している可能性があります。
たとえば、Retrospectバックアップは、スナップショットを作成しているときに、システム全体を10〜15分間フリーズします。つまり、Caps Lockはありません。タスクバーの時計は更新されません。CTRL-ALT-DELは入力できず、「Answer」に入力できません。 SOのテキストボックス、何もありません。それは私がSOについての質問に答えていたときに行っていたこととは何の関係もありませんでした。
戻ってきた後、SOは私が人間かどうか尋ねました。私の気持ちが傷つきました。 ;-)
他のヒント
カーネルデバッガーをOSに接続できます。そうすれば、OSが完全に応答しなくても、OSとプロセスの状態を検査できるはずです。 (残念ながら、VSで「ブレーク」を押すよりもはるかに困難です。それを試す前に、ジョンロビンの「.NETおよびWindows用アプリケーションのデバッグ」を読むことをお勧めします。)
定期的にアプリケーションのメモリダンプを作成することもできます。ただし、そのためには少しスクリプトを作成する必要があります。 (通常、userdumpやadplusなどのツールを使用して、キーストロークでダンプを作成しますが、OSがキーストロークに応答しない場合は機能しません。)そのようにすると、プロセス中の状態がわかります。またはハングの少し前。 このページ: http://blogs.msdn.com/debuggingtoolbox/default.aspx WinDbgのスクリプトを作成するための適切な出発点です。 (メモリダンプの処理方法がわからない場合は、John Robbinのデバッグに関する優れた本をお勧めします!)
それ以外は、標準のデバッグトリックしか考えられません。問題はすべてのPCで発生しますか?クライアントのリクエストがない場合に発生しますか?より多くのクライアント要求がある場合、それはより早く起こりますか?使用可能な物理メモリが少ない場合、より早く発生しますか?アプリケーションの一部を削除して(テスト用に別のサーバー上にある場合があります)、問題が引き続き発生するかどうかを確認してください。 VMで実行してみて、「ハング」中にCPU、ハードディスク、またはネットワークを使用するかどうかを確認してください。
これは の回答にはなりませんが、OSイベントログを確認し、perfmonを実行してメモリ、CPU使用量などを追跡することをお勧めします
どのコンピューターがフリーズしますか、サーバーまたはクライアントですか?また、それぞれどのOSを実行していますか?
ダニエルLが指摘したように、タイトなポーリングループは実際にCPUを殺す可能性があります。可能であれば、イベントハンドラーを使用するようにコードを変更すると、はるかに堅牢なソリューションになります。
最後に、フリーズしているコンピューターにハードウェアの問題がないことを確認しますか?