Deskripsi masalah
Terjadi blocking pada instans ApsaraDB RDS for SQL Server.
Penyebab
Blocking terjadi ketika aplikasi sering membaca dari atau menulis ke tabel atau resource tertentu. Blocking yang parah memperlambat eksekusi statement di aplikasi Anda.
Pemecahan Masalah
Untuk memecahkan masalah blocking pada instans ApsaraDB RDS for SQL Server, ikuti langkah-langkah berikut.
-
Monitor secara terus-menerus
SYS.SYSPROCESSESuntuk mengumpulkan informasi blocking. Jalankan perintah berikut:WHILE 1 = 1 BEGIN SELECT * FROM SYS.SYSPROCESSES WHERE BLOCKED <> 0; WAITFOR DELAY '00:00:01'; END;CatatanAnda dapat menyesuaikan interval polling. Contoh ini menggunakan
00:00:01.Hasil kueri menunjukkan bahwa
spid=56diblokir olehspid=53(blocked=53), sedang menunggu kunci tipeLCK_M_S, dengan sumber daya tunggunya berupaKEY: 5:72057594038845440 (98ec012aa510). Selama beberapa siklus kueri, nilaiwaittimemeningkat secara berurutan (9.205, 10.206, 11.207, 12.208, dan 13.209), yang mengindikasikan bahwa kunci tersebut belum dirilis.CatatanKolom
blockedmenampilkansession_iddari session yang menyebabkan blocking, sedangkan kolomwaitresourcemengidentifikasi resource yang sedang ditunggu oleh session yang diblokir. Untuk informasi lebih lanjut tentang field yang dikembalikan, lihat dokumentasi resmi sys.sysprocesses. -
Monitor secara terus-menerus view seperti
sys.dm_tran_locksdansys.dm_os_waiting_tasksuntuk mengidentifikasi rantai blocking lengkap. Jalankan perintah berikut:WHILE 1 = 1 Begin SELECT 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.databases 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 DELAY '00:00:01'; END;Contoh hasil kueri: Di database
jacky, session denganrequest_session_id62 diblokir oleh session denganblocking_session_id56. Objek yang diblokir adalahTbl1, tipe resource-nya adalahKEY, statement yang diminta (RequestingText) adalah(@1 int,@2 int)INSERT INTO [dbo].[Tbl2]([id],[c..., statement yang menyebabkan blocking (BlockingText) adalahBEGIN TRAN INSERT into dbo.Tbl1 (id, col) VALUE..., dan mode lock yang diminta adalahS.Tabel berikut menjelaskan parameter yang dikembalikan:
Parameter
Deskripsi
DBNameNama database.
request_session_idID session yang diblokir (requesting).
blocking_session_idID sesi pemblokiran.
BlockedObjectNameObjek yang coba diakses oleh session yang diblokir.
resource_typeJenis resource yang sedang ditunggu.
RequestingTextStatement yang dieksekusi oleh session yang diblokir (requesting).
BlockingTextStatement yang sedang dieksekusi oleh session yang menyebabkan blocking.
request_modeMode lock yang diminta oleh session requesting.
Rekomendasi Penyetelan
Ikuti rekomendasi berikut untuk meningkatkan performa.
-
Untuk segera menyelesaikan blocking, tutup koneksi session yang menyebabkan blocking.
-
Identifikasi dan segera commit transaksi jangka panjang yang belum dikomit.
-
Jika blocking disebabkan oleh shared (S) lock dan aplikasi Anda dapat menerima dirty read, gunakan petunjuk kueri
WITH (NOLOCK). Sebagai contoh, Anda dapat menulisSELECT * FROM table WITH (NOLOCK);untuk mencegah kueri meminta lock, sehingga menghindari blocking. -
Tinjau logika aplikasi Anda untuk memastikan resource diakses dalam urutan yang konsisten.
Operasi Terkait
-
Untuk menyelesaikan blocking dalam keadaan darurat, lihat Cara cepat menyelesaikan masalah blocking di ApsaraDB RDS for SQL Server.
-
Gunakan Konsol ApsaraDB RDS untuk mengonfigurasi metrik performa dan aturan alert guna mendeteksi serta merespons masalah performa database secara cepat. Untuk informasi selengkapnya, lihat Monitoring dan alert.
-
Untuk mempelajari lebih lanjut strategi penyetelan performa database, seperti optimasi indeks, optimasi kueri, dan optimasi penyimpanan, lihat Optimasi dan diagnosis performa.