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


14

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

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

wait_infoイベントとwait_completed xイベントを試しています。

これを追跡できる他の方法はありますか。ありがとう


同じユーザーによる同じ質問:stackoverflow.com/questions/38407021/…–
TheGameiswar

回答:


10

一般的な待機ではなくロックに特に関心があるため、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

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

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

文書化されており、はるかに強力であるため、とにかく拡張イベントが明らかに好ましいため、これを渡す際に言及します。


locks_lock_waitsをテストしましたが、あなたが言ったようにリソース情報がありません。しかし、増分が時間であることを知りませんでした。良い情報dbccロック、見栄えがいい。情報がエラーログにダンプされる前に、その情報がどのくらいの期間利用可能かを知っていますか。
jesijesi

申し訳ありませんが、私は自分自身を明確にしませんでした。私は、dbcc lockコマンドを実行するまでの時間を尋ねました。たとえば、ロックが発生し、1時間後にdbcc lockを実行しても、情報は取得できますか?
jesijesi

@jesijesi-今日まで聞いたことがない。これ以上情報はありません。私はそれを無効にするために渡すパラメータさえ知りません。しかし、あなたは走るdbcc lock(StallReportThreshold, 200) 最初に、トレースフラグ3605が有効になっている限り、しきい値を超えると情報を出力します。後で実行する場合に備えて、SQL Serverはこの情報を収集しません。
マーティンスミス

2
ありがとう。xeventsのresource_0,1,2値を変換する便利な機能を備えたリンクを追加するだけです。sqlnotes.info/2011/10/24/…
jesijesi

5

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

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秒以上にわたって刻々と過ぎていくのは、私にとっては普通のことです。


1
他の誰かがリソースへのアクセスを拒否されるとすぐにロックがブロックされ、ロックのために待機する必要があります。
マーティンスミス

おかげで、期間フィールドでlock_acquiredを使用する予定です。
jesijesi

幸運を。SQL Server 2014を使用している場合、ネイティブにコンパイルされたストアドプロシージャでインメモリOLTPテーブルを使用すると、高性能なラッチフリーオプションが提供されます。スナップショットの分離も確認できます。
wBob
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.