2011-05-03 14 views
5

मैंने उपयोगकर्ताओं को पेजर संदेश भेजने के लिए उपयोग की गई एक .Net (2.0) विंडोज सेवा लिखा है (सीरियल पोर्ट कनेक्शन के माध्यम से तृतीय पक्ष हार्डवेयर)।.NET 2.0 विंडोज सेवा कचरा संग्रह के दौरान लटकती है

सेवा समय-समय पर डेटाबेस (ओएसआई पीआई इतिहासकार) से पूछताछ करती है, मानों को पार करती है और निर्णय लेती है कि क्या वे मूल्यवान मूल्यों के आधार पर एक संदेश भेजना है या नहीं।

सेवा उपयोगकर्ता पता मान और संदेश स्ट्रिंग भेजने के लिए एक लुकअप ऑब्जेक्ट (जो मान SQL सर्वर डेटाबेस से आता है और हर मिनट रीफ्रेश किया जाता है) का उपयोग करता है।

सेवा आवधिक डेटाबेस कॉल और संदेश भेजने के लिए कई थ्रेडिंग टिमर्स का उपयोग करती है।

सेवा विंडोज 2003 मशीन पर स्थापित है जिसमें .Net 2 SP2 स्थापित है।

सेवा लगभग एक सप्ताह तक ठीक काम करती है और फिर यह लटकती है। लॉग (log4net) के भीतर कोई अपवाद दर्ज नहीं किया गया है।

मैं सर्वर से डंप के एक नंबर लेने के है और वे सभी एक ही प्रदर्शन विशेषताओं - एक धागा चलाता है जीसी लेकिन रुक जाता है अनिश्चित काल के लिए:

06aaf06c 7c827b99 77e61d1e 00004acc 00000000 ntdll!KiFastSystemCallRet 
06aaf070 77e61d1e 00004acc 00000000 00000000 ntdll!ZwWaitForSingleObject+0xc 
06aaf0e0 79e8c5f9 00004acc ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac 
06aaf124 79e8c52f 00004acc ffffffff 00000000 mscorwks!PEImage::LoadImage+0x1af 
06aaf174 79e8c54e ffffffff 00000000 00000000 mscorwks!CLREvent::WaitEx+0x117 
06aaf188 79f2f88f ffffffff 00000000 00000000 mscorwks!CLREvent::Wait+0x17 
06aaf1a8 79f2f8ca 7a3b9020 00000000 ffffffff mscorwks!SVR::gc_heap::user_thread_wait+0x50 
06aaf1b8 79f2f806 00000000 7a3b8b18 00080101 mscorwks!WKS::gc_heap::wait_to_proceed+0xe 
06aaf1cc 79f92f5a 00000000 00000000 00000000 mscorwks!WKS::gc_heap::garbage_collect+0x247 
06aaf1f8 79f94e26 00000000 00000000 00000030 mscorwks!WKS::GCHeap::GarbageCollectGeneration+0x1a9 
06aaf284 79f926ce 052c75c8 00000030 00000000 mscorwks!WKS::gc_heap::try_allocate_more_space+0x15b 
06aaf298 79f92769 052c75c8 00000030 00000000 mscorwks!WKS::gc_heap::allocate_more_space+0x11 
06aaf2b8 79e73291 052c75c8 0000002e 00000000 mscorwks!WKS::GCHeap::Alloc+0x3b 
06aaf2d4 79e7d8d4 0000002e 00000000 00000000 mscorwks!Alloc+0x60 
06aaf310 79e99056 0000000f b456b75e 00001ce3 mscorwks!SlowAllocateString+0x29 
06aaf3b4 792bb2c1 00000000 0108082b 00001f40 mscorwks!FramedAllocateString+0xa1 
    Stack shortened for bravity... 

प्रबंधित ढेर:

ESP  EIP  
06aaf364 7c82847c [HelperMethodFrame: 06aaf364] 
06aaf3bc 792bb2c1 System.String.CreateStringFromEncoding(Byte*, Int32, System.Text.Encoding) 
06aaf3dc 792aaf2a System.Text.EncodingNLS.GetString(Byte[], Int32, Int32) 
06aaf3fc 6522d131 System.Data.SqlClient.TdsParserStateObject.ReadStringWithEncoding(Int32, System.Text.Encoding, Boolean) 
06aaf41c 656ca93e System.Data.SqlClient.TdsParser.ReadSqlStringValue(System.Data.SqlClient.SqlBuffer, Byte, Int32, System.Text.Encoding, Boolean, System.Data.SqlClient.TdsParserStateObject) 
06aaf448 6522d925 System.Data.SqlClient.TdsParser.ReadSqlValue(System.Data.SqlClient.SqlBuffer, System.Data.SqlClient.SqlMetaDataPriv, Int32, System.Data.SqlClient.TdsParserStateObject) 
06aaf474 656208b7 System.Data.SqlClient.SqlDataReader.ReadColumnData() 
06aaf484 65620962 System.Data.SqlClient.SqlDataReader.ReadColumn(Int32, Boolean) 
06aaf4b4 65221415 System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32) 
06aaf4c8 652213af System.Data.SqlClient.SqlDataReader.GetValue(Int32) 
06aaf4f8 65220aec System.Data.SqlClient.SqlDataReader.get_Item(System.String) 
06aaf504 03616b81 AlarmEventCollator.DataAccess.GetAllAlarmDetails() 
06aaf564 03616a28 AlarmEventCollator.AlarmBuilder.buildLookups() 
06aaf590 0361aa89 AlarmEventCollator.AlarmBuilder.pollLookups(System.Object) 
06aaf5d0 792a83ff System.Threading._TimerCallback.TimerCallback_Context(System.Object) 
06aaf5d8 792e019f System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
06aaf5f0 792a836b System.Threading._TimerCallback.PerformTimerCallback(System.Object) 
06aaf77c 79e71b4c [GCFrame: 06aaf77c] 

जीसी आमतौर पर डेटाबेस पार्सिंग विधियों में होता है। अन्य सभी प्रबंधित धागे लटकने लगते हैं - जो जीसी प्रक्रिया के अनुरूप होंगे।

मैं किसी भी पॉइंटर्स की सराहना करता हूं। अनुरोध पर अधिक जानकारी उपलब्ध है।

+0

आप कई अलग-अलग कनेक्शन (एसक्यूएल और सीरियल दोनों) से निपट रहे हैं। क्या जीसी सभी पुरानी वस्तुओं को इकट्ठा करने में सक्षम है या स्मृति में कुछ ऐसा हो रहा है जो स्मृति उपयोग में वृद्धि का कारण बनता है (स्थैतिक कक्षाएं या सीरियल कनेक्शन इसका कारण बन सकते हैं यदि आप सावधान नहीं हैं)? क्या आपने यह सुनिश्चित करने के लिए स्मृति उपयोग देखा है कि जीसी के पास चलाने की क्षमता नहीं है क्योंकि स्मृति बहुत पूर्ण है (बेवकूफ सवाल, मुझे पता है, लेकिन मुझे पूछना है)? – IAmTimCorey

+1

साथ ही, सुनिश्चित करें कि आप उनके साथ समाप्त होने के तुरंत बाद IDISposable लागू करने वाली सभी वस्तुओं का निपटान कर रहे हैं। –

+0

मुझे विश्वास नहीं है कि स्मृति में कोई बड़ी बड़ी वस्तुएं हैं - क्रैश डंप 22 एमबी के जीसी ढेर आकार की रिपोर्ट करता है।जहां तक ​​मैं सभी आईडीस्पोजिबल वस्तुओं को बता सकता हूं, उनका निपटारा किया जा रहा है। –

उत्तर

2

एक .NET प्रक्रिया में हमारे पास कितने जीसी थ्रेड हैं जो दोहरी कोर मशीन पर जीसी के सर्वर संस्करण को चला रहे हैं?

दो, प्रति प्रोसेसर, या प्रति लॉजिकल प्रोसेसर में से एक, तो अगर यह हाइपर थ्रेडेड होता तो यह 4 होता। जीसी के वर्कस्टेशन संस्करण को चलाने वाली प्रक्रिया में हमारे पास कोई समर्पित जीसी थ्रेड नहीं होगा, इसके बजाय कचरा संग्रह जीसी शुरू करने वाले थ्रेड पर चलता है क्योंकि कचरा संग्रह के लिए एक अलग थ्रेड पर स्विच करने में कोई बात नहीं है जब आपके पास केवल एक proc/one है धागा जीसी कर रहा है।

क्रिस ल्यों के पास जीसी मोड के बारे में एक अच्छा लेखन है और ऑर्कस में आने वाले जीसी विलंबता मोड के बारे में एक दिलचस्प पोस्ट भी है।

यह आपके लिए महत्वपूर्ण क्यों है? चूंकि विभिन्न जीसी मोड अलग-अलग चीजों के लिए अनुकूलित किए जाते हैं, इसलिए आपके जीसी मोड का उपयोग करने के आधार पर आपकी मेमोरी यूज, जीसी विलंबता इत्यादि बहुत भिन्न हो सकती है। उदाहरण के लिए डिफ़ॉल्ट रूप से एक विंडोज़ सेवा वर्कस्टेशन जीसी प्राप्त करती है, लेकिन यदि वहां बहुत सारे थ्रूगपुट (बहुत कम रहने वाले ऑलॉक्स) हैं, तो आप स्मृति उपयोग और perf के लिए सर्वर जीसी चलाने से शायद बहुत बेहतर हैं।

+0

हाँ मैंने सर्वर पर जीसी मोड सेट करके इस समस्या को ठीक किया है। ऐसा लगता है कि जीसी के पास वर्कस्टेशन मोड पर प्रदर्शन/विश्वसनीयता समस्याएं थीं। –

+0

यदि यह हल हो जाता है, तो क्या आप इसे उत्तर के रूप में चिह्नित कर सकते हैं और उसे बंद कर सकते हैं। – Ramprasad

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