web-dev-qa-db-ja.com

1秒未満で発生するブロッキングを追跡する方法-SQL Server

1秒未満で発生するブロッキングの問題をトラブルシューティングしようとしています。 OLTPアプリケーションは非常に機密性が高く、合意されたSLAに従って、一部のトランザクションの応答時間が200ミリ秒未満である必要があります。新しいコードリリースでは、いくつかのロックエスカレーションの問題がありました。更新のバッチサイズを減らすことで解決します。バッチサイズが小さい場合でも、新しいspがOLTPトランザクションが更新しているのと同じ行をブロックしていると思われます。

ブロックされているセッションと、待機しているリソースを見つける必要があります。私の理解によると、「ブロックされたプロセスのしきい値」は最低1秒に設定できるため、これはブロッキングをキャプチャしません。

Wait_infoおよびwait_completed xイベントを実験しています。

これを追跡する方法は他にありますか?ありがとう

14
jesijesi

一般的な待機ではなくロックに特に関心があるので、locks_lock_waits拡張イベントはより適切に聞こえます。

increment >= 200

CREATE EVENT SESSION [locks_lock_waits] ON SERVER 
ADD EVENT sqlserver.locks_lock_waits(
        ACTION(sqlserver.sql_text)
            WHERE  ( [sqlserver].[is_system] = 0
                     AND [increment] >= 200
                     AND [counter] <= 1000 ) 
    )
ADD TARGET package0.ring_buffer;

GO

ALTER EVENT SESSION [locks_lock_waits]  
ON SERVER  STATE = start;  

上記は、一定の時間ロックを待機しているステートメントを収集しますが、特定のロックリソースを提供しません。

私はこのイベントを使用したことがなく、このセッションが運用サーバーでどれほどのオーバーヘッドを引き起こすかについての洞察はありません。

トピックに このビデオ が見つかりました。収集されたイベントの数を減らすためにcounterでフィルタリングすることを強くお勧めします。私は上記でそうしました。

文書化されていない古いレガシーコマンドについても触れています

dbcc lock(StallReportThreshold, 200) -- 200 is threshold in ms

どれが(トレースフラグ3605が有効になっている場合)、以下のような限られた情報をSQL Serverエラーログにダンプします。

プロセス53はRIDのSロックを6844ミリ秒待機しました:2:1:120:2結果:OKWAIT

それが文書化され、はるかに強力であるため、拡張イベントがとにかく明らかに好ましいので、私はこれをついでに述べます。

10
Martin Smith

ロックに関心がある場合は、いくつかの拡張イベントを利用できます。

lock_acquired
lock_released
lock_escalation

最初の2つのイベントにはduration列(マイクロ秒)があり、しきい値をフィルターに掛けることができます。また、resource_descriptionアクションは、関連するリソースの詳細を提供します。

lock_escalationイベントにもstatementアクションがあり、ロックのエスカレーションをトリガーしたT-SQLステートメントを収集するために追加できます。また、escalation_cause。以下はサンプルセッションです。

CREATE EVENT SESSION [locking] ON SERVER 
ADD EVENT sqlserver.lock_acquired( SET collect_resource_description = (1) ),
ADD EVENT sqlserver.lock_escalation( SET collect_statement = (1) ),
ADD EVENT sqlserver.lock_released( SET collect_resource_description = (1) )
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

ブロックされたプロセスレポートのしきい値を1秒未満に設定できない理由はおそらくあると思います。ロックはRDBMSでは完全に正常です。データベースエンジンは、リソースを保護するためにリソースをロックする必要があります。いつロックがブロックになるかについての公式の定義はありませんが、1秒未満のティックのロックは、私にとっては普通のことのようです。

5
wBob