質問

現在、ASP.net 2.0アプリケーションでGUIテストを行っています。 RDBMSはSQL Server 2005です。ホストはWin Server 2003 / IIS 6.0です。

コードをリリースしていない外部企業によってプログラムされたため、アプリケーションのソースコードがありません。

IISを再起動すると、アプリケーションが正常に動作することに気づきましたが、いくつかのテストの後、ブラウザを数時間開いてから閉じた後、アプリケーションの速度は徐々に低下し始めます。この振る舞いがプログラマーによる不適切なクローズ接続の慣行によるものかどうか疑問に思っていました。ここでデータベースのオープン接続リークが疑われています。

.Netガベージコレクターは最終的にそれらを閉じると思いますが、...しばらく時間がかかりますか?

SQL Server Management Studioを入手しましたが、アクティビティモニターから、データベース上で非常に多くの接続が開かれていることに気付きました。

上記のすべてから、主な質問に関連するいくつかの質問があります:

  1. SQLで知る方法はありますか サーバー2005 彼らがいるのを待っているので開く 接続プールで使用される場合、または 彼らはによって使用されているため、彼らは開いています アプリケーション?

  2. Somoneは良いことを知っていますか 私ができるオンライン/紙のリソース パフォーマンスの使用方法を学ぶ カウンターまたはその他の種類のツール これらの種類を追跡するのに役立ちます 問題?

  3. パフォーマンスカウンターが最適な場合 ソリューション、私がする変数は何ですか 見るべきですか?

役に立ちましたか?

解決

web.configから接続文字列をいつでも確認できます(主に接続プールが有効になっている場合、接続制限が有効になっている場合)。

また、IIS 6を使用している場合、別のアプリケーションプールを使用するようにWebアプリケーションを設定し、メモリとプロセスをリサイクルするための他のオプションを設定できます。

パフォーマンスカウンターについては、ガベージコレクターの実行時間を確認できます。 アプリケーションが使用しているメモリ量など。

SQLサーバーにアクセスできる場合は、アプリケーションから作成された接続を監視できます(SQL Serverのインストールされたすべてのインスタンスに対して定義されたパフォーマンスカウンターがあります)。

MSDN Magazine に記事がいくつかありました。また、SOSデバッグライブラリを使用して、アプリケーションのプロセスにアタッチし、手動で確認することもできます。

また、ソースコードがない場合は、リフレクターアプリケーションのソースを取得します(デバッグに非常に役立ちます)

@Later edit:stackoverflow.comの質問でも確認できます。

他のヒント

同様の問題を調査しているこのスレッドを見つけました。 SQL Serverでリークの多い接続をデバッグする良い方法として、次のSQLを思い付きました。

SELECT S.spid, login_time, last_batch, status, hostname, program_name, cmd,
(
      select text from sys.dm_exec_sql_text(S.sql_handle)
) as last_sql
FROM sys.sysprocesses S
where dbid > 0
and DB_NAME(dbid) = '<my_database_name>'
and loginname = '<my_application_login>'
order by last_batch asc

これにより、特定のデータベースで開かれたすべての接続とログインが、その接続で最後に実行されたSQLと一緒に 、そのSQLが実行された時間でソートされます。

接続プーリングのため、接続リークが発生していることを知らせるために多くの接続が存在するという事実だけに頼ることはできません。コードから正しく。ただし、接続リークがある場合、表示されるのは、一部の接続が&#8220;凍結&#8221;&#8212;上記のクエリと&#8220; last_batch&#8221;タイムスタンプは変更されません。他の接続もハングアップしますが、それらに対して新しいSQLが実行されるたびに、&#8220; last_batch&#8221;タイムスタンプが更新されます。そのため、凍結された接続はこのクエリの最上部に浮かびます。

問題のアプリケーションのソースコードがある場合、これが孤立した接続で最後に実行されたSQLを提供するという事実は、デバッグに非常に役立ちます。

この問題に直面し、SQL Server Profilerが優れたツールであることがわかりました。短時間のテストでサイトを監視し、接続プールで再利用されない多くの接続(sp_who)が作成されていることに気づいたので、SQLを開きましたサーバープロファイラで、コードから行われたSPへのすべての呼び出しの後に&quot; sp_reset_connection&quot;が続いているかどうかを確認します。コール。新しいバッチの開始前に呼び出しがない場合、最初の接続が不足しています。

ADO.NETパフォーマンスカウンター)に関するMSDNリファレンスアプリケーションをプロファイリングするときに何を探すことができるかについてはかなり明確です。 perfmon アプリケーションがWindowsに組み込まれています。

それ以外は、ADO.NET接続プーリングについて学ぶことをお勧めします。コードのバグが本当に疑われる場合は、 Red GateのReflectorを使用して、バグを確認できます。 (今は無料)は、MSILをC#に分解します。

接続とアクティビティ時間を確認することから始め、接続を開いたままにしているアイテムを見つけることができるかどうかを確認します。

ソリューションがIISの再起動である場合、アプリケーションのメモリ使用量を調べて、メモリリークまたはフットプリントの増加を実際に引き起こす何かがあるかどうかを確認することも考えられると思います。

開いている接続に問題がある場合、アクティビティモニターには、アクティビティのない非常に多数の接続が表示されます。

パフォーマンスカウンターについては、「SQL Server:General Stats」を参照してください。パフォーマンスオブジェクト。

Todd Denlingerは素晴らしいクラスを作成しました http://www.codeproject.com/KB/ database / connectionmonitor.aspx 。SQLServer接続を監視し、一定期間内に適切に破棄されなかった接続についてレポートします。それをあなたのサイトに配線すれば、漏れがあるときにそれを知らせてくれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top