2012-09-12 15 views
9

मैं दिखाई दे रही है की एक बड़ी संख्या से पीड़ित एक विशाल (~ 200 ++) दोष/सेकंड मेरी mongostat उत्पादन में नंबर, हालांकि बहुत कम ताला%:मोंगो दोष

enter image description here

मेरे मोंगो सर्वर अमेज़न बादल पर m1.large उदाहरणों पर चल रहे हैं, ताकि वे एक रैम ::

root:~# free -tm 
      total  used  free  shared buffers  cached 
Mem:   7700  7654   45   0   0  6848 

जाहिर है, मैं पर्याप्त स्मृति सभी cahing मोंगो के लिए करना चाहता है की जरूरत नहीं है की 7.5GB (जो, btw, डिस्क आईओ के कारण, विशाल CPU उपयोग% में परिणाम)।

मुझे this document मिला जो बताता है कि मेरे परिदृश्य (उच्च गलती, कम ताला%) में, मुझे "पढ़ने को स्केल करना" और "अधिक डिस्क IOPS" की आवश्यकता है।

मैं इस बारे में सलाह ले रहा हूं कि इसे कैसे प्राप्त किया जाए। अर्थात्, मेरे node.js एप्लिकेशन द्वारा निष्पादित विभिन्न संभावित प्रश्नों के बहुत सारे हैं, और मुझे यकीन नहीं है कि बाधा कहां हो रही है। बेशक, मैं

db.setProfilingLevel(1); 

की कोशिश की है हालांकि, इस मुझे इतना मदद नहीं करता है, क्योंकि outputted आँकड़े बस मुझे धीमा क्वेरी दिखा, लेकिन मैं एक मुश्किल समय है कि जो जानकारी में प्रश्न है अनुवाद करने आ रही हैं के कारण पेज दोष ...

आप देख सकते हैं, इस, मेरी प्राथमिक मोंगो सर्वर पर एक विशाल (लगभग 100%) सीपीयू प्रतीक्षा समय में जिसके परिणामस्वरूप है, हालांकि 2x द्वितीयक सर्वर अप्रभावित रहे हैं ...

enter image description here

यहां क्या है मोंगो डॉक्स को पृष्ठ दोषों के बारे में कहना है:

पृष्ठ दोष उस समय की संख्या का प्रतिनिधित्व करते हैं जब मोंगोडीबी को भौतिक स्मृति में स्थित डेटा की आवश्यकता नहीं होती है, और वर्चुअल मेमोरी से पढ़ना आवश्यक है। पेज दोषों की जांच करने के लिए, serverStatus कमांड में extra_info.page_faults मान देखें। यह डेटा केवल लिनक्स सिस्टम पर उपलब्ध है।

अकेले, पेज दोष छोटे हैं और जल्दी से पूर्ण होते हैं; हालांकि, कुल मिलाकर, पेज गलती की बड़ी संख्या आम तौर पर इंगित करती है कि मोंगोडीबी डिस्क से बहुत अधिक डेटा पढ़ रहा है और कई अंतर्निहित कारणों और सिफारिशों को इंगित कर सकता है। कई स्थितियों में, मोंगो डीबी के पढ़ने वाले ताले किसी पृष्ठ की गलती के बाद "उपज" करेंगे, जिससे अन्य प्रक्रियाओं को पढ़ने और ब्लॉकिंग से बचने के लिए अगले पृष्ठ की स्मृति में पढ़ने के लिए इंतजार किया जा सकेगा। यह दृष्टिकोण समरूपता में सुधार करता है, और उच्च मात्रा प्रणाली में यह समग्र थ्रूपुट में भी सुधार करता है।

यदि संभव हो तो, मोंगोडीबी के लिए पहुंच योग्य रैम की मात्रा में वृद्धि पृष्ठ त्रुटियों की संख्या को कम करने में मदद कर सकती है। यदि यह संभव नहीं है, तो आप मोंडोड उदाहरणों के बीच लोड वितरित करने के लिए एक शेर्ड क्लस्टर को तैनात करने और/या अपनी तैनाती में एक या अधिक शर्ट जोड़ने पर विचार करना चाह सकते हैं।

तो, मैं सिफारिश की कमान है, जो बहुत बेकार है की कोशिश की:

PRIMARY> db.serverStatus().extra_info 
{ 
    "note" : "fields vary by platform", 
    "heap_usage_bytes" : 36265008, 
    "page_faults" : 4536924 
} 

बेशक, मैं सर्वर आकार (अधिक रैम) को बढ़ा सकता है, लेकिन यह महंगा है और overkill हो रहा है। मुझे sharding लागू करना चाहिए, लेकिन मैं वास्तव में अनिश्चित हूँ कि संग्रह को किनारे की जरूरत है! इस प्रकार, मुझे अलग-अलग तरीके से अलग करने का तरीका चाहिए जहां दोष हो रहे हैं (कौन से विशिष्ट आदेश दोष पैदा कर रहे हैं)।

सहायता के लिए धन्यवाद।

+1

मुझे पता है कि यह एक पुराना सवाल है, लेकिन कुछ चीजें बाहर निकलती हैं। 'Db.setProfilingLevel (1) 'सेट करने के बाद आपको उन प्रश्नों को लेने और उन्हें' व्याख्या() 'चलाने की आवश्यकता है। सबसे अधिक संभावना है कि ये प्रश्न इंडेक्स का उपयोग नहीं कर रहे हैं और पूर्ण संग्रहण स्कैन कर रहे हैं। निष्क्रिय होने के आपके सेकेंडरी चिंता का एक और कारण है, आपके आवेदन सेटिंग 'गुलाम ओके = सच्चे' के आधार पर सेकंड लोड पर कुछ लोड डालकर मदद मिल सकती है। मैं यह सुनिश्चित कर दूंगा कि आपकी अनुक्रमणिका पहले ठीक है या आप केवल दूसरी बार दुखों को फैल रहे हैं। – hwatkins

उत्तर

6

हम वास्तव में नहीं जानते कि आपका डेटा/अनुक्रमणिका कैसा दिखता है।

फिर भी, मोंगोडीबी अनुकूलन का एक महत्वपूर्ण नियम:
सुनिश्चित करें कि आपकी अनुक्रमणिका रैम में फिट हो। http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-MakesureyourindexescanfitinRAM

मान लें कि आपके दस्तावेज़ छोटे हैं, जितना अधिक आपका कुंजी/दस्तावेज़ अनुपात होगा, उतना ही आपका रैम/डिस्कसाइज़ अनुपात होना चाहिए।

यदि आप कुछ स्कीम को एक साथ लाने के लिए अपनी स्कीमा समायोजित कर सकते हैं, और आपको आवश्यक चाबियों की संख्या को कम कर सकते हैं, जो मदद कर सकते हैं।

+0

ऐसा लगता है कि मैंने "प्रति अनुक्रमणिका एक सूचकांक" पर हिस्सा छोड़ा। मैं अपने स्कीमा के आस-पास इंडेक्स के उपयोग के साथ भी अति उत्साही था, क्योंकि मुझे "राम में फिट होना चाहिए" बाधा से अनजान था। सर्वोत्तम प्रथाओं को अनुक्रमणित करने के बारे में त्वरित प्रश्न हालांकि: किसी क्वेरी को निष्पादित करते समय जो एक प्रकार() या सीमा() का उपयोग करता है, क्या मुझे उन क्षेत्रों पर अनुक्रमणित करना चाहिए? जब मेरे पास कई स्थितियों पर खोज करने वाले प्रश्न हैं (उदाहरण के लिए, {'आयु': 30, 'name': y}, क्या यह तय करने का कोई अच्छा तरीका है कि 2 कॉलम (दोनों?) को अनुक्रमित किया जाना चाहिए? –

+0

भी - db.XX.dropIndexes() को निष्पादित करने के बाद, क्या मुझे ऐसा कुछ भी है जो मुझे संसाधनों को पुनर्प्राप्त करने के लिए करना होगा/मेरे मोंगो सर्वर पर पेज त्रुटियों को रोकना होगा? मैंने अपने सभी इंडेक्स को गिरा दिया और एक और अधिक रूढ़िवादी ढंग से पुनः संशोधित किया, लेकिन मुझे नहीं देख रहा अभी तक कोई सुधार। –

+0

आपके पहले प्रश्न के लिए। आम तौर पर इन चीजों का जवाब देना मुश्किल है। ये निरंतर प्रश्न हैं जो हम पूछते हैं और ट्रेडमार्क जो हम स्कीमा डिज़ाइन के साथ करते हैं। यौगिक इंडेक्स के लिए, यदि आप फ़ील्ड ए, या ए, बी या ए, बी, सी तो आप [ए, बी, सी] पर एक कंपाउंड इंडेक्स बना सकते हैं। यदि आप फिर बी या सी पर खोज करते हैं, तो यह आपकी मदद नहीं करेगा। Http://www.mongodb.org/display/DOCS/इंडेक्स # इंडेक्स-कंपाउंडकेस – z5h

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