2011-01-12 9 views
10

मैं समझता हूं कि एक शब्दकोश वस्तु के लिए सीमा त्रुटि के बाहर इंडेक्स के मुख्य कारणों में से एक थ्रेड टकराव है। (एक ही समय में एक ही शब्दकोश को पढ़ना और लिखना) हालांकि, मैं एक परेशान मामले में आया हूं जहां थ्रेड टकराव पर्याप्त स्पष्टीकरण नहीं है।इंडेक्स के लिए वैकल्पिक कारण सरणी की सीमाओं के बाहर था। नेट शब्दकोश

यहां स्थिति है: मैंने कोड लिखा है जो बहु-थ्रेडेड प्रोसेसिंग के लिए असुरक्षित तरीके से शब्दकोश को लागू करता है।

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

अब यहां मुश्किल हिस्सा है। त्रुटि केवल सर्वर ए पर दिखाई दे रही है, और सर्वर बी पर कभी नहीं। हमारी हार्डवेयर टीम के अनुसार, दोनों सर्वर समान हैं। हालांकि थ्रेड टकराव स्वाभाविक रूप से एक यादृच्छिक प्रक्रिया है, फिर भी यह मेरे सर्वर दोनों को समान रूप से प्रभावित करना चाहिए। मैं एक सर्वर पर त्रुटि के 50+ उदाहरण देख रहा हूं, और 0 अन्य पर। यह सांख्यिकीय रूप से असंभव है कि थ्रेड टकराव केवल मेरे सर्वरों में से एक पर होता है जबकि दूसरा त्रुटि मुक्त चल रहा है।

मैं इसे पहले से ही थ्रेड को सुरक्षित बनाने के लिए एप्लिकेशन को संशोधित कर रहा हूं, लेकिन इस त्रुटि के लिए किसी अन्य ऑब्जेक्ट को डालने के लिए अन्य कारणों को कैसे फेंक दिया जा सकता है?

+0

क्या आप वाकई लोड बैलेंसर सर्वर बी को अनुरोध भेजता है? संभवतः यह केवल पहले सर्वर को प्रभावित करता है। –

+0

शायद एक सर्वर में 32-बिट ओएस और दूसरा 64-बिट है? –

+0

@ petro.sidlovskyy मैंने पुष्टि की है कि दोनों सर्वरों में लॉग फ़ाइलों पर आधारित यातायात है – Joshua

उत्तर

7

हालांकि धागा टक्कर स्वाभाविक एक यादृच्छिक प्रक्रिया

बिल्कुल नहीं है। यह समय पर गंभीर रूप से निर्भर है। और समय दोहराने योग्य हो सकता है, सिस्टम विशिष्ट पैटर्न में व्यवस्थित होते हैं।माइक्रोसॉफ्ट रिसर्च के सीएईएस जैसे थ्रेड रेस डायग्नोस्टिक टूल थ्रेड के निष्पादन में यादृच्छिक देरी इंजेक्शन द्वारा काम करता है। सिस्टम को इस तरह के पैटर्न से बाहर निकलने के लिए। कभी-कभी इसे स्वयं ही करता है, लेकिन सप्ताह में केवल एक बार या तो। कि यादृच्छिक है, बस आपको यादृच्छिक नहीं है कि आपको कभी भी समस्या को डीबग करने के लिए एक शॉट दें।

इस प्रकार, एक सर्वर को असफल होने पर और दूसरे का मतलब कुछ भी नहीं है। लोड बैलेंसर शायद इसके साथ कुछ करने के लिए है। आप कभी भी सटीक कारण का पता लगाने में सक्षम नहीं होंगे क्योंकि आप यह नहीं समझ सकते कि 50 बार क्या हुआ। यह पर्याप्त नहीं है।

1

यह शायद दूर-दूर तक पहुंच गया है, लेकिन क्या आपको पता है कि लोड 0 बैलेंसर के माध्यम से दो सर्वरों पर कनेक्शन कनेक्शन बराबर हैं? (मुझे वास्तव में लोड संतुलन कैसे काम करता है, इस बारे में कुछ भी नहीं पता है, इसलिए यह गेट-गो से एक बेवकूफ विचार हो सकता है।)

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

यदि अनुरोध सर्वर ए तक थोड़ा तेज़ी से पहुंचते हैं, तो इससे अंतर हो सकता है जो आपको सीमा त्रुटियों से बाहर कर देता है।

जैसा कि मैंने कहा, शायद दूर-दूर-एक विचार। मैंने सोचा कि यह वहां फेंकने के लिए चोट नहीं पहुंचा सकता है।

0

मैं समझा नहीं सकता कि यह एक सर्वर पर क्यों काम नहीं करता है बल्कि दूसरे पर। हालांकि आपके मुद्दे मल्टीथ्रेडिंग मुद्दे हैं।

आपने गौर किया हो सकता है, यह एक बहु-क्रम वातावरण में जब काम नहीं करेगा:

if (!dict.ContainsKey("myKey")) 
    dict.Add("myKey", value); 

ही लागू होती है:

if (dict.ContainsKey("myKey")) 
    return dict["myKey"]; 

आप क्या आश्चर्य हो सकता है कि TryGetValue सुरक्षित थ्रेड नहीं है या तो:

MyObject obj; 
return dict.TryGetValue("myKey", out obj) ? obj : null; 

संदर्भ: http://www.grumpydev.com/2010/02/25/thread-safe-dictionarytkeytvalue/

0,123,
+0

यह वास्तव में आपको आश्चर्यचकित नहीं करना चाहिए क्योंकि वे पहले मामले में थ्रेड सुरक्षित संग्रह नहीं हैं? – Kurru

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