ฉันมีการกำหนดค่าต่อไปนี้:
- เครื่องโฮสต์ที่รันคอนเทนเนอร์ docker สามตัว:
- MongoDB
- Redis
- โปรแกรมที่ใช้สองคอนเทนเนอร์ก่อนหน้าเพื่อจัดเก็บข้อมูล
ทั้ง Redis และ MongoDB ใช้เพื่อจัดเก็บข้อมูลจำนวนมาก ฉันรู้ว่า Redis ต้องการเก็บข้อมูลทั้งหมดไว้ใน RAM และฉันก็โอเคกับเรื่องนี้ น่าเสียดายสิ่งที่เกิดขึ้นคือ mongo เริ่มใช้ RAM เป็นจำนวนมากและทันทีที่โฮสต์ RAM เต็ม (เรากำลังพูดถึง 32GB ที่นี่) ไม่ว่าจะเกิดจาก mongo หรือ Redis
ฉันได้อ่านคำถามก่อนหน้านี้เกี่ยวกับเรื่องนี้:
- จำกัด การใช้ RAM MongoDB : ดูเหมือนว่า RAM ส่วนใหญ่จะถูกใช้โดยแคช WiredTiger
- หน่วยความจำที่ จำกัด MongoDB : ที่นี่เห็นได้ชัดว่าปัญหาคือข้อมูลบันทึก
- จำกัด การใช้หน่วยความจำ RAM ใน MongoDB : ที่นี่พวกเขาแนะนำให้ จำกัด หน่วยความจำของ Mongo เพื่อที่จะใช้หน่วยความจำขนาดเล็กสำหรับแคช / บันทึก / ข้อมูล
- MongoDB ใช้หน่วยความจำมากเกินไป : ที่นี่พวกเขาบอกว่ามันเป็นระบบแคช WiredTiger ซึ่งมีแนวโน้มที่จะใช้ RAM มากที่สุดเท่าที่จะเป็นไปได้เพื่อให้เข้าถึงได้เร็วขึ้น พวกเขายังระบุ
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- มีตัวเลือกในการ จำกัด การใช้งานหน่วยความจำของ mongodb หรือไม่? : แคชอีกครั้งพวกเขายังเพิ่ม
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
ตอนนี้สิ่งที่ฉันดูเหมือนจะเข้าใจจากคำตอบทั้งหมดเหล่านี้คือ:
- สำหรับการเข้าถึงที่เร็วขึ้นมันจะดีกว่าสำหรับ Mongo ที่จะใส่ดัชนีทั้งหมดใน RAM อย่างไรก็ตามในกรณีของฉันฉันใช้งานได้ดีกับดัชนีบางส่วนที่อยู่บนดิสก์เนื่องจากฉันมี SSD ที่ค่อนข้างเร็ว
- แรมส่วนใหญ่จะใช้สำหรับการแคชโดย Mongo
เมื่อพิจารณาถึงสิ่งนี้ฉันคาดหวังว่า Mongo จะพยายามใช้พื้นที่ RAM มากที่สุดเท่าที่จะเป็นไปได้ แต่ความสามารถในการทำงานยังมีพื้นที่ RAM น้อยและดึงข้อมูลส่วนใหญ่จากดิสก์ อย่างไรก็ตามฉัน จำกัด หน่วยความจำของคอนเทนเนอร์ mongo Docker (เช่น 8GB) โดยใช้--memory
และ--memory-swap
แต่แทนที่จะดึงข้อมูลจากดิสก์แล้ว mongo ก็พังเมื่อหน่วยความจำไม่เพียงพอ
ฉันจะบังคับให้ mongo ใช้เฉพาะหน่วยความจำที่มีอยู่และดึงข้อมูลจากดิสก์ทุกอย่างที่ไม่พอดีกับหน่วยความจำได้อย่างไร
dmesg
สัมพันธ์กับการปิดระบบที่ไม่คาดคิดหรือไม่? ความเป็นไปได้ที่เป็นไปได้มากที่สุดที่นักเทียบท่าคือกระบวนการในคอนเทนเนอร์จะตรวจจับ RAM โดยรวมที่มีอยู่แทนที่จะเป็นขีด จำกัด คอนเทนเนอร์
mongod
ในคอนเทนเนอร์ ( lxc
,, cgroups
Docker, ฯลฯ ) ที่ไม่สามารถเข้าถึง RAM ทั้งหมดที่มีอยู่ในระบบคุณต้องตั้งค่าstorage.wiredTiger.engineConfig.cacheSizeGB
ให้น้อยกว่าจำนวน RAM ที่มีอยู่ใน ภาชนะ จำนวนที่แน่นอนขึ้นอยู่กับกระบวนการอื่น ๆ ที่ทำงานอยู่ในคอนเทนเนอร์ แต่โดยทั่วไปไม่ควรเกินกว่าค่าเริ่มต้นที่ 50% ของ RAM ลบ 1GB