SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

最新イベントはこちら!

Data Tech 2024

2024年11月21日(木)オンライン開催

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けの講座「EnterpriseZine Academy」や、すべてのITパーソンに向けた「新エバンジェリスト養成講座」などの講座を企画しています。EnterpriseZine編集部ならではの切り口・企画・講師セレクトで、明日を担うIT人材の育成をミッションに展開しております。

お申し込み受付中!

EnterpriseZine(エンタープライズジン)

EnterpriseZine編集部が最旬ITトピックの深層に迫る。ここでしか読めない、エンタープライズITの最新トピックをお届けします。

『EnterpriseZine Press』

2024年秋号(EnterpriseZine Press 2024 Autumn)特集「生成AI時代に考える“真のDX人材育成”──『スキル策定』『実践』2つの観点で紐解く」

マイクロソフト古賀啓一郎の「今月のケースファイル」

めんどうくさいSQL Serverのデバッグ

005

そして再現へ

 エラーの発生条件がわかったところで、メモリダンプからエラーとなったクエリを抜き出して、手元で再現させてみることにしました。ここまでやる必要はなかったと思うのですが、なんとなくやってみたくなったのです。

 エラーとなったクエリを同時に2つのセッションから繰り返し実行していればいつかは現象が発生するだろうなと思いましたが、いつ発生するかもわからないエラーを待つのは面倒なので、参照カウンターがずれてしまう微妙なタイミングについてはデバッガで調整することにしました。イメージとしては、1つ目のセッションがあるコードポイントに到達したらいったん動作をフリーズさせて、もう一方のセッションをあるコードポイントまで実行させる。その後、フリーズさせておいたセッションをリジュームさせる… といった感じです。

 この手順であれば「まぁ、すぐに再現できるだろうな。」と軽く考えていたのですが、1つ目セッションをフリーズさせた後で、なぜか2つ目のセッションの動作が開始しません。デバッガコマンドの使い方が間違っているのかなぁと思ってヘルプを確認したのですが、手順は間違っていなさそうです。「うーん、困ったなぁ。」と思っていたところで、お昼休みになってしまい先輩達とランチに出かけました。

 お店に向かう道中、とある先輩*に「今こういうことやっていて、こういうことしたいんですけど、なんか期待通り動かなくて…」と相談してみました。すると「SQL Serverのスレッドスケジューリングってどんなだっけ?」と一言。私は、ハッとしました。

 *第1回に登場した先輩の中の一人です。どうでもいいことですが、これまで記事に登場した先輩たちは実はみんなSQL Serverのエンジニアじゃないというのがなかなかニクイところです。

 なぜ、2つ目のセッションは動作しなかったのでしょうか。答えは簡単です。SQL Serverはご存じの通り独自のスレッドスケジューリングを実装していますが、1目のセッションがアサインされたSQL Serverのスケジューラーと2つ目のセッションがアサインされたスケジューラーが同じスケジューラーだったのです。1つ目のセッションが動作している時に無理やりデバッガで停止させてしまうと、スケジューラーの使用権を保持したまま停止していることになります。2つ目のセッションは1つ目のセッションがスケジューラーの使用権を解放しないので動作できない状態にあったのです。デバッガからから見れば、2つ目のセッションに紐づくスレッドというのはいつでも動作できる状態なのですが。

 当時私が使用していたマシンは、CPUコアが2つだったのでSQL Serverのスケジューラーは2つでした。その為、かなりの確率で2つのセッションが同じスケジューラーにアサインされるのです。

 「いやー、これはめんどうくさいなぁ、どうしよう。」と思いました、今回は事例にヒットしたからいいものの、今後、未知の不具合で同じようなことを検証したいと思う時が来るかもしれません。

 でも、よくよく考えると、SQL Serverを開発している人たちも同じようにスケジューラーが少ないと検証に困るんじゃないかなと思いました。そこで、「きっとDBCCコマンドや起動時オプションでスケジューラーの数を調整できるようなものがあるはずだ。」と思い、ざっと調査してみることにしたのです。

 すると、期待した通りアンドキュメンテッドな起動時オプション-Pが見つかりました。-Pオプションを使用すると、スケジューラーの数を自由自在に調整できるのです。

図2 -Pオプションでスケジューラーの数をいっぱい増やしてみました。
▲ 図2 -Pオプションでスケジューラーの数をいっぱい増やしてみました。

 このオプションのおかげで、先の現象はスムーズに再現させることができました。最終的に、お客様には既知のバグなので最新のパッチを適用することで問題は解消する旨をお伝えし、この件はこれであっさりと終了です。

 今私がメインで使用しているマシンは4コアのハイパースレッディングで、SQL Serverのスケジューラーは8つありますから、もう-Pオプションは使用していません。手元で何かを検証する場合、8つスケジューラーがあれば大抵の場合かち合うことはないのです。

 いや、ほんと、大抵は大丈夫なのですけど、この間フリーズさせたスレッドと動かしたいスレッドが同じスケジューラーにアサインされてしまって期待通りに動かない現象に遭遇してしまいました。1分間くらい何が起きたのかがわからなくて「(自分に対して) すぐに気が付けよ。」と思ったのですが、同時に「そういえば、昔は-Pオプションなんてものを設定していたなぁ。」なぁんてことを思い出して、今回の記事に取り上げてみました。

 最後に、-PオプションはあくまでMicrosoftエンジニアの検証用オプションです!みなさんは絶対に使用しないように!

この記事は参考になりましたか?

  • Facebook
  • X
  • Pocket
  • note
マイクロソフト古賀啓一郎の「今月のケースファイル」連載記事一覧

もっと読む

この記事の著者

古賀 啓一郎(コガ ケイイチロウ)

日本マイクロソフト株式会社勤務。きままなエンジニア。
謎があると解決せずにはいられない性格。
週末は家事に従事。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

EnterpriseZine(エンタープライズジン)
https://enterprisezine.jp/article/detail/5702 2014/03/19 10:00

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

EnterpriseZine(エンタープライズジン)編集部では、情報システム担当、セキュリティ担当の方々向けに、EnterpriseZine Day、Security Online Day、DataTechという、3つのイベントを開催しております。それぞれ編集部独自の切り口で、業界トレンドや最新事例を網羅。最新の動向を知ることができる場として、好評を得ています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング