Non-yielding Scheduler については、本ブログでも次の内容で取り上げています。
- 調査のために意図的に Non-yielding scheduler の状態を作り出す
- SQL Server 2022 で Non-yielding Scheduler 発生時の出力内容が追加されていました
拡張イベントで Non-yielding の情報を取得したかったのでデバッガーを接続して操作するのが面倒だったので、Process Explorer を使用して発生させたというお話です。
Process Explorer を使用したスレッドの停止
今回は「scheduler_monitor_non_yielding_ring_buffer_recorded」と「sp_server_diagnostics_component_result」の拡張イベントを使用して情報の取得を行っています。
sp_server_diagnostics_component_result は SQLDIAG ログを取得するものとなり、取得方法については スタンドアロン環境の SQL Server インスタンスで診断ログ (SQLDIAG ログ) を取得する で投稿をしました。
これらの拡張イベントを取得するように設定しておくと、Non-yielding Scheduler が発生した場合にイベントの取得が行われます。
Non-yielding を発生させるには、SQL Server で実行中のスレッドの応答をなくすことで発生させることができます。
この挙動を発生させるために、Process Explorer を使用します。
Process Explorer で SQL Server のプロセス (sqlservr.exe) のプロパティを開いて、Threads タブで CPU 使用率の降順でソートしておきます。
この状態で CPU 使用率を上昇させるクエリを実行すると、実行したクエリで使用されているスレッドが CPU 使用率の上位に来ます。
この状態で該当のスレッドを選択して「Suspend」をクリックすることで、該当のクエリで使用されているスレッドの応答を停止させ Non-yielding の状態を発生させることができます。
拡張イベントでイベントが取得できたら「Resume」をクリックすることで、スレッドの応答を再開させることができます。
どのようなスレッドでも問題ないので Non-yielding Scheduler を発生させたい場合にはこのような方法が手軽かと思います。