Mengapa saya memiliki THREADPOOL menunggu meskipun saya memiliki utas yang tersedia?
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 THREADPOOL
menunggu 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
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 THREADPOOL
menunggu 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 THREADPOOL
menunggu 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 THREADPOOL
menunggu.
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.