Konularım mevcut olmasına rağmen neden THREADPOOL beklemem var?

Aug 16 2020

Başvuru zaman aşımlarını görüyoruz ve İlk Müdahale Kiti'nin yardımıyla ayrıntıları yakaladım. Dikkatimi çeken şeylerden biri şuydu:

Zehir bekleme algılandı: İş Parçacığı Havuzu

Bu yüzden aşağıdaki sorguları çalıştırdım:

---get thread pool waits---thread pool wait query
SELECT count(*) FROM sys.dm_os_waiting_tasks 
 where wait_type ='threadpool'

-- get threads available--Threads available query
 declare @max int
select @max = max_workers_count from sys.dm_os_sys_info

select 
    @max as 'TotalThreads',
    sum(active_Workers_count) as 'CurrentThreads',
    @max - sum(active_Workers_count) as 'AvailableThreads',
    sum(runnable_tasks_count) as 'WorkersWaitingForCpu',
    sum(work_queue_count) as 'RequestWaitingForThreads' ,
    sum(current_workers_count) as 'AssociatedWorkers',
    Getdate() as 'DateLogged'
from  
    sys.dm_os_Schedulers where status='VISIBLE ONLINE'

"İş parçacığı havuzu bekle" sorgusunu çalıştırdığımda, iş parçacığı havuzu beklemeleri yukarıdaki sonuçta (bazen, 20'den fazla sonuç) saniyenin kesri olarak görünüyor ve sonra tekrar çalıştırdığımda kayboluyor. Ancak "iş parçacığı mevcut" sorgusu aracılığıyla ikinci sonuç kümesinde 400'den fazla iş parçacığı görebiliyordum.

THREADPOOLİlk sorguyu çalıştırdığımda neden beklemeler gördüğümü anlayamıyorum , ancak ikinci sorgu iş parçacıklarının hala kullanılabilir olduğunu gösteriyor. Herhangi biri açıklayabilir mi?

  • Maxdop: 8
  • Maksimum paralellik derecesi: 50

İş parçacığı havuzu bekler:

Yanıtlar

4 JoshDarnell Aug 27 2020 at 21:38

İlk sorguyu çalıştırdığımda THREADPOOL'un neden beklediğini görüyorum anlayamıyorum, ancak ikinci sorgu iş parçacıklarının hala kullanılabilir olduğunu gösteriyor. Herhangi biri açıklayabilir mi?

THREADPOOLSQL Server işletim sisteminden iş parçacıkları alırken çok sayıda gerçekten kısa bekleme süresi (her biri bir avuç milisaniye) görebildiğinizi gözlemledim .

Bu, örneğin, SQL Server bir süre boşta kaldığında ve ardından aynı anda birkaç paralel sorgu yürütüldüğünde meydana gelebilir. İşletim sistemi sqlservr.exe işlemine iş parçacığı sağlarken bu sorguların beklemesi gerekecek ve THREADPOOLbu süre boyunca beklemeler birikecektir .

"İşlem" -> "İş Parçacığı Sayısı" PerfMon sayacını izleyerek bunun olduğunu doğrulayabilirsiniz. Genelde bu değer ne zaman hızla yükselirse bu THREADPOOLbekleyişleri görebilirsiniz .

Blogumda bu davranışın tam bir demosu var ( Olağandışı THREADPOOL Bekler ), işte özet:

Bu dokümanlar bağlantısına geri dönersek:

Bir görev, çalışanın çalışmasını beklediğinde oluşur.

Tipik durumda, bunun nedeni, bir seferde kaç tane çalışan iş parçacığına sahip olabileceğinize ilişkin SQL Server'ın belirlediği mantıksal sınıra ulaşmış olmamızdır.

Olağandışı bir durumda, görev bir çalışanı beklemektedir çünkü SQL Server o çalışanı desteklemek için gerekli olan iş parçacığı ayırmaktadır (işletim sisteminden talep etmektedir).

Açık olmak gerekirse, bu bekleme süreleri başvurunuzun zaman aşımına uğramasının nedeni olsaydı şaşırırdım.