SPID Status (runnable, sleeping, suspended, running ve background ) Ne Anlama Geliyor?
SQL Server’da en çok görülen SPID durumlarından bazılarını inceleyeceğiz. Bunlar ne anlama geliyor gördüğümüz zaman nasıl bir aksiyon alabiliriz öğrenelim.
RUNNING: Bu durum, oturumun bir veya daha fazla toplu iş çalıştırdığı anlamına gelir. Multiple Active Result Sets (MARS) etkinleştirildiğinde, bir oturum birden çok toplu iş çalıştırabilir. Bunun anlamı, bu oturumu kullanarak SQL Server’a bağlanan istemci, SQL Server’ın işlemesi için zaten bir sorgu gönderdi ve SQL Server şu anda sorguyu işliyor. Sorgu, bir ayrıştırıcı ağacı oluşturmak ve verileri sıralamak için bir birleştirme gerçekleştirmek arasında herhangi bir yerde olabilir. Şu anda CPU (İşlemci) döngülerini tüketiyor anlamına da gelir.
SUSPENDED: Bu, bir kaynak üzerinde beklediği için isteğin şu anda etkin olmadığı anlamına gelir. Kaynak, bir sayfa okumak için bir I/O olabilir, A WAIT ağda iletişim olabilir veya lock veya latch(bkz:http://www.sqlekibi.com/sql-server/sql-serverda-latch-nedir.html/ ) bekliyor olabilir. Beklediği görev tamamlandığında aktif hale gelecektir. Örneğin, sorgu, bir Ogrenci tablosunun verilerini okumak için bir I/O isteği gönderdiyse, bu görev I/O tamamlanana kadar askıya alınacaktır. I/O tamamlandığında (Ogrenci tablosu için veriler bellekte mevcuttur), sorgu RUNNABLE kuyruğuna taşınır. Bu durumu, CPU sorunları üzerinde I/O işleminin tamamlanmasıyla daha sık görülür.
RUNNABLE: Yani sorgu çalışmaya hazır, ancak CPU kaynakları henüz mevcut değil. Çalıştırılabilir Kuyrukta bir CPU’nun açılmasını bekliyor anlamına gelir.
Bekleyen iş parçacığının sinyallendiği zaman ile çalışmaya başladığı zaman arasındaki farkı bulmak için
SELECT wait_type,waiting_tasks_count,signal_wait_time_ms
FROM sys.dm_os_wait_stats
ORDER BY signal_wait_time_ms DESC
sorgusunu kullanabilirsiniz. Bu fark, RUNNABLE kuyruğunda geçirilen süredir. Listenin başındaki bazı beklemeler güvenle göz ardı edilebilir.
PENDING: Bu durum, bir çalışanın onu almasını bekliyor.Bu, isteğin çalışmaya hazır olduğu, ancak istekleri CPU’da yürütmek için kullanılabilir çalışan iş parçacığı olmadığı anlamına gelir. Bu, ‘Max’i artırmanız gerektiği anlamına gelmez. Çalışan iş parçacıkları”, şu anda yürütülen iş parçacıklarının ne yaptığını ve neden geri dönmediklerini kontrol etmelisiniz. Kişisel olarak, “Scheduler deadlock” ve “Non-yielding Scheduler” ile sonuçlanan sorunlarda PENDING durumunda olan daha fazla SPID olarak görülmüştür.
BACKGROUND: Oturum, kilitlenme algılama gibi bir arka plan görevi çalıştırıyor.
SLEEPING: Bu durumdaki oturum aslında hiçbir şey yapmıyor. Bu durumu genellikle threadlerle ilgili tüm görevler tamamlandığında ancak bağlantı hala açıkken görülüyor. (SQL Server Management Studio’da yeni bir bağlantı açabilir ve orada hiçbir şey çalıştırmayın. Ardından, SPID’nin durumunu kontrol edin ve durumun Sleeping olduğunu fark edeceksiniz).
SPID durumunu kontrol etmek için aşağıdaki scripti çalıştırabilirsiniz.
SELECT * FROM sys.dm_exec_sessions;
ROLLBACK: Oturumda bir işlem geri alma işlemi devam ediyor.
SPINLOOP : Oturumun görevi, bir spinlockun serbest kalmasını beklemektir.
DORMANT: SQL Server oturumu sıfırlıyor.
Birkaç soru ile durumları arası geçişleri değerlendirelim.
1)RUNNING durumu neden SUSPENDED durumuna geçiyor?
Cevap: İş parçacığı yürütülüyor ve bir kaynak bekliyorsa bekleme listesine Suspend olarak taşınır
2) SUSPENDED durumda neden RUNNABLE durumuna geçiyor?
Cevap: Kaynak artık kullanılabilir durumdadır ve RUNNABLE kuyruğunun en altına taşınır.
3)RUNNABLE durumu neden RUNNING’e geçiş yapıyor?
Cevap: RUNNABLE kuyruğunun başındaki spid, işlemciye taşınır.
Referanslar
https://www.sqlserver-dba.com/2014/05/sql-server-runnable-suspended-running-status-model.html