説明
Apsaradb for RDS SQL Serverでブロックの問題が発生しています。
原因
アプリケーションがテーブルやリソースを頻繁に読み書きすると、ブロックされる傾向があります。 ブロッキングの問題が深刻な場合、アプリケーション側のステートメントの実行が遅くなります。
解決策
トラブルシューティング
apsaradb For RDS SQL Serverのブロック問題については、以下にトラブルシューティングの提案を示します。
sys.sysprocessesを監視して、ブロッキング情報を取得します。 blocked列の値はblocking header session_idで、waitresourceはブロックされたセッションを待っているリソースです。 操作コードは次のとおりです。
while 1=1 始める ブロックされたsys.sysprocessesから * を選択 <>0; waitfor遅延 '00:00:01' 終了
説明ループギャップはカスタマイズできます。 ここでは、例として
00:00:01
です。次のコマンド出力が表示されます。
説明注: 図のフィールドの説明については、「sys.sysprocessesのドキュメント」をご参照ください。
sys.dm_tran_locks、sys.dm_os_waiting_tasksおよびその他のビューをサイクルモニタリングすると、ブロックグラフを取得できます。 Request_session_idはblocked session_idを示し、RequestingTextはblockedステートメントを示し、blocking_session_idはblocking session_idヘッダーを示し、BlockingTextはblockingヘッダーステートメントを示します。 操作コードは次のとおりです。
while 1=1 始める SELEC T db.name DBName、 tl.request_session_id、wt.blocking_session_id、OBJECT_NAME(p.OBJECT_ID) BlockedObjectName、 tl.resource_type, h1.TEXT AS RequestingText, h2.TEXT AS BlockingText、 tl.request_mode FROM sys.dm_tran_locks AS tl INNER JOIN sys. database_id db ON db.database_id = tl.resource_database_id INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1 CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2 waitfor遅延 '00:00:01' 終了
次のコマンド出力が表示されます。
説明DBName: データベースの名前。
request_session_id: ブロックされたセッションのID。
blocking_session_id: ブロックヘッダセッションのID。
BlockedObjectName: ブロックされたセッション操作のオブジェクト。
resource_type: 要求されたリソースのタイプ。
RequestingText: 現在のセッションで実行されたステートメント、つまりブロックされたステートメント。
BlockingText: セッションヘッダーによって実行されるステートメントをブロックします。
request_mode: 現在のセッションによって要求されたロックモード。
おすすめ
設定を最適化するには、次の手順に従います。
ブロッキングヘッド接続を閉じると、ブロッキングをすばやく軽減できます。
トランザクションが長期間送信されていないかどうかを確認し、時間内にトランザクションを送信します。
ロックがブロックに含まれており、ダーティな読み取りが許可されている場合は、クエリのヒントをnolockで使用して、クエリ文がロックを要求し、ブロックを回避できるようにします。たとえば、
select * from table with(nolock);
などです。アプリケーションロジックを確認して、リソースに順番にアクセスします。
適用範囲
ApsaraDB RDS for SQL Server