2012-02-21 13 views
8

लीक कर रहा है प्रदर्शन मॉनिटर में मेरा नेट अनुप्रयोग निगरानी मैं देख सकता हूँ वर्तमान तार्किक धागे की .NET CLR LocksAndThreads/# समय जो धागा ढेर इंगित करता है से अधिक तेजी से (वर्तमान में 293) बढ़ती जा रही है लीक कर रहा है।वर्तमान तार्किक सूत्र में वृद्धि/धागा ढेर

मुझे कई लेख मिल सकते हैं जो मुझे बताते हैं कि यह समस्या है लेकिन कुछ भी नहीं जो मुझे बताता है कि कारण कैसे ढूंढें - तो मैं कहां से शुरू करूं? क्या विंडबग मुझे बता सकता है कि समस्या कहां है?

यह 3hrs पर मेरे प्रदर्शन पर नजर रखने के अपने मौजूदा तार्किक सूत्र बता 150 है:

thread leak

और इस धागे खिड़की के उत्पादन में है, जो मुझे बहुत नहीं बताता है क्योंकि मैं नहीं कर सकता है अपने कॉल स्टैक तक पहुंचें - उन्हें अधिकतर [अनुपलब्ध] या [नींद में, प्रतीक्षा करें या शामिल हों] के रूप में चिह्नित किया जाता है [बाहरी कोड]:

Unflagged  141024 124 Worker Thread <No Name>  Normal 
Unflagged > 0 0 Unknown Thread [Thread Destroyed]  
Unflagged  136272 2 Worker Thread <No Name>  Highest 
Unflagged  133060 7 Worker Thread vshost.RunParkingWindow [Managed to Native Transition] Normal 
Unflagged  136952 10 Main Thread Main Thread [edited].Program.Main Normal 
Unflagged  134544 9 Worker Thread .NET SystemEvents [Managed to Native Transition] Normal 
Unflagged  136556 11 Worker Thread Worker Thread [edited].MessageService.ProcessJobs.AnonymousMethod__0 Normal 
Unflagged  141364 113 Worker Thread <No Name> [In a sleep, wait, or join] Normal 
Unflagged  140896 0 Worker Thread [Thread Destroyed]  Normal 
Unflagged  136776 19 Worker Thread <No Name> [In a sleep, wait, or join] Normal 
Unflagged  135704 20 Worker Thread <No Name> [In a sleep, wait, or join] Normal 
Unflagged  136712 21 Worker Thread <No Name> [In a sleep, wait, or join] Normal 
Unflagged  134984 22 Worker Thread <No Name> [In a sleep, wait, or join] Normal 
Unflagged  134660 23 Worker Thread Worker Thread [edited].BroadcastService.ProcessJobs.AnonymousMethod__1d Normal 
Unflagged  140224 152 Worker Thread <No Name>  Normal 
Unflagged  140792 157 Worker Thread <No Name>  Normal 
Unflagged  137116 0 Worker Thread <No Name>  Normal 
Unflagged  140776 111 Worker Thread <No Name>  Normal 
Unflagged  140784 0 Worker Thread [Thread Destroyed]  Normal 
Unflagged  140068 145 Worker Thread <No Name>  Normal 
Unflagged  139000 150 Worker Thread <No Name>  Normal 
Unflagged  140828 52 Worker Thread <No Name>  Normal 
Unflagged  137752 146 Worker Thread <No Name>  Normal 
Unflagged  140868 151 Worker Thread <No Name>  Normal 
Unflagged  141324 139 Worker Thread <No Name>  Normal 
Unflagged  140168 154 Worker Thread <No Name>  Normal 
Unflagged  141848 0 Worker Thread [Thread Destroyed]  Normal 
Unflagged  135544 153 Worker Thread <No Name>  Normal 
Unflagged  142260 140 Worker Thread <No Name>  Normal 
Unflagged  141528 142 Worker Thread <No Name> [In a sleep, wait, or join] Normal 
Unflagged  141344 0 Worker Thread [Thread Destroyed]  Normal 
Unflagged  140096 136 Worker Thread <No Name>  Normal 
Unflagged  141712 134 Worker Thread <No Name>  Normal 
Unflagged  141688 147 Worker Thread <No Name>  Normal 

अद्यतन: मैं के बाद से एक System.Timers.Timer करने के लिए नीचे अपराधी पर नज़र रखी है। यहां तक ​​कि जब इस टाइमर ने प्रत्येक विलुप्त घटना पर एक खाली विधि कहा, तब भी यह तार्किक धागा गिनती को अनिश्चित काल तक उठाया। बस डिस्पैचर टिमर में टाइमर बदलने से समस्या ठीक हो गई है।

this question में उल्लिखित विंडबग में !dumpheap -type TimerCallback चलाते समय बड़ी संख्या में देखने के बाद मैंने अपने आवेदन में सभी टाइमर देखने लगे।

मैं अभी भी जानना चाहता हूं कि मैं अक्षम टाइमर/चेक प्रदर्शन/दोहराने की विधि के बजाय विंडबग डीबगिंग के माध्यम से इसे कैसे ढूंढ सकता हूं जो मुझे ठीक करने के लिए प्रेरित करता है। अर्थात। कुछ भी जो मुझे बता सकता था कि कौन सा टाइमर समस्या पैदा कर रहा था।

+0

क्या आप जानते हैं कि उन्हें क्या बना रहा है, और क्यों? –

+0

मेरे ऐप में बहुत से चलने वाले हिस्सों हैं इसलिए "क्यों" विभिन्न पृष्ठभूमि कार्यों की संख्या होगी। मैं "क्या" पता लगाने के लिए वृद्धि के स्रोत को खोजने की कोशिश कर रहा हूं। – DaveO

उत्तर

4

यह आमतौर पर थ्रेड-पूल धागे फंसने और पूरा नहीं होने के कारण होता है। प्रत्येक आधा सेकेंड, थ्रेडपूल प्रबंधक बैकलॉग को काम करने की कोशिश करने के लिए एक और थ्रेड की अनुमति देता है। यह थ्रेडपूल.SetMaxThreads() द्वारा निर्धारित थ्रेड की अधिकतम संख्या तक पहुंचने तक चलता रहता है। डिफ़ॉल्ट रूप से एक बड़ी संख्या, 4-कोर मशीन पर 1000।

चल रहे धागे को देखने के लिए डीबग + विंडोज + थ्रेड का उपयोग करें। उनके कॉल स्टैक को यह स्पष्ट करना चाहिए कि वे क्यों अवरुद्ध कर रहे हैं।

+0

हाय हंस। मैंने एक नज़र डाली लेकिन जैसा कि ऊपर अपडेट किया गया है, मैं वास्तव में कोई उपयोगी जानकारी नहीं देख सकता। क्या यह संभव है कि यह अप्रबंधित कोड के कारण हो, यही कारण है कि सूचीबद्ध अधिकांश धागे अनुपलब्ध हैं? – DaveO

+0

स्पष्ट रूप से मेरा अधिकतम। ThreadPool.GetMaxThreads से धागे 1023 है, फिर भी परफॉर्म वर्तमान में 2400 से अधिक वर्तमान तार्किक धागे दिखा रहा है .. – DaveO

+0

हम्म, यह स्पष्ट रूप से ओवरराइड होने तक हमेशा 250 का एक बहु होता है। मुश्किल मायने रखता है, 2400 धागे निश्चित रूप से खुश बिंदु और असली समस्या से पहले है। 1023 होने से यह बेहतर नहीं होता है। –

1

असीमित रूप से चलाने के लिए अपने सभी लंबे समय तक चलने वाले संचालन (100+ एमएस डाटाबेस कॉल, डिस्क या नेटवर्क एक्सेस) आज़माएं।

.NET 4.5 में async/प्रतीक्षा प्राचीन निर्देशों का उपयोग करें।

धागे पूल कतार से एक कतारबद्ध कार्य पुनर्प्राप्त होने पर थ्रेड पूल थ्रेड नंबर में बढ़ेगा यदि थ्रेड पूल उपलब्ध नहीं है। यदि सर्वर में प्रवृत्ति इस तरह से जारी रहती है तो आप शायद थ्रेड पूल भुखमरी के साथ समाप्त हो जाएंगे। कार्यों से भरा थ्रेड पूल कतार के साथ .net अधिक अनुरोधों को अस्वीकार कर देगा, इसलिए आप अपने आवेदन की स्केलेबिलिटी की सीमा पर होंगे।

निर्देश का इंतजार आपके आवेदन में वर्कफ़्लो उत्पन्न करेगा, मुख्य धागे को मुक्त करेगा। लंबे समय तक चलने वाले ऑपरेशन के बाद, थ्रेड पूल में एक नया कार्य कतारबद्ध होता है जो आपको स्वचालित रूप से फिर से शुरू करने के लिए आवेदन देता है। इस तरह से धागे को मुक्त और रीसाइक्लिंग करने से वर्तमान तार्किक धागे के # को न्यूनतम स्तर पर रखा जाएगा, भुखमरी को रोक दिया जाएगा और धागे के बीच अधिक संदर्भ स्विच होंगे।

भी .NET 4 में।5 एक नया एल्गोरिदम थ्रेड पूल के अंदर नए थ्रेड सृजन की लागत/लाभ को नियंत्रित करता है, प्रवृत्ति बढ़ने पर प्रदर्शन वृद्धि और संदर्भ स्विचिंग के बीच उचित संबंध रखता है। अगर आप 4.5 से आगे बढ़ते हैं तो यह एक अतिरिक्त लाभ है यदि आपने पहले ऐसा नहीं किया है।

तो पहला कदम अपने लंबे चल रहे संचालन की पहचान करना है और फिर उन्हें एसिंक बनाना है।

आप अन्य काउंटरों (डेटाबेस क्लाइंट कनेक्शन, डिस्क आईओ रीड इत्यादि) के साथ वर्तमान लॉजिकल थ्रेड के # सहसंबंध से इसे सत्यापित कर सकते हैं। अगर पहली बार बढ़ोतरी होती है तो आपको यह सुनिश्चित करने की संभावना है कि यह समस्या है। यह भी जांचें कि संचालन कितने समय तक लेते हैं। 100 एमएस यह कहने का एक अच्छा उपाय है कि आपका ऑपरेशन सामान्य ज्ञान में लंबे समय से चल रहा है।

इस सहायता की आशा करें।

संबंधित मुद्दे