Mengapa saya memiliki THREADPOOL menunggu meskipun saya memiliki utas yang tersedia?

Aug 16 2020

Kami melihat waktu tunggu aplikasi habis dan dengan bantuan First Responder Kit, saya telah menangkap detailnya. Salah satu hal yang menarik perhatian saya adalah:

Poison wait terdeteksi: Thread Pool

Jadi saya menjalankan kueri di bawah ini:

---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'

Ketika saya menjalankan kueri "thread pool wait", menunggu thread pool muncul di hasil di atas (terkadang, lebih dari 20 hasil) selama sepersekian detik dan kemudian menghilang saat saya menjalankannya lagi. Tapi saya bisa melihat lebih dari 400 utas tersedia di hasil kedua diatur melalui kueri "utas tersedia".

Saya tidak dapat memahami mengapa saya melihat THREADPOOLmenunggu ketika saya menjalankan kueri pertama, tetapi kueri kedua menunjukkan utas masih tersedia. Adakah yang bisa menjelaskan?

  • Maxdop: 8
  • Tingkat paralelisme maksimum: 50

Kumpulan benang menunggu:

Jawaban

4 JoshDarnell Aug 27 2020 at 21:38

Saya tidak dapat memahami mengapa saya melihat THREADPOOL menunggu ketika saya menjalankan kueri pertama, tetapi kueri kedua menunjukkan utas masih tersedia. Adakah yang bisa menjelaskan?

Saya telah mengamati bahwa Anda dapat melihat banyak THREADPOOLmenunggu yang sangat singkat (masing-masing beberapa milidetik) saat SQL Server memperoleh utas dari sistem operasi.

Ini mungkin terjadi jika, misalnya, SQL Server tidak aktif selama beberapa saat, lalu beberapa kueri paralel dijalankan sekaligus. Kueri ini harus menunggu sementara OS menyediakan utas ke proses sqlservr.exe, mengumpulkan THREADPOOLmenunggu selama waktu itu.

Anda dapat mengonfirmasi hal ini terjadi dengan melihat penghitung PerfMon "Proses" -> "Jumlah Benang". Umumnya, setiap kali nilai ini naik dengan cepat, Anda mungkin melihat ini THREADPOOLmenunggu.

Ada demo lengkap dari perilaku ini di blog saya ( THREADPOOL Tidak Biasa Menunggu ), berikut ringkasannya:

Kembali ke tautan dokumen itu:

Terjadi saat tugas menunggu pekerja untuk dijalankan.

Dalam kasus umum, ini karena kami telah mencapai batas logis yang ditetapkan SQL Server untuk berapa banyak utas pekerja yang dapat Anda miliki dalam satu waktu.

Dalam kasus yang tidak biasa, tugas menunggu pekerja karena SQL Server mengalokasikan utas (memintanya dari OS) yang diperlukan untuk mendukung pekerja itu.

Untuk memperjelas, saya akan terkejut jika penantian ini adalah penyebab waktu tunggu aplikasi Anda.