1秒未満で発生するブロッキングの問題をトラブルシューティングしようとしています。 OLTPアプリケーションは非常に機密性が高く、合意されたSLAに従って、一部のトランザクションの応答時間が200ミリ秒未満である必要があります。新しいコードリリースでは、いくつかのロックエスカレーションの問題がありました。更新のバッチサイズを減らすことで解決します。バッチサイズが小さい場合でも、新しいspがOLTPトランザクションが更新しているのと同じ行をブロックしていると思われます。
ブロックされているセッションと、待機しているリソースを見つける必要があります。私の理解によると、「ブロックされたプロセスのしきい値」は最低1秒に設定できるため、これはブロッキングをキャプチャしません。
Wait_infoおよびwait_completed xイベントを実験しています。
これを追跡する方法は他にありますか?ありがとう
一般的な待機ではなくロックに特に関心があるので、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
それが文書化され、はるかに強力であるため、拡張イベントがとにかく明らかに好ましいので、私はこれをついでに述べます。
ロックに関心がある場合は、いくつかの拡張イベントを利用できます。
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秒未満のティックのロックは、私にとっては普通のことのようです。