स्मृति से बाहर होने पर MongoDB समाप्त हो जाता है


11

मेरे पास निम्न कॉन्फ़िगरेशन है:

  • एक मेजबान मशीन जो तीन डॉकटर कंटेनर चलाती है:
    • MongoDB
    • Redis
    • डेटा स्टोर करने के लिए पिछले दो कंटेनरों का उपयोग करके एक प्रोग्राम

Redis और MongoDB दोनों का उपयोग बड़ी मात्रा में डेटा संग्रहीत करने के लिए किया जाता है। मुझे पता है कि रेडिस को अपना सारा डेटा रैम में रखना होगा और मैं इसके साथ ठीक हूं। दुर्भाग्य से, क्या होता है कि मोंगो बहुत सारी रैम लेना शुरू कर देता है और जैसे ही होस्ट रैम भर जाता है (हम यहां 32 जीबी के बारे में बात कर रहे हैं) या तो मोंगो या रेडिस क्रैश हो जाते हैं।

मैंने इस बारे में निम्नलिखित पिछले प्रश्न पढ़े हैं:

  1. MongoDB RAM का उपयोग सीमित करें : जाहिरा तौर पर अधिकांश RAM WiredTiger कैश द्वारा उपयोग किया जाता है
  2. MongoDB सीमा मेमोरी : यहाँ स्पष्ट रूप से समस्या लॉग डेटा था
  3. MongoDB में RAM मेमोरी के उपयोग को सीमित करें: यहां वे मोंगो की मेमोरी को सीमित करने का सुझाव देते हैं ताकि वह अपने कैश / लॉग / डेटा के लिए थोड़ी मात्रा में मेमोरी का उपयोग करे
  4. MongoDB बहुत अधिक मेमोरी का उपयोग कर रहा है : यहां वे कहते हैं कि यह वायर्डटाइगर कैशिंग सिस्टम है जो तेजी से पहुंच प्रदान करने के लिए अधिक से अधिक रैम का उपयोग करता है। वे भी राज्य करते हैंit's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
  5. क्या मैंगोडब मेमोरी उपयोग को सीमित करने का कोई विकल्प है? : कैशिंग फिर से, वे भी जोड़ते हैंMongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
  6. MongoDB सूचकांक / RAM संबंध : उद्धरण:MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
  7. MongoDB द्वारा उपयोग की जाने वाली कैशिंग कैसे जारी करें? : 5 में के रूप में एक ही जवाब।

अब इन सभी उत्तरों से मुझे जो समझ में आता है वह यह है:

  1. तेज पहुंच के लिए यह बेहतर होगा कि रैम में सभी सूचकांकों को फिट किया जा सके। हालाँकि, मेरे मामले में, मैं आंशिक रूप से डिस्क पर रहने वाले सूचकांकों के साथ ठीक हूं क्योंकि मेरे पास काफी तेज एसएसडी है।
  2. राम को ज्यादातर मोंगो द्वारा कैशिंग के लिए उपयोग किया जाता है।

इसे देखते हुए, मैं मोंगो से अपेक्षा कर रहा था कि वे अधिक से अधिक रैम स्पेस का उपयोग करने की कोशिश करें, लेकिन कुछ रैम स्पेस के साथ कार्य करने में सक्षम होने और डिस्क से अधिकांश चीजों को लाने के लिए। हालाँकि, मैं मोंगो डॉकटर कंटेनर की मेमोरी (उदाहरण के लिए 8GB तक) को सीमित करता हूं, उपयोग करके --memoryऔर --memory-swap, लेकिन डिस्क से सामान लाने के बजाय, मैंगो जैसे ही मेमोरी से बाहर निकला, दुर्घटनाग्रस्त हो गया।

मैं केवल उपलब्ध स्मृति का उपयोग करने के लिए और डिस्क से सब कुछ लाने के लिए मैंगो को कैसे मजबूर कर सकता हूं जो स्मृति में फिट नहीं होता है?


इसे OOM किलर कहा जाता है। MongoDB कमोडिटी हार्डवेयर पर चलने के लिए डिज़ाइन किया गया है। मैं इसे कृत्रिम रूप से सीमित संसाधनों पर नहीं चलाऊंगा। यदि आपके पास केवल एक छोटा डेटाबेस है, तो MongoDB आदर्श विकल्प नहीं है। यदि आपके पास एक बड़ा डेटाबेस (तीन से लाख से अरब की प्रविष्टियाँ) हैं तो संसाधनों को सीमित करना एक बुरा विकल्प है। आपकी समस्या के अनुसार: आप केक नहीं खा सकते हैं। चुनें।
मार्कस डब्ल्यू महलबर्ग

यदि सही तरीके से कॉन्फ़िगर किया गया है, तो स्मृति से बाहर होने पर MongoDB क्रैश नहीं होना चाहिए। क्या आप MongoDB सर्वर के विशिष्ट संस्करण की पुष्टि कर सकते हैं और O / S जो आप उपयोग कर रहे हैं और क्रैश का अधिक विस्तार से वर्णन कर सकते हैं? उदाहरण के लिए, क्या MongoDB लॉग में कोई संदेश हैं या dmesgअप्रत्याशित शटडाउन के साथ सहसंबंधी हैं? डॉकर के साथ सबसे अधिक संभावना यह है कि कंटेनर में प्रक्रियाएं कंटेनर सीमा के बजाय उपलब्ध समग्र रैम का पता लगाती हैं।
स्टेनी

के अनुसार MongoDB प्रोडक्शन नोट्स : यदि आप चलाने के mongodएक कंटेनर (में lxc, cgroups, डोकर, आदि) कि है नहीं एक प्रणाली में रैम उपलब्ध सभी के लिए उपयोग किया है, तो आप सेट करना होगा storage.wiredTiger.engineConfig.cacheSizeGBरैम उपलब्ध में की राशि से कम एक मूल्य के बर्तन। सही मात्रा कंटेनर में चलने वाली अन्य प्रक्रियाओं पर निर्भर करती है, लेकिन आम तौर पर 50% रैम माइनस 1 जीबी के डिफ़ॉल्ट मूल्य से अधिक नहीं होनी चाहिए।
स्टेनी

जवाबों:


9

के अनुसार MongoDB बोल यहाँ संस्करण 3.4 में परिवर्तित: मान से रेंज कर सकते 256MBकरने के लिए 10TBऔर एक हो सकता है float। इसके अलावा, डिफ़ॉल्ट मान भी बदल गया है।

WiredTiger आंतरिक कैश, डिफ़ॉल्ट रूप से, प्रारंभ करना 3.4, दोनों में से किसी एक का उपयोग करेगा:

50% of RAM minus 1 GB, or
256 MB.

WiredTigerMongoDB के साथ , WiredTiger internal cache और the दोनों का उपयोग करता है filesystem cache

के माध्यम से filesystem cache, MongoDB स्वचालित रूप से सभी मुफ्त मेमोरी का उपयोग करता है जो कि WiredTiger cacheया अन्य प्रक्रियाओं द्वारा उपयोग नहीं किया जाता है ।

Storage.wiredTiger.engineConfig.cacheSizeGB के आकार को सीमित WiredTigerआंतरिक कैश। ऑपरेटिंग सिस्टम फाइलसिस्टम कैश के लिए उपलब्ध मुफ्त मेमोरी का उपयोग करेगा, जो संकुचित MongoDB डेटा फ़ाइलों को मेमोरी में रहने की अनुमति देता है। इसके अलावा, operating systemकिसी भी मुफ्त रैम का उपयोग फाइल सिस्टम ब्लॉक और फाइल सिस्टम कैश को बफर करने के लिए करेगा।

के अतिरिक्त उपभोक्ताओं को समायोजित करने के लिए रैम , आपको WiredTigerआंतरिक कैश आकार को कम करना पड़ सकता है ।

आगे अपने रेफरी WiredTiger संग्रहण इंजन और कॉन्फ़िगरेशन फ़ाइल विकल्प के लिए


4

वास्तव में, यदि आप निकट से देखते हैं, तो यह मोनगोड नहीं है जो "आउट-ऑफ-मेमोरी" के लिए मर जाता है, यह कर्नेल ओओएम (मेमोरी से बाहर) प्रबंधक है जो मोंगोड को मारता है, क्योंकि इसमें सबसे बड़ा मेमोरी उपयोग है।

हां, आप मोनगोडब कॉन्फ़िगरेशन पैरामीटर cacheSizeGB के साथ समस्या को हल करने का प्रयास कर सकते हैं , लेकिन कंटेनर वातावरण में, संसाधनों को सीमित करने के लिए cgroups का उपयोग करना बेहतर होता है जो आपके तीन कंटेनरों में से किसी को मिलता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.