मेरे पास निम्न कॉन्फ़िगरेशन है:
- एक मेजबान मशीन जो तीन डॉकटर कंटेनर चलाती है:
- MongoDB
- Redis
- डेटा स्टोर करने के लिए पिछले दो कंटेनरों का उपयोग करके एक प्रोग्राम
Redis और MongoDB दोनों का उपयोग बड़ी मात्रा में डेटा संग्रहीत करने के लिए किया जाता है। मुझे पता है कि रेडिस को अपना सारा डेटा रैम में रखना होगा और मैं इसके साथ ठीक हूं। दुर्भाग्य से, क्या होता है कि मोंगो बहुत सारी रैम लेना शुरू कर देता है और जैसे ही होस्ट रैम भर जाता है (हम यहां 32 जीबी के बारे में बात कर रहे हैं) या तो मोंगो या रेडिस क्रैश हो जाते हैं।
मैंने इस बारे में निम्नलिखित पिछले प्रश्न पढ़े हैं:
- MongoDB RAM का उपयोग सीमित करें : जाहिरा तौर पर अधिकांश RAM WiredTiger कैश द्वारा उपयोग किया जाता है
- MongoDB सीमा मेमोरी : यहाँ स्पष्ट रूप से समस्या लॉग डेटा था
- MongoDB में RAM मेमोरी के उपयोग को सीमित करें: यहां वे मोंगो की मेमोरी को सीमित करने का सुझाव देते हैं ताकि वह अपने कैश / लॉग / डेटा के लिए थोड़ी मात्रा में मेमोरी का उपयोग करे
- MongoDB बहुत अधिक मेमोरी का उपयोग कर रहा है : यहां वे कहते हैं कि यह वायर्डटाइगर कैशिंग सिस्टम है जो तेजी से पहुंच प्रदान करने के लिए अधिक से अधिक रैम का उपयोग करता है। वे भी राज्य करते हैं
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- क्या मैंगोडब मेमोरी उपयोग को सीमित करने का कोई विकल्प है? : कैशिंग फिर से, वे भी जोड़ते हैं
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
- 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.
- MongoDB द्वारा उपयोग की जाने वाली कैशिंग कैसे जारी करें? : 5 में के रूप में एक ही जवाब।
अब इन सभी उत्तरों से मुझे जो समझ में आता है वह यह है:
- तेज पहुंच के लिए यह बेहतर होगा कि रैम में सभी सूचकांकों को फिट किया जा सके। हालाँकि, मेरे मामले में, मैं आंशिक रूप से डिस्क पर रहने वाले सूचकांकों के साथ ठीक हूं क्योंकि मेरे पास काफी तेज एसएसडी है।
- राम को ज्यादातर मोंगो द्वारा कैशिंग के लिए उपयोग किया जाता है।
इसे देखते हुए, मैं मोंगो से अपेक्षा कर रहा था कि वे अधिक से अधिक रैम स्पेस का उपयोग करने की कोशिश करें, लेकिन कुछ रैम स्पेस के साथ कार्य करने में सक्षम होने और डिस्क से अधिकांश चीजों को लाने के लिए। हालाँकि, मैं मोंगो डॉकटर कंटेनर की मेमोरी (उदाहरण के लिए 8GB तक) को सीमित करता हूं, उपयोग करके --memory
और --memory-swap
, लेकिन डिस्क से सामान लाने के बजाय, मैंगो जैसे ही मेमोरी से बाहर निकला, दुर्घटनाग्रस्त हो गया।
मैं केवल उपलब्ध स्मृति का उपयोग करने के लिए और डिस्क से सब कुछ लाने के लिए मैंगो को कैसे मजबूर कर सकता हूं जो स्मृति में फिट नहीं होता है?
dmesg
अप्रत्याशित शटडाउन के साथ सहसंबंधी हैं? डॉकर के साथ सबसे अधिक संभावना यह है कि कंटेनर में प्रक्रियाएं कंटेनर सीमा के बजाय उपलब्ध समग्र रैम का पता लगाती हैं।
mongod
एक कंटेनर (में lxc
, cgroups
, डोकर, आदि) कि है नहीं एक प्रणाली में रैम उपलब्ध सभी के लिए उपयोग किया है, तो आप सेट करना होगा storage.wiredTiger.engineConfig.cacheSizeGB
रैम उपलब्ध में की राशि से कम एक मूल्य के बर्तन। सही मात्रा कंटेनर में चलने वाली अन्य प्रक्रियाओं पर निर्भर करती है, लेकिन आम तौर पर 50% रैम माइनस 1 जीबी के डिफ़ॉल्ट मूल्य से अधिक नहीं होनी चाहिए।