none
クエリの並列実行に必要なスレッド リソースを開始できませんでした。 RRS feed

  • 質問

  • 以下の環境および処理にて、以下のエラーが発生しています。
    エラーコード 8642
    レベル 17
    クエリ プロセッサは、クエリの並列実行に必要なスレッド リソースを開始できませんでした。

    環境
    Windows Server 2008(32bit)
    SQLServer 2008 R2
    物理メモリ4G

    処理
    Javaプログラムが100本並列で起動し、それぞれがコネクションを取得して、
    100レコード位にINSERT、DELETE、UPDATEを毎時間実施します。
    発生頻度は1週間に数回です。

    SQLServerはデフォルト設定です。
    原因調査のポイント、解決案などありましたら
    アドバイスをお願いします。

    • 移動 三沢健二Moderator 2011年7月14日 6:22 適切なカテゴリと判断したため (移動元:Windows Server 2008 R2 全般)
    2011年7月13日 17:54

回答

  • こんにちは。

    エラー内容の通りですね。
    公式にも「サーバーの負荷を軽減してからクエリを再実行します。」と書かれています。

    ■MSSQLSERVER_8642
    http://msdn.microsoft.com/ja-jp/library/aa337448(v=SQL.105).aspx
    • 回答の候補に設定 山本春海 2011年8月2日 7:39
    • 回答としてマーク 山本春海 2011年8月19日 6:45
    2011年7月14日 7:22
  • スレッドのリソースが足りない(枯渇)って事に着目して調査されては?(そういうキーワードで調べられては?)

    スレッドそのままではないですが、ハンドルという単位でトラブルシュートする時の追い方で以下のようなURLを参考にしてみてはいかがでしょうか。

    http://keicode.com/iis/iis504.php

     

    同様にスレッドカウントはWindowsのパフォーマンスモニタで確認できます。

     

    システム動作当初から比べて、リークしている値がないでしょうか?
    枯渇した状態で一度カウンタを一通り採取して、Javaのプログラムを再起動した時に、カウンタがリセットされ、
    また、徐々に増えている値があれば、それが問題なのかと。

    リークしている時に該当のエラーが出ていれば、なお証明になります。

    • 回答の候補に設定 山本春海 2011年8月2日 7:39
    • 回答としてマーク 山本春海 2011年8月19日 6:45
    2011年7月17日 4:53
  • OSの情報を調べているようですし、daisukyさんの提示されたURLも同じくOSから全体を調査するようになってしまいます。

    しかし、SQL Serverは自身でもリソース管理していて、Managemant Studioの利用状況モニタからそれを確認することができます。

    利用状況モニタを使用して、Javaプログラムが想定外の動作をしていないかを確認するべきです。例えば、100本並列で起動と書かれていますが、その100本がそれぞれ100コネクションSQL Serverと接続していたりとか、異様にコストのかかるクエリを乱発しているとか。 

    • 回答の候補に設定 山本春海 2011年8月2日 7:39
    • 回答としてマーク 山本春海 2011年8月19日 6:45
    2011年7月17日 12:04

すべての返信

  • こんにちは。

    エラー内容の通りですね。
    公式にも「サーバーの負荷を軽減してからクエリを再実行します。」と書かれています。

    ■MSSQLSERVER_8642
    http://msdn.microsoft.com/ja-jp/library/aa337448(v=SQL.105).aspx
    • 回答の候補に設定 山本春海 2011年8月2日 7:39
    • 回答としてマーク 山本春海 2011年8月19日 6:45
    2011年7月14日 7:22
  • コメントありがとうございます。

    サーバーの運用中は、CPU使用率がかなり高い数値で推移しておりますが、

    物理メモリの空き容量はまだ余地があります。

    OSのパフォーマンスモニタにて、発生当時のProcesserやMemory、

    SQLServerのMemory ManagerやBuffer Manegerなどの情報を持っています。

    今後の進め方として、処理そのものの稼働を抑えるという判断の前に、

    CPUやメモリの増強、あるいはSQLServerのパラメータ調整の余地があるかなど、

    パフォーマンスモニタの値から、判断材料となるものはありますでしょうか?

     

    2011年7月14日 18:07
  • スレッドのリソースが足りない(枯渇)って事に着目して調査されては?(そういうキーワードで調べられては?)

    スレッドそのままではないですが、ハンドルという単位でトラブルシュートする時の追い方で以下のようなURLを参考にしてみてはいかがでしょうか。

    http://keicode.com/iis/iis504.php

     

    同様にスレッドカウントはWindowsのパフォーマンスモニタで確認できます。

     

    システム動作当初から比べて、リークしている値がないでしょうか?
    枯渇した状態で一度カウンタを一通り採取して、Javaのプログラムを再起動した時に、カウンタがリセットされ、
    また、徐々に増えている値があれば、それが問題なのかと。

    リークしている時に該当のエラーが出ていれば、なお証明になります。

    • 回答の候補に設定 山本春海 2011年8月2日 7:39
    • 回答としてマーク 山本春海 2011年8月19日 6:45
    2011年7月17日 4:53
  • OSの情報を調べているようですし、daisukyさんの提示されたURLも同じくOSから全体を調査するようになってしまいます。

    しかし、SQL Serverは自身でもリソース管理していて、Managemant Studioの利用状況モニタからそれを確認することができます。

    利用状況モニタを使用して、Javaプログラムが想定外の動作をしていないかを確認するべきです。例えば、100本並列で起動と書かれていますが、その100本がそれぞれ100コネクションSQL Serverと接続していたりとか、異様にコストのかかるクエリを乱発しているとか。 

    • 回答の候補に設定 山本春海 2011年8月2日 7:39
    • 回答としてマーク 山本春海 2011年8月19日 6:45
    2011年7月17日 12:04
  • 皆様、コメントありがとうございます。

    100本並列で動いているうえ、それぞれが100レコード位を更新しており、
    実行されるクエリで改善点があるかも合わせて調べてみます。

    まだ調べていない方法を教えていただけたので引き続き調査を進めます。
    他にも有力な情報やキーワードがありましたらよろしくお願いします。

    2011年7月17日 13:55