Bekleme süreleri saat süresinden nasıl daha yüksek olabilir?


15

Sp_BlitzFirst ile beklerken, şu ayrıntıyı elde ederim:

<?ClickToSeeDetails -- 
For 20 seconds over the last 5 seconds, SQL Server was waiting on this 
particular bottleneck.


 -- ?>

Bu "son 5 saniye içinde 20 kez mi?" Bulma CLR_SEMAPHORE idi.

Yanıtlar:


24

Bekleme yok istatistikleri, sunucunun kendisi için harcanan fiziksel süreden daha fazlasını toplayabilir (ve daha sık olmamakla birlikte).

2 ayrı iş parçacığının aynı saniyeyi bir kaynak için beklediği bir durum düşünün - 1 saniyelik saat için 2 saniye bekleme süreniz olacaktır.

Her iş parçacığının kendi beklemeleri vardır - ileti, söz konusu kaynak için 20 saniyelik bekleme süresinin, saatin son 5 saniyesinde gerçekleştiğini bildirir.

Ya da başka bir deyişle, her çekirdek aynı anda birden çok sorgu çalıştırabilir ve birden fazla çekirdek daha fazla beklemeye kadar ekleyebilir. Yani ünite saniyeler içinde değil, gerçekten iş parçacığıdır · saniye.


8

Bir örnek üzerinde çalışmak da yararlı olabilir. Bir işçi için en yaygın üç durumu düşünün :

ÇALIŞIYOR = İşçi şu anda ya önleyici olmayan ya da önleyici olarak çalışıyor.

RUNNABLE = İşçi zamanlayıcıda çalışmaya hazır.

SUSPENDED = İşçi şu anda askıya alındı ​​ve bir olayın sinyal göndermesini bekliyor.

Durumu olan işçiler RUNNINGbekleme süresi oluşturabilir. Örneğin, işçinin SQLOS yerine işletim sisteminde kod çalıştırması gerekiyorsa, önleyici veya harici bir bekleme girebilir. Bu süre zarfında ilişkili CPU'sunda kod çalıştıracak, ancak yine de bekleme süresi oluşturacaktır.

Durumu olan işçiler RUNNABLE(her zaman yaptıkları bildiğim kadarıyla) bekleme süresi oluşturabilirler. İşçiye bir kaynağın mevcut olduğu bildirildiyse, son beklemeye bağlı olarak sinyal bekleme süresi biriktirebilir. İşçi önceki 4 ms'lik kuantumunu tükettiğinde, SOS_SCHEDULER_YIELDbekleme süresini biriktirebilir .

Durumu olan işçiler SUSPENDEDbekleme süresi oluşturabilir. Bir kilit bekleyen bir işçi düşünün. İhtiyaç duyduğu kilit kaynağının mevcut olduğunu belirtene kadar bekleme süresi oluşturur. Bazı askıya alınmış işçiler, bir görevle ilişkili olmayanlar da dahil olmak üzere bekleme süresi oluşturmaz.

Masaüstümde dört mantıksal çekirdek var, bu nedenle varsayılan maksimum işçi sayısı 512'dir . Neredeyse kesinlikle pratik değildir, ancak bu makinede teorik olarak her işçiyi aynı anda bir şey bekletmeyi başarırsam saniyede 512 saniye bekleme süresi üretebilirim. Çekirdek / işçi sayısı arttıkça bu sayı daha da artabilir.

SQL Server'a karşı herhangi bir sorgu çalıştırmasanız bile saniyede bir saniyeden fazla bekleme görebilirsiniz. Makinemde, aşağıdaki sorgu 9-14 satır üretiyor gibi görünüyor:

SELECT [state], last_wait_type, wait_started_ms_ticks
FROM sys.dm_os_workers
WHERE [state] IN ('SUSPENDED', 'RUNNABLE')
AND task_address IS NOT NULL
AND wait_started_ms_ticks <> 0
AND wait_started_ms_ticks >= start_quantum;

Sunucuyu son olarak yeniden başlattığımdan beri toplam bekleme süresinin anlık görüntüsünü alabilir ve on saniye bekledikten sonra yeni bir toplamla karşılaştırabilirim:

DECLARE @start_wait_time_ms BIGINT;

SELECT @start_wait_time_ms = SUM(wait_time_ms)
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

WAITFOR DELAY '00:00:10';

SELECT SUM(wait_time_ms) - @start_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

Bazen matematik çalışır. En son ben delta 101339 ms oldu. Başka bir deyişle, sadece sistem görevlerinden saniyede 10 saniyeden fazla bekledim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.