none
接続・切断を繰り返すソフトのシステム負荷について RRS feed

  • 質問

  • SQLServer2005Expressを使用したシステムを利用しているのですが、先日、システムを動かしているPCがブルースクリーンで停止するというトラブルがあり、原因を探っています。

    SQLServerのエラーログを見るとデータベースを使用しているソフトがおよそ1秒毎に接続、切断を繰り返していることが確認できました。

    このように頻繁に接続・切断を繰り返すと、システム負荷が上がり、やがてシステムダウンに繋がる ということはあるでしょうか?

    また、このシステムを起動していると、lsass.exeのメモリ使用量が上がっていくのですが、これは接続・切断の頻度に影響しているのでしょうか?

    2010年10月8日 0:03

回答

  • 追加の質問になってしまうのですが、パフォーマンスモニタでSQLServerのUser Connectionsをモニタリングし、接続数が増え続けなければきちんと切断していると判断して良いでしょうか?

    良いと思います。ただ、切断しても接続プールによりすぐにはデーターベースから切断されません。Connection Lifetimeで設定された時間経過後に実際に切断されます。手元の資料(プログラミングADO.NET)ではデフォルトで60秒になっていますが、私の探し方が悪いのか、Web上では探し出せませんでした。
    また、接続プールは別スレッドで処理されますから、closeして接続プールへ接続を返す処理が完了する前にOpenがかかると一時的に接続数が増加する可能性があります。ただ、極めて短い時間にOpenとCloseを繰り返す場合なので通常は無いと思いますし、仮にそのような状態になったとしても一時的なもので接続数が増え続けることはないでしょう。

    (参考)
    SQL Server の接続プール (ADO.NET)
    http://msdn.microsoft.com/ja-jp/library/8xx3tyca.aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 編集済み trapemiya 2010年10月8日 2:24 追記
    • 回答としてマーク t.nishii 2010年10月12日 0:33
    2010年10月8日 2:20

すべての返信

  • 接続は.NET管理外の資源を使いますので、接続を切断する際にはコネクションを必ずクローズして資源を解放しなければなりません。きちんとクローズされているか確認してみて下さい。きちんとクローズするにはusing句で囲むのが一般的です。
    (参考)
    C# の using ステートメントによる Dispose()
    http://sonic64.com/2004-12-21.html

    また、1秒ごとに接続と切断を繰り返すのはやりすぎでしょう。ポーリング的なことをされているのでしたら、接続したままの状態で行うことを検討してみて下さい。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2010年10月8日 1:07
  • lsass.exeは認証に関わるサブシステムプロセスなので、Windows認証を使った
    接続を繰り返すと反応すると思います。
    またBSODが発生しているのであればメモリダンプが出力されていると思います。
    そのダンプファイルをOSサポートベンダーに解析してもらうことをお勧めします。

    なおデフォルトではダンプファイルはかなり限られた情報しか出力しないので
    ダンプファイルの種類を変えることでより詳細に現象を追うことができます。
    その分容量を食ったりや起動までの時間が長くなったりするのでご注意下さい。

    2003の情報ですが参考までに。
    http://support.microsoft.com/kb/972110

    2010年10月8日 1:17
    モデレータ
  • 回答ありがとうございます。

    1秒毎の接続・切断はやはりやりすぎですよね、修正を検討します。

    追加の質問になってしまうのですが、パフォーマンスモニタでSQLServerのUser Connectionsをモニタリングし、接続数が増え続けなければきちんと切断していると判断して良いでしょうか?

     

    2010年10月8日 1:41
  • 回答ありがとうございます。

    lsass.exeですが、Windows認証ではなく、SQLServer認証で接続している場合も反応するでしょうか?

    ダンプファイル解析は依頼を検討します。

     

    2010年10月8日 1:46
  • 追加の質問になってしまうのですが、パフォーマンスモニタでSQLServerのUser Connectionsをモニタリングし、接続数が増え続けなければきちんと切断していると判断して良いでしょうか?

    良いと思います。ただ、切断しても接続プールによりすぐにはデーターベースから切断されません。Connection Lifetimeで設定された時間経過後に実際に切断されます。手元の資料(プログラミングADO.NET)ではデフォルトで60秒になっていますが、私の探し方が悪いのか、Web上では探し出せませんでした。
    また、接続プールは別スレッドで処理されますから、closeして接続プールへ接続を返す処理が完了する前にOpenがかかると一時的に接続数が増加する可能性があります。ただ、極めて短い時間にOpenとCloseを繰り返す場合なので通常は無いと思いますし、仮にそのような状態になったとしても一時的なもので接続数が増え続けることはないでしょう。

    (参考)
    SQL Server の接続プール (ADO.NET)
    http://msdn.microsoft.com/ja-jp/library/8xx3tyca.aspx

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 編集済み trapemiya 2010年10月8日 2:24 追記
    • 回答としてマーク t.nishii 2010年10月12日 0:33
    2010年10月8日 2:20
  • 回答ありがとうございます。

    切断し忘れは、ある程度の時間、システムを動かして接続数の遷移を確認しようと思います。

    ありがとうございました。

    2010年10月8日 4:13