19 Mart 2014 Çarşamba

IO sorunu yaşanan mantıksal ve fiziksel veritabanı kaynağını bulma

İlginç bir başlık, değil mi?

Anlık olarak çalışan işlemleri görmek isteriz, özellikle de sorun yaşanıyorken. Bu gibi durumlarda sys.dm_exec_request DMV'sini de kullanabilirsiniz, sys.sysprocesses Catalog View'ünü de.

SELECT * FROM sys.dm_exec_requests WHERE session_id>50

veya

SELECT * FROM sys.sysprocesses WHERE spid>50 and status<>'sleeping'

kullanarak o anda çalışıyor olan işlemlere ait ayrıntıları görebiliriz. Örneğin bir tablonuz var diyelim ve bu tablo büyük bir tablo ve çok önemli bir Index'i eksik olduğu için SELECT ile veri okunurken bu tabloda çok PAGEIOLATCH_SH beklemesi yaşanıyor diyelim. Bu iki sorguyu da kullanarak, o anda  IO kaynağı yüzünden beklenen bu nesneye ait ayrıntıları bulabilirsiniz. Bu nesnenin, yani tablonun ID'sini, dolayısıyla adını ve sıkıntının hangi kayıtlarda yaşandığını, File ve Page ID'lerinden bulabilirsiniz.

Size örnek bir IO beklemesini yakalamak için bir SQL Server Instance'ında aşağıdaki gibi bir kod çalıştırdım:

SELECT * FROM sys.dm_exec_requests WHERE session_id>50 AND wait_type LIKE 'PAGE%'

Bu sorgu bana aşağıdaki sonucu verdi. Benzer bir komutu sys.sysprocesses kullanarak da yazıp çalıştırabilirdim, yine bana wait_resource alanındaki sonucun aynısını verirdi. Özellikle SQL Server 2000 ve altı versiyonlar için, DMV'ler SQL Server 2005 ve sonrasında geldiğinden, sys.sysprocesses'i kullanmanız gerekecek.


Buradaki wait_time değerinin küçüklüğüne bakmayın lütfen, dediğim gibi sadece örnek olsun diye gösteriyorum, bir sorun anında bu süre çok daha uzun olacaktır.

PAGEIOLATCH_SH, özet olarak bize sorgulanan kaydın içinde bulunduğu Page'in o anda RAM'de olmadığını, diskten okunup RAM'e aktarılıyor olduğunu söyler. Tabii ki bu anda ilgili SPID de Waiter List'te Suspended olarak diskten okuma işlemin yapılmasını bekliyordur. Diskten okuma işlemi yapıldıktan sonra CPU kaynağından 4ms'lik Quantum'unu kullanabilmek için Runnable Queue'da sıraya geçecek ve daha sonra da Running olacaktır, daha da merak edenler için, eğer 4ms'lik CPU kaynağı yetmezse ve başka bir IO vb kaynağa ihtiyacı yoksa, o zaman tekrar Runnable Queue'a geçecek ve Runnable durumda CPU kullanımı için sırasını bekleyecektir, eğer IO vb. başka bir kaynağa ihtiyacı varsa da o zaman tekrar Waiter List'e geçecek ve Suspended durumda o kaynağı kullanacak ve akabinde tekrar Runnable Queue'ya geçecektir. Eğlenceli, değil mi?

Burada odaklanmanızı istediğim şey, wait_resource alanındaki değer. Burada gördüğünüz 11:5:15921857 değerini tek tek açıklayayım.

11, veritabanının ID'sidir, aşağıdaki gibi bir sorgu ile veritabanının ID'sinden adını bulabilirsiniz:

SELECT DB_NAME(11)

5, Veritabanının dosyasının ID'sidir, yani File ID. Aşağıdaki sorgu ile dosya ID'sinin hangi diskteki dosyaya ait olduğunu bulabilirsiniz.

SELECT * FROM sys.sysfiles WHERE fileid = 5

15921857, 11 ID'li veritabanının 5 ID'li dosyasında bulunan ve işlem yapmak için diskten RAM'e aktarılmasını beklediğimiz Page'in ID'sidir.

DBCC PAGE komutu, Microsoft tarafından resmen dokümante edilmemiş, fakat çok eskiden beri SQL Server'da bulunan ve kullanılan bir komuttur. Bu komutu kullanabilmek için öncelikle işlem yapacağınız oturumda 3604 numaralı Trace Flag'i etkinleştirmelisiniz, aşağıdaki gibi:

DBCC TRACEON(3604)

Daha sonra DBCC PAGE komutu ile ilgili sayfaya ait ayrıntılara ulaşabilirsiniz:

DBCC PAGE(11, 5, 15921857, 3)

Bu komutu çalıştırdıktan sonra karşınıza aşağıdaki ayrıntılar gelecek:


Metadata: ObjectId bölümünde, okuma işleminin yapıldığı mantıksal alan olan ilgili tablonun ID'sini görebilirsiniz. Bu tablonun adını da ilgili veritabanının içinde aşağıdaki komut ile bulabilirsiniz:

SELECT OBJECT_NAME(1777701681, 11)

Bu örnekte 1777701681 nesnemizin ID'si, 11 ise hatırlarsanız veritabanımızın ID'sidir.

DBCC PAGE komutu her ne kadar dokümante edilmemiş bir komut olsa da, gerek Microsoft'ta çalışmış veya çalışıyor olan kişilerce, gerekse diğer bazı araştırmacı arkadaşlarca kendisi hakkında bayağı yazılıp çizilmiştir. Eğer ilginizi çektiyse bu komut hakkında aşağıdaki 2 sayfadan daha fazla bilgi edinebilirsiniz:

http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/06/10/625659.aspx
http://support.microsoft.com/kb/83065/en-us

DBCC PAGE komutunu çalıştırabilmeniz için System Administrator (sysadmin) yetkisine sahip olmanız gerektiğini de hatırlatmalıyım.

Ekrem Önsoy

Hiç yorum yok: