हम एक सी # (नेट 4.0) सांत्वना अनुप्रयोग है हो जाता है कि "आत्म मेजबान" दो WCFs सेवाएं: एक WSHttpBinding
इस्तेमाल किया, और एक अन्य का उपयोग करता है BasicHttpBinding
।WCF "स्वयं होस्ट किया गया" आवेदन अनुत्तरदायी
इन सेवाओं से कनेक्ट होने पर, हमारे पास दो अलग-अलग ग्राहक अनुप्रयोग हैं: एक सिल्वरलाइट-आधारित सेवा जो BasicHttpBinding
का उपयोग करती है, और एक अन्य कंसोल ऐप जो WSHttpBinding
का उपयोग करता है।
डब्ल्यूसीएफ सेवा ऐप में आमतौर पर लगभग 30 उपयोगकर्ता सिल्वरलाइट क्लाइंट के माध्यम से जुड़े होते हैं, और कंसोल एप्लिकेशन क्लाइंट से कनेक्शन के कुछ जोड़े होते हैं। यह किसी भी माध्यम से "फ्लैट आउट" नहीं है; प्रत्येक ग्राहक डब्ल्यूसीएफ सेवा से पूछता है कि शायद हर 5 सेकंड में एक बार सबसे अधिक बार।
समस्या यह है: अंततः सेवा आवेदन अनुत्तरदायी हो जाता है। हालांकि सर्वर स्वयं चल रहा है (यह एक लॉग फ़ाइल को लिखना जारी रखता है), सभी डब्ल्यूसीएफ गतिविधि (ServiceHost
दोनों पर) "जब्त" दिखाई देती है। नए अनुरोध संसाधित नहीं किए जाते हैं (हालांकि टीसीपी कनेक्शन स्वीकार किए जाते हैं)। इसके अलावा, एप्लिकेशन द्वारा खपत धागे की संख्या प्रति सेकंड लगभग एक नए धागे की दर से नाटकीय रूप से बढ़ने लगती है। कोड स्वयं Thread
एस या ThreadPool
एस के साथ कुछ भी नहीं करता है, हालांकि यह कभी-कभी कुछ सौ मिलीसेकंड के लिए Thread.Sleep
जारी करेगा।
निराशाजनक बात समस्या की अस्थायी प्रकृति है: कोड नियमित रूप से घंटों तक चलता है, यहां तक कि बिना किसी समस्या के दिन। फिर, किसी भी स्पष्ट कारण के साथ, यह अचानक उत्तरदायी नहीं हो जाता है और थ्रेड गिनती शुरू हो जाती है।
मैंने उपयोगकर्ता गतिविधि को अनुकरण करने की कोशिश की है - ग्राहकों को जोड़ने और डिस्कनेक्ट करने, अनुरोधों के साथ सेवा को "दलदल" - लेकिन मैं गलती को पुन: उत्पन्न करने के लिए कुछ भी नहीं कर सकता।
ServiceThrottlingBehavior throttlingBehavior = new System.ServiceModel.Description.ServiceThrottlingBehavior
{
MaxConcurrentCalls = 512,
MaxConcurrentInstances = 8192,
MaxConcurrentSessions = 8192
};
host.Description.Behaviors.Add(throttlingBehavior);
host2.Description.Behaviors.Add(throttlingBehavior);
.. कोई स्पष्ट प्रभाव के साथ:
शायद ज़रुरत पड़े मुद्दा WCF थ्रॉटलिंग, मैं इस कोड जोड़ दिया गया था।
मैंने इस व्यवहार को ट्रिगर करने के लिए कोड में व्यापक लॉगिंग डाली है - प्रत्येक विधि को प्रत्येक कॉल लॉगिंग - लेकिन परिणामस्वरूप कुछ भी दिखाई नहीं दिया है। मैंने सबकुछ में लपेट लिया है ... catch
ब्लॉक और लॉग फ़ाइल में किसी भी अपवाद को थूकना, यह देखने के लिए कि कहीं कहीं गिर रहा है, और UnhandledException
एस को भी इसी तरह से फंस गया है ... लेकिन फिर से, कुछ भी नहीं होने वाला प्रतीत होता है गलत।
क्या उपरोक्त व्यवहार किसी से परिचित है, या कोई भी इस समस्या का निवारण करने के लिए सबसे अच्छा तरीका सुझा सकता है?
संपादित करें: निम्नलिखित नीचे वाल की सलाह पर, मैं आवेदन की एक .dmp पर कब्जा कर लिया गया है जब यह गलत तरीके से व्यवहार कर शुरू होता है, और समानांतर ढेर को देख VS2012 में देखते हैं, तो मैं देख रहा हूँ:
... और अन्य बहुत समान हैं लेकिन विभिन्न धागे के साथ। मैं वास्तव में इसका मतलब यह नहीं समझने के लिए पर्याप्त चालाक नहीं हूं .. क्या कोई सुझाव दे सकता है कि आगे कहां देखना शुरू करें?
जैसा कि आप .NET4 में हैं, आप कार्य mgr का उपयोग करके अपनी प्रक्रिया का एक डंप ले सकते हैं और उस डंप फ़ाइल को वापस VS में खींच सकते हैं और यह देखने के लिए समानांतर स्टैक देख सकते हैं कि क्या हो रहा है। * उम्मीद है कि * यह स्पष्ट है अन्यथा आपको विंडबग मार्ग जाना होगा। (एक ही डंप फ़ाइल का उपयोग कर)। उम्मीद है कि यह मुद्दा स्वयं को कुछ सरल के रूप में प्रकट करता है, जैसे कि आपके क्लाइंट को ऑफबेट करने से कुछ अनजाने में आपकी प्रसंस्करण कतार का बैक अप – wal
क्या आप विधि को कॉल करने के बाद अपने क्लाइंट को बंद कर रहे हैं? संबंधित हो सकता है http://johan.driessen.se/posts/do-not-forget-to-close-your-wcf-serviceclients – keyboardP
मुझे लगता है कि आपने कोशिश की लेकिन ... क्या आपने (लगभग) सभी संग्रह संग्रह सक्षम किया ** प्रदर्शन काउंटर ** आपकी प्रक्रिया से संबंधित है? जब ऐसा होता है तो आप एकत्रित डेटा की तुलना कर सकते हैं (_contention_ धागे के साथ मिलकर उगता है? मेमोरी उपयोग धागे से तेज़ी से बढ़ता है? और इसी तरह ...) –