none
SQL Server 2008にて、突然 ディスクアクセスが止まらなくなります RRS feed

  • 質問

  • SQL Server 2008を使用して、データを蓄積していくアプリケーションを作成しています。

    CPUは、パソコンです。Intel Core 2 Duo メモリ:4GB

    OS環境は、WindowsServer2008 32bit 

    当初、Max Memory Valueはデフォルトで使用していましたが、メモリどんどん消費していき他のアプリに影響がでましたので、512MBに設定しています。

    DB上に、10秒間に1回 10000量くらいのデータをためていきます。

    初めのうちは、プロファイラでかくにんすると、通常1Sec程度でトランザクションは受付ているようで、快適に進行しているように見えるのですが、7~8時間程度すると、Timeoutらしいエラーが発生します。そのとき、パソコンのディスクアクセスランプがつきっぱなしで、OS自体の動作もままならない状態になります。

    そんな状態で、DBをStopさせるとディスクアクセスもとまりますので、SQLサーバーがディスクアクセスしっぱなしだと考えています。

    原因が何かつかめないでいるのですが、なにか解決策はないものでしょうか。

    いちどこのような状態になると、CPU再起動しても治りません。

    DBのデータファイルをいったん削除して、再作成するとよくなりますが、また7~8時間程度で同じ状態になります。


    2013年3月23日 14:52

回答

  • メモリが少ない中でレコード削除でなんとか回避できているのであれば、
    読み出すデータ量を少なくするなどのアプリ側でのチューニングになるかと思います。
    特にインデックスをつけて読み出す範囲を絞るなどの対策になるのではないでしょうか。
    • 回答としてマーク 星 睦美 2013年5月21日 2:03
    2013年4月4日 10:00
    モデレータ
  • ちょっと遅レスですが。。

    既に記載されている情報のなかでは 10秒間毎のInsert処理があることはわかりますが、
    その他にSelectの処理も実行していますか?

    もしInsert処理をひたすら実行していて徐々に遅くなる場合、
    メモリの不足の問題もあると思いますが、Insert先テーブルのPrimaryキーや外部キーの設定によっては
    データの断片化が発生して必要以上のDiskアクセスが必要になる場合があります。

    今回のアプリケーションがどのようなクエリを実行しているかは解りませんが、
    Insert文を実行していても内部的にRead処理を実行する場合も多々あるので
    10秒間に1度動かしているInsert文の実行プランを分析しつつ、
    事象が発生している時のメモリの状態を分析してからアプリケーションやテーブル設計の変更をしていくことになると思います。

    • 回答としてマーク 星 睦美 2013年5月21日 2:03
    2013年4月15日 8:58

すべての返信

  • 元々max server memoryに制限をかけていなかった、かつ32bit環境なので、
    SQL Server はメモリを2GB付近まで利用可能であったはずです。
    今回max server memoryを512Mに制限したということは、元々使えていた
    メモリ量が1/4になっています。
    SQL Serverが使えるメモリ量が少なくなり、過度にReadが発生していたのではないでしょうか。
    メモリが少なく、読み出すデータ量が多ければキャッシュとしての機能が効かず、すぐに
    新しく読み出したデータのためにメモリ上のデータが破棄されます。
    もしほかのプログラムとの兼ね合いでSQL Serverに割り当てられるメモリが512Mしかないのであれば
    物理メモリの増加と共にSQL Serverに割り当てるメモリを増やす、もしくはデータを大量に読み出している
    プログラムがあれば、読み出し量を少なくするチューニングの実施を行ってはいかがでしょうか。

    • 回答の候補に設定 佐伯玲 2013年3月26日 8:07
    2013年3月26日 4:49
    モデレータ
  • 回答ありがとうございます。

    max server memoryについては、設定前はSQLServer使えるだけのメモリを確保する動作だと考えています。

    SQLSeverの仕組み的にいえば、他がメモリを必要とすれば確保したメモリ領域を縮小する動作を行うはずで、問題ないということは理解していますが、あくまでも他のプロセスなりの要求がなければ解放しないところから、使い切った状態では他の問題(ページアウトが多発)で、理由が変わるだけでディスクアクセスが頻発する状態でした。

    そのため、他のアプリケーションとの兼ね合いで、制限をかけメモリに余裕を持たせた形としました。

    状況の変化としては、制限をかけた場合のほうが、制限をかけない場合より、長い時間正常な状態が続きますので制限をかけること自体は、有効に働いていると考えています。

    メモリについては、32Bit環境で使用できる4GB(実際には少し小さくなりますが。。。)を既に搭載しており増やすことができない状態です。

    八方塞がりな感がありますが、SQLServerはこのような状態では使えないと判断するべきなのでしょうか?

    2013年3月26日 9:56
  • 32ビットのSQL Server が2GB以上のメモリを使えるようにする機能としてAWEがあります。
    物理メモリを4GB以上搭載し、有効にすることで効率が改善するかもしれません。
    http://msdn.microsoft.com/ja-jp/library/ms190673%28v=sql.105%29.aspx

    SQL Server 2008では最小メモリ要件が512MB、推奨が2GB以上です。
    もちろん利用状況に依存しますが、メモリ不足の可能性を調査してはいかがでしょうか。
    http://technet.microsoft.com/ja-jp/magazine/2007.10.sqlcpu.aspx
    このあたりの情報が参考になると思います。

    2013年3月31日 12:33
    モデレータ
  • ありがとうございます。

    メモリ不足に対しては、AWEは検討対象にしていますが、メモリ搭載可能量が4GBであるためなんとかこの範囲内で対処したいと考えています。

    現状、削除する際に、テーブルに設定しているインデックスキーをすべて指定することで1つずつ指定することで、現象が出ないようにするよう仮対策をあてている状態ですが、かなりのデータ量を削除するのでできれば解決したいと考えている次第です。

    2013年4月3日 10:01
  • メモリが少ない中でレコード削除でなんとか回避できているのであれば、
    読み出すデータ量を少なくするなどのアプリ側でのチューニングになるかと思います。
    特にインデックスをつけて読み出す範囲を絞るなどの対策になるのではないでしょうか。
    • 回答としてマーク 星 睦美 2013年5月21日 2:03
    2013年4月4日 10:00
    モデレータ
  • ちょっと遅レスですが。。

    既に記載されている情報のなかでは 10秒間毎のInsert処理があることはわかりますが、
    その他にSelectの処理も実行していますか?

    もしInsert処理をひたすら実行していて徐々に遅くなる場合、
    メモリの不足の問題もあると思いますが、Insert先テーブルのPrimaryキーや外部キーの設定によっては
    データの断片化が発生して必要以上のDiskアクセスが必要になる場合があります。

    今回のアプリケーションがどのようなクエリを実行しているかは解りませんが、
    Insert文を実行していても内部的にRead処理を実行する場合も多々あるので
    10秒間に1度動かしているInsert文の実行プランを分析しつつ、
    事象が発生している時のメモリの状態を分析してからアプリケーションやテーブル設計の変更をしていくことになると思います。

    • 回答としてマーク 星 睦美 2013年5月21日 2:03
    2013年4月15日 8:58
  • フォーラム オペレーターの星 睦美です。

    同様の情報をお探しの方にもElanLilac さんとKozuka Daisuke さんの返信が参考になるのではないかと思います。今回は私のほうでスレッドに[回答としてマーク]させていただきました。

    それでは今後ともよろしくお願いします。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年5月21日 2:08