2013-05-31 5 views
12

हम एक सी # (नेट 4.0) सांत्वना अनुप्रयोग है हो जाता है कि "आत्म मेजबान" दो WCFs सेवाएं: एक WSHttpBinding इस्तेमाल किया, और एक अन्य का उपयोग करता है BasicHttpBindingWCF "स्वयं होस्ट किया गया" आवेदन अनुत्तरदायी

इन सेवाओं से कनेक्ट होने पर, हमारे पास दो अलग-अलग ग्राहक अनुप्रयोग हैं: एक सिल्वरलाइट-आधारित सेवा जो 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 में देखते हैं, तो मैं देख रहा हूँ:

enter image description here enter image description here

... और अन्य बहुत समान हैं लेकिन विभिन्न धागे के साथ। मैं वास्तव में इसका मतलब यह नहीं समझने के लिए पर्याप्त चालाक नहीं हूं .. क्या कोई सुझाव दे सकता है कि आगे कहां देखना शुरू करें?

+1

जैसा कि आप .NET4 में हैं, आप कार्य mgr का उपयोग करके अपनी प्रक्रिया का एक डंप ले सकते हैं और उस डंप फ़ाइल को वापस VS में खींच सकते हैं और यह देखने के लिए समानांतर स्टैक देख सकते हैं कि क्या हो रहा है। * उम्मीद है कि * यह स्पष्ट है अन्यथा आपको विंडबग मार्ग जाना होगा। (एक ही डंप फ़ाइल का उपयोग कर)। उम्मीद है कि यह मुद्दा स्वयं को कुछ सरल के रूप में प्रकट करता है, जैसे कि आपके क्लाइंट को ऑफबेट करने से कुछ अनजाने में आपकी प्रसंस्करण कतार का बैक अप – wal

+1

क्या आप विधि को कॉल करने के बाद अपने क्लाइंट को बंद कर रहे हैं? संबंधित हो सकता है http://johan.driessen.se/posts/do-not-forget-to-close-your-wcf-serviceclients – keyboardP

+1

मुझे लगता है कि आपने कोशिश की लेकिन ... क्या आपने (लगभग) सभी संग्रह संग्रह सक्षम किया ** प्रदर्शन काउंटर ** आपकी प्रक्रिया से संबंधित है? जब ऐसा होता है तो आप एकत्रित डेटा की तुलना कर सकते हैं (_contention_ धागे के साथ मिलकर उगता है? मेमोरी उपयोग धागे से तेज़ी से बढ़ता है? और इसी तरह ...) –

उत्तर

2

टिप्पणी करने और उत्तर देने वाले सभी लोगों के लिए धन्यवाद; आपके सुझावों और इनपुट ने वास्तव में मदद की है - कम से कम यह पुष्टि करने के लिए कि यह कुछ छोटा नहीं लगता है जिसे मैंने याद किया है।

हालांकि, और थोड़ा निराशाजनक, समस्या दूर हो गई प्रतीत होती है। यहाँ मैं क्या बदल गया है:

  • आवेदन नियमित रूप से सांत्वना के लिए लिख रहा था (मेरी "WriteToLog" विधि Console.WriteLine के साथ ही एक फाइल करने के लिए जोड़कर था, इस विकास के दौरान अपने ही सुविधा के लिए विशुद्ध रूप से किया गया था)। एप्लिकेशन फायरडेमॉन का उपयोग कर एक सेवा के रूप में भी चल रहा था, और किसी कारण से हमने conhost.exe पर उच्च CPU समय देखना शुरू कर दिया। तो इसका विरोध करने के लिए, मैंने Console.WriteLine पर टिप्पणी की है।

  • उच्च CPU के कारण, हमने उस वर्चुअल मशीन के प्रदर्शन को भी बढ़ाया जिस पर कोड कुछ और कोर फेंक कर चल रहा था।

परिणामस्वरूप, एप्लिकेशन अब CPU उपयोग के संदर्भ में बहुत अधिक "शांत" है। जैसा कि अन्य ने उल्लेख किया है, कोड में कहीं निश्चित रूप से "दौड़ की स्थिति" है, लेकिन अंतर्निहित मशीन को तेज़ी से और कोड को अधिक कुशल बनाकर, ऐसा लगता है कि मैंने दौड़ की स्थिति होने की संभावना कम कर दी है। निश्चित रूप से, दिन में कम से कम एक बार होने वाली समस्या लगभग एक सप्ताह में नहीं हुई है।

बस सुनिश्चित करने के लिए, मैं कोड के माध्यम से चला और सुनिश्चित करें कि प्रत्येक साझा वस्तु एक Lock() जहां की यह एक और धागा द्वारा संशोधित किया जा रहा किसी भी संभावना नहीं है में लपेटा जाता है बनाया है - भले ही मैं किसी भी स्पष्ट सूत्रण नहीं कर रहा हूँ, मुझे लगता है कि डब्ल्यूसीएफ तंत्र स्वचालित रूप से ऐसा करेगा और किसी ऑब्जेक्ट को कोशिश करने और संशोधित करने के आने वाले अनुरोध की संभावना है जबकि कुछ और चबाने वाला है। अगर ऐसा हुआ तो मैं किसी तरह के समवर्ती अपवाद की उम्मीद करता?

धन्यवाद फिर से मदद के लिए, और यहाँ कोड उम्मीद कर रहा है से अधिक नहीं आता है बस के बाद मैं Post Your Answer बटन पर क्लिक करें:/

2

सेवा के लिए concurrencymode क्या है? और instancecontextmode?

डिफ़ॉल्ट instancecontextmode, प्रति सत्र है यह इस percall के लिए, यह अधिक स्मृति का उपयोग करेगा, लेकिन यह सुनिश्चित करेंगे कि प्रत्येक सेवा उदाहरण कोई चारों ओर लटक है बदल रहा लायक हो सकता है (बशर्ते ग्राहक को सही ढंग से http://coding.abel.nu/2012/02/using-and-disposing-of-wcf-clients/ का निपटारा किया जाता है)

2

जैसा कि जल्द से जल्द बताया गया है, ऐसा लगता है कि आपके पास दौड़ की स्थिति है। क्या आप किसी भी मौके पर सिस्टम की जांच नहीं कर रहे हैं। सर्विसमोडेल.आईसीएमयूनेशनऑब्जेक्ट। कोड में कहीं कनेक्शन का स्टेटस? देखें MSDN article:

Checking the value of the System.ServiceModel.ICommunicationObject.State property is 
a race condition and is not recommended to determine whether to reuse or close a channel. 
0

जो WCF के साथ कोई संबंध नहीं है इसकी एक सूत्रण मुद्दा हो सकता है - के रूप में में उल्लेख किया पिछली पोस्ट, लॉक स्टेटमेंट संदिग्ध हो सकते हैं - आपका एप्लिकेशन (डब्ल्यूसीएफ भाग या नहीं), थ्रेड को बढ़ा सकता है, जो लॉकिंग समस्या के कारण बाहर नहीं निकल सकता है।

दूसरी ओर, यह डब्ल्यूसीएफ हो सकता है, क्या आपको अपनी डब्ल्यूसीएफ सेवा पर बहुत अधिक हिट मिली? इसे थ्रॉटल करने का प्रयास करें। http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicethrottlingbehavior.maxconcurrentinstances.aspx

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