เหตุใดฉันจึงมี THREADPOOL รออยู่แม้ว่าฉันจะมีเธรดอยู่ก็ตาม

Aug 15 2020

เรากำลังเห็นการหมดเวลาสมัครและด้วยความช่วยเหลือของ First Responder Kit ฉันได้บันทึกรายละเอียดแล้ว สิ่งหนึ่งที่ดึงดูดความสนใจของฉันคือ:

ตรวจพบการรอพิษ: เธรดพูล

ดังนั้นฉันจึงตอบคำถามด้านล่าง:

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

เมื่อฉันเรียกใช้แบบสอบถาม "thread pool wait" เธรดพูลรอจะปรากฏในผลลัพธ์ด้านบน (บางครั้งมากกว่า 20 ผลลัพธ์) เป็นเสี้ยววินาทีจากนั้นจะหายไปเมื่อฉันเรียกใช้อีกครั้ง แต่ฉันสามารถเห็นมากกว่า 400 เธรดที่มีอยู่ในผลลัพธ์ที่สองที่ตั้งค่าผ่านการสืบค้น "เธรดที่มีอยู่"

ฉันไม่เข้าใจว่าเหตุใดฉันจึงเห็นว่ากำลังTHREADPOOLรอเมื่อฉันเรียกใช้แบบสอบถามแรก แต่แบบสอบถามที่สองแสดงว่ายังมีเธรดอยู่ ใครช่วยอธิบายหน่อยได้ไหม

  • Maxdop: 8
  • ระดับความขนานสูงสุด: 50

เธรดพูลรอ:

คำตอบ

4 JoshDarnell Aug 27 2020 at 21:38

ฉันไม่เข้าใจว่าทำไมฉันจึงเห็นว่า THREADPOOL รออยู่เมื่อฉันเรียกใช้แบบสอบถามแรก แต่แบบสอบถามที่สองแสดงว่ายังมีเธรดอยู่ ใครช่วยอธิบายหน่อยได้ไหม

ฉันสังเกตเห็นว่าคุณสามารถเห็นการTHREADPOOLรอสั้น ๆ มากมาย(ไม่กี่วินาทีต่อวินาที) ในขณะที่ SQL Server กำลังรับเธรดจากระบบปฏิบัติการ

สิ่งนี้อาจเกิดขึ้นได้เช่นหาก SQL Server ไม่ได้ใช้งานชั่วขณะจากนั้นเคียวรีคู่ขนานหลายรายการจะถูกดำเนินการพร้อมกัน คำค้นหาเหล่านี้จะต้องรอในขณะที่ระบบปฏิบัติการจัดเตรียมเธรดให้กับกระบวนการ sqlservr.exe โดยTHREADPOOLจะรอในช่วงเวลานั้น

คุณสามารถยืนยันได้โดยดูที่เคาน์เตอร์ "กระบวนการ" -> "จำนวนเธรด" PerfMon โดยทั่วไปเมื่อใดก็ตามที่ค่านี้เพิ่มขึ้นอย่างรวดเร็วคุณอาจเห็นสิ่งเหล่านี้THREADPOOLรออยู่

มีการสาธิตพฤติกรรมนี้ทั้งหมดในบล็อกของฉัน ( Unusual THREADPOOL รอ ) นี่คือบทสรุป:

กลับไปที่ลิงก์เอกสารนั้น:

เกิดขึ้นเมื่องานกำลังรอให้ผู้ปฏิบัติงานทำงาน

ในกรณีทั่วไปนี่เป็นเพราะเราใช้งานถึงขีด จำกัด ทางตรรกะที่ SQL Server กำหนดไว้สำหรับจำนวนเธรดของผู้ปฏิบัติงานที่คุณสามารถมีได้ในแต่ละครั้ง

ในกรณีที่ผิดปกติงานกำลังรอผู้ปฏิบัติงานเนื่องจาก SQL Server กำลังจัดสรรเธรด (ร้องขอจากระบบปฏิบัติการ) ที่จำเป็นเพื่อสำรองผู้ปฏิบัติงานนั้น

เพื่อความชัดเจนฉันจะแปลกใจถ้าการรอเหล่านี้เป็นสาเหตุของการหมดเวลาการสมัครของคุณ