MongoDB สิ้นสุดลงเมื่อหน่วยความจำไม่เพียงพอ


11

ฉันมีการกำหนดค่าต่อไปนี้:

  • เครื่องโฮสต์ที่รันคอนเทนเนอร์ docker สามตัว:
    • MongoDB
    • Redis
    • โปรแกรมที่ใช้สองคอนเทนเนอร์ก่อนหน้าเพื่อจัดเก็บข้อมูล

ทั้ง Redis และ MongoDB ใช้เพื่อจัดเก็บข้อมูลจำนวนมาก ฉันรู้ว่า Redis ต้องการเก็บข้อมูลทั้งหมดไว้ใน RAM และฉันก็โอเคกับเรื่องนี้ น่าเสียดายสิ่งที่เกิดขึ้นคือ mongo เริ่มใช้ RAM เป็นจำนวนมากและทันทีที่โฮสต์ RAM เต็ม (เรากำลังพูดถึง 32GB ที่นี่) ไม่ว่าจะเกิดจาก mongo หรือ Redis

ฉันได้อ่านคำถามก่อนหน้านี้เกี่ยวกับเรื่องนี้:

  1. จำกัด การใช้ RAM MongoDB : ดูเหมือนว่า RAM ส่วนใหญ่จะถูกใช้โดยแคช WiredTiger
  2. หน่วยความจำที่ จำกัด MongoDB : ที่นี่เห็นได้ชัดว่าปัญหาคือข้อมูลบันทึก
  3. จำกัด การใช้หน่วยความจำ RAM ใน MongoDB : ที่นี่พวกเขาแนะนำให้ จำกัด หน่วยความจำของ Mongo เพื่อที่จะใช้หน่วยความจำขนาดเล็กสำหรับแคช / บันทึก / ข้อมูล
  4. MongoDB ใช้หน่วยความจำมากเกินไป : ที่นี่พวกเขาบอกว่ามันเป็นระบบแคช WiredTiger ซึ่งมีแนวโน้มที่จะใช้ RAM มากที่สุดเท่าที่จะเป็นไปได้เพื่อให้เข้าถึงได้เร็วขึ้น พวกเขายังระบุit's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
  5. มีตัวเลือกในการ จำกัด การใช้งานหน่วยความจำของ 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
  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. สำหรับการเข้าถึงที่เร็วขึ้นมันจะดีกว่าสำหรับ Mongo ที่จะใส่ดัชนีทั้งหมดใน RAM อย่างไรก็ตามในกรณีของฉันฉันใช้งานได้ดีกับดัชนีบางส่วนที่อยู่บนดิสก์เนื่องจากฉันมี SSD ที่ค่อนข้างเร็ว
  2. แรมส่วนใหญ่จะใช้สำหรับการแคชโดย Mongo

เมื่อพิจารณาถึงสิ่งนี้ฉันคาดหวังว่า Mongo จะพยายามใช้พื้นที่ RAM มากที่สุดเท่าที่จะเป็นไปได้ แต่ความสามารถในการทำงานยังมีพื้นที่ RAM น้อยและดึงข้อมูลส่วนใหญ่จากดิสก์ อย่างไรก็ตามฉัน จำกัด หน่วยความจำของคอนเทนเนอร์ mongo Docker (เช่น 8GB) โดยใช้--memoryและ--memory-swapแต่แทนที่จะดึงข้อมูลจากดิสก์แล้ว mongo ก็พังเมื่อหน่วยความจำไม่เพียงพอ

ฉันจะบังคับให้ mongo ใช้เฉพาะหน่วยความจำที่มีอยู่และดึงข้อมูลจากดิสก์ทุกอย่างที่ไม่พอดีกับหน่วยความจำได้อย่างไร


มันถูกเรียกว่า OOM killer MongoDB ถูกออกแบบมาเพื่อทำงานบนฮาร์ดแวร์สินค้า ฉันไม่เคยใช้ทรัพยากรที่มีอยู่อย่าง จำกัด หากคุณมีฐานข้อมูลขนาดเล็กเท่านั้น MongoDB ไม่ใช่ตัวเลือกที่สมบูรณ์แบบ หากคุณมีฐานข้อมูลขนาดใหญ่ (รูปสามล้านถึงพันล้านรายการ) การ จำกัด ทรัพยากรเป็นตัวเลือกที่ไม่ดี ตามปัญหาของคุณ: คุณไม่สามารถกินเค้กและกินมันได้ เลือก.
Markus W Mahlberg

หากกำหนดค่าอย่างถูกต้อง MongoDB ไม่ควรผิดพลาดเมื่อหน่วยความจำไม่เพียงพอ คุณสามารถยืนยันเวอร์ชันของเซิร์ฟเวอร์ MongoDB และ O / S ที่คุณกำลังใช้งานและอธิบายรายละเอียดเพิ่มเติมได้หรือไม่ ตัวอย่างเช่นมีข้อความใด ๆ ในบันทึก MongoDB หรือdmesgสัมพันธ์กับการปิดระบบที่ไม่คาดคิดหรือไม่? ความเป็นไปได้ที่เป็นไปได้มากที่สุดที่นักเทียบท่าคือกระบวนการในคอนเทนเนอร์จะตรวจจับ RAM โดยรวมที่มีอยู่แทนที่จะเป็นขีด จำกัด คอนเทนเนอร์
Stennie

ตามหมายเหตุการผลิต MongoDB : ถ้าคุณเรียกใช้mongodในคอนเทนเนอร์ ( lxc,, cgroupsDocker, ฯลฯ ) ที่ไม่สามารถเข้าถึง RAM ทั้งหมดที่มีอยู่ในระบบคุณต้องตั้งค่าstorage.wiredTiger.engineConfig.cacheSizeGBให้น้อยกว่าจำนวน RAM ที่มีอยู่ใน ภาชนะ จำนวนที่แน่นอนขึ้นอยู่กับกระบวนการอื่น ๆ ที่ทำงานอยู่ในคอนเทนเนอร์ แต่โดยทั่วไปไม่ควรเกินกว่าค่าเริ่มต้นที่ 50% ของ RAM ลบ 1GB
Stennie

คำตอบ:


9

เป็นต่อ MongoDB BOL นี่ เปลี่ยนในรุ่น 3.4:ค่าสามารถช่วงจาก256MBไปและสามารถเป็น10TB floatนอกจากนี้ค่าเริ่มต้นก็เปลี่ยนไปเช่นกัน

เริ่มต้นใน3.4การWiredTigerแคชภายในโดยค่าเริ่มต้นจะใช้ขนาดใหญ่ของทั้งสอง:

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

ด้วยWiredTiger, MongoDB ใช้ทั้งWiredTiger และinternal cachefilesystem cache

ผ่านทางfilesystem cacheMongoDB จะใช้หน่วยความจำฟรีทั้งหมดที่ไม่ได้ใช้WiredTiger cacheหรือโดยกระบวนการอื่นโดยอัตโนมัติ

storage.wiredTiger.engineConfig.cacheSizeGBจำกัด ขนาดของWiredTigerแคชภายใน ระบบปฏิบัติการจะใช้หน่วยความจำว่างที่มีอยู่สำหรับแคชของระบบไฟล์ซึ่งช่วยให้ไฟล์ข้อมูล MongoDB ที่ถูกบีบอัดอยู่ในหน่วยความจำ นอกจากนี้operating systemจะใช้ RAM ว่างใด ๆ เพื่อบัฟเฟอร์บล็อกระบบไฟล์และแคชระบบไฟล์

เพื่อรองรับผู้บริโภคRAM เพิ่มเติมคุณอาจต้องลดWiredTigerขนาดแคชภายใน

สำหรับการอ้างอิงเอ็นจิ้น WiredTiger Storage Engineและไฟล์ตัวเลือกการกำหนดค่าเพิ่มเติมของคุณ


4

ที่จริงแล้วถ้าคุณดูอย่างใกล้ชิดไม่ใช่ mongod ที่ตายเพื่อ "หมดความทรงจำ" มันเป็นเคอร์เนลผู้จัดการ OOM (หน่วยความจำไม่เพียงพอ) ที่ฆ่า mongod เพราะมันใช้หน่วยความจำมากที่สุด

ใช่คุณสามารถลองแก้ปัญหาด้วยพารามิเตอร์การกำหนดค่าmonngodb cacheSizeGBแต่ในสภาพแวดล้อมของคอนเทนเนอร์จะดีกว่าถ้าใช้cgroupsเพื่อ จำกัด ทรัพยากรที่คอนเทนเนอร์สามตัวใด ๆ ของคุณได้รับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.