मेरे पास थ्रेडेडोल का इंतजार क्यों है जबकि मेरे पास थ्रेड उपलब्ध हैं?

Aug 16 2020

हम एप्लिकेशन टाइम आउट देख रहे हैं और फर्स्ट रिस्पॉन्डर किट की मदद से मैंने विवरण कैप्चर किया है। मेरा ध्यान आकर्षित करने वाली चीजों में से एक थी:

ज़हर की प्रतीक्षा का पता चला: थ्रेड पूल

इसलिए मैं प्रश्नों के नीचे भाग गया:

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

जब मैं "थ्रेड पूल प्रतीक्षा" क्वेरी चलाता हूं, तो थ्रेड पूल प्रतीक्षा दूसरे परिणाम में (कभी-कभी, 20 से अधिक परिणाम) उपरोक्त परिणाम में दिखाई दे रही है और जब मैं इसे फिर से चलाता हूं तो गायब हो जाता है। लेकिन मैं "थ्रेड उपलब्ध" क्वेरी के माध्यम से सेट किए गए दूसरे परिणाम में उपलब्ध 400 से अधिक धागे देख सकता था।

मैं समझ नहीं पा रहा हूं कि THREADPOOLजब मैं पहली क्वेरी चला रहा हूं तो मैं इंतजार क्यों कर रहा हूं, लेकिन दूसरी क्वेरी शो थ्रेड्स अभी भी उपलब्ध हैं। क्या कोई समझा सकता है?

  • मैक्सडोप: 8
  • समानता की अधिकतम डिग्री: 50

थ्रेड पूल इंतजार कर रहा है:

जवाब

4 JoshDarnell Aug 27 2020 at 21:38

मुझे समझ में नहीं आ रहा है कि जब मैं पहली क्वेरी चलाता हूं तो मुझे थ्रेडपॉल इंतजार क्यों दिखाई दे रहा है, लेकिन दूसरी क्वेरी से पता चलता है कि थ्रेड अभी भी उपलब्ध हैं। क्या कोई समझा सकता है?

मैंने देखा है कि THREADPOOLSQL सर्वर ऑपरेटिंग सिस्टम से थ्रेड प्राप्त कर रहा है, जबकि आप वास्तव में संक्षिप्त प्रतीक्षा (प्रत्येक की एक मुट्ठी भर) देख सकते हैं ।

यह तब हो सकता है, उदाहरण के लिए, SQL सर्वर थोड़ी देर के लिए निष्क्रिय था, और फिर कई समानांतर प्रश्नों को एक ही बार में निष्पादित किया जाता है। इन प्रश्नों को प्रतीक्षा करने की आवश्यकता होगी जब OS sqlservr.exe प्रक्रिया को थ्रेड प्रदान करता है, THREADPOOLउस समय के दौरान प्रतीक्षा करता है।

आप पुष्टि कर सकते हैं कि यह "प्रोसेस" -> "थ्रेड काउंट" परफ्यूम काउंटर देखकर हो रहा है। आमतौर पर, जब भी यह मूल्य तेजी से चढ़ता है, तो आप इन THREADPOOLवेट को देख सकते हैं ।

मेरे ब्लॉग पर इस व्यवहार का पूरा डेमो है ( असामान्य THREADPOOL इंतजार ), यहाँ सारांश है:

उस डॉक्स लिंक पर वापस जा रहे हैं:

तब होता है जब कोई कार्य किसी कार्यकर्ता के चलने की प्रतीक्षा कर रहा हो।

विशिष्ट स्थिति में, यह इसलिए है क्योंकि हम तार्किक सीमा तक पहुँच चुके हैं SQL सर्वर ने निर्धारित किया है कि आपके पास एक समय में कितने श्रमिक धागे हो सकते हैं।

असामान्य स्थिति में, कार्य एक कार्यकर्ता की प्रतीक्षा कर रहा है क्योंकि SQL सर्वर थ्रेड आवंटित कर रहा है (OS से यह अनुरोध करते हुए) जो उस कार्यकर्ता को वापस करने के लिए आवश्यक है।

स्पष्ट होने के लिए, मुझे आश्चर्य होगा अगर ये प्रतीक्षा आपके आवेदन के समय के कारण थे।