Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 2617|Yanıt: 2

[İpucu] SQL Server, deadlock sorunlarını takip etmek için genişletilmiş olaylar kullanır

[Bağlantıyı kopyala]
Yayınlandı 2.03.2024 19:13:04 | | | |
Gereksinimler: SQL Server veritabanının çıkmazlara neden olmasının birçok nedeni vardır; üretimde herkes çıkmaz kilitleriyle karşılaşabilir ve spesifik neden sadece uygulama çıkmazlarının anormal bilgilerine dayanarak bulunmayabilir; bu nedenle SQL Server'da çıkmaz kilitlerini takip etmek ve çıkmazların ne zaman oluştuğuna dair özel detayları kaydetmek için eklenti olaylarını kullanmak gereklidir.

Genişletilmiş etkinlik genel görünümü

Genişletilmiş Olaylar, kullanıcıların sorunları izlemek ve çözmek için ihtiyaç duydukları verileri toplamalarını sağlayan hafif bir performans izleme özelliğidir. Bu özellik, performans izleme ve problem çözme amaçlı veri motorunun iç operasyonlarıyla ilgili detayları görüntülemenizi sağlar.

Genişletilmiş Olaylar (XEvents) mimarisi ile kullanıcılar, SQL Server, Azure SQL Veritabanı ve Azure SQL Yönetilen Instance'ın performansını izlemek, tanımlamak veya sorun gidermek için ihtiyaç duydukları kadar veya en az veriyi kullanabilirler. Genişletilmiş etkinlikler oldukça yapılandırılabilir, hafif ve iyi ölçeklenebilir.

Referans:
Bağlantı girişi görünür.
Bağlantı girişi görünür.


Çıkmazların nedenleri

Çıkmazlar, genellikle çok adımlı işlemlerde veritabanında rekabet eden eşzamanlılık kilitlerinden kaynaklanır. Her kullanıcı oturumu kendi adına bir veya daha fazla görev çalışabilir; her görev çeşitli kaynakları getirebilir veya bekleyebilir. Aşağıdaki kaynak türleri bloklamaya ve sonunda çıkmaza yol açabilir.

  • Kilitler: Nesneler, sayfalar, satırlar, meta veriler ve uygulamalar gibi kaynakları almak için bekleyen kilitler çıkmazlara neden olabilir. Örneğin, işlem T1'in r1 satırında paylaşılan bir kilidi (S kilidi) vardır ve sıra r2 için özel bir kilit (X kilidi) elde edilmek üzere bekler. İşlem T2, r2 satırında paylaşılan bir kilit (S kilidi) içerir ve r1 satırında özel bir kilit (X kilidi) almak için bekler. Bu, T1 ve T2'nin birbirlerinin kilitli kaynağı serbest bırakmasını beklediği bir kilit döngüsü oluşturur.
  • İşçi iş akışları: Mevcut işçi iş parçacıkları için görev sırasına girmesi çıkmazlara yol açabilir. Kuyruktaki bir görevin tüm işçi iş parçacıklarını engelleyen bir kaynağı varsa, bu çıkmaza yol açar. Örneğin, oturum S1 bir işlem başlatıp hat r1 için paylaşılan bir kilit (S-kilidi) edindikten sonra uyku rejimine geçer. Tüm mevcut işçi iş parçacıklarında çalışan aktif bir oturum, r1 satırı için özel bir kilit (X-kilidi) elde etmeye çalışır. Oturum S1 işçi iş parçacığını alamadığı için, işlemi bağlayıp R1 satırındaki kilidi serbest bırakamaz. Bu durum çıkmaza yol açacaktır.
  • Bellek: Eşzamanlı bir istek bellek kazanmak için beklediğinde ve mevcut bellek ihtiyaçları karşılamadığında çıkmaz bir durum oluşabilir. Örneğin, iki eşzamanlı sorgu (Q1 ve Q2) kullanıcı tanımlı fonksiyonlar olarak çalıştırılır ve sırasıyla 10 MB ve 20 MB bellek elde edilir. Her sorgu 30 MB gerektiriyorsa ve toplam kullanılabilir bellek 20 MB ise, Q1 ve Q2 birbirlerinin belleği boşaltmasını beklemek zorundadır ve bu da çıkmaza yol açar.
  • Paralel sorgulama ve yürütme ile ilgili kaynaklar: İşleme koordinatörleri, jeneratörler veya tüketici iş parçacıkları, genellikle anahtarlanan portlarla ilişkilendirilen en az bir süreç içerdiğinde birbirlerini engelleyebilir ve bu da çıkmazlara yol açabilir. Ayrıca, paralel bir sorgu yürütmeye başladığında, SQL Server mevcut iş yüküne göre paralellik derecesini veya işçi iş parçacığı sayısını belirler. Sistem iş yükünde beklenmedik bir değişiklik olursa, örneğin sunucuda yeni bir sorgu çalışmaya başladığında veya sistemde işçi iş parçacıkları bittiğinde çıkmaz oluşabilir.
  • Çoklu Etkinlik Sonuç Seti (MARS) kaynakları: Bu kaynaklar, MARS altında birden fazla etkinlik isteğinin çapraz yürütülmesini kontrol etmek için kullanılır.


Referans:
Bağlantı girişi görünür.

Deadlock genişletilmiş olay kaydı

Deadlock bilgisini kaydetmek için aşağıdaki komutla bir uzantı olayı oluşturun:


Bir çıkmaz etkinlik oturumu başlatın

Bir etkinlik oturumunu durdurun

Bir olay oturumunu sil

Olay oturumu verilerini sorgulama


Test çıkmazları

Test için yeni bir Tab1 tablosu oluşturun, iki yeni yürütme penceresi oluşturun ve sırasıyla aşağıdaki komutları çalıştırın:

Bir çıkmaz şu şekilde gerçekleşir:

Başka bir süreçle yapılan bir işlem (süreç kimliği 68) kilitli bir kaynakta kilitlenmiş durumdadır ve çıkmaz mağduru olarak seçilmiştir. Lütfen işlemi tekrar başlatın.
İşlem (Süreç Kimliği 68) başka bir süreçle kilitlenme kaynaklarında kilitlendi ve çıkmaz kurbanı olarak seçildi. İşlemi tekrar başlat.


Aşağıdaki şekilde gösterildiği gibi etkinlik oturumu verilerini görüntüleyin:



Detaylı XML verileri aşağıdaki gibidir:


(Son)





Önceki:PLINQ paralel sorgu kullanarak .NET/C# performans optimizasyonu
Önümüzdeki:Visual Studio'da C# Etkileşimli pencere kullanılarak kod çalıştırma
 Ev sahibi| Yayınlandı 2.03.2024 19:14:35 |
Olay dosyasının varsayılan yolunu genişletin:

C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\deadlock_monitor_0_133538477770860000.xel
 Ev sahibi| Yayınlandı 2.03.2024 19:16:54 |
SQL script'i test etmek için yeni bir tab1 tablosu oluşturun

Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com