MongoDB: ข้อกำหนดของ RAM


20

มันเพียงพอที่จะมีดัชนีทั้งหมดในหน่วยความจำ / ram หรือ mongodb ยังพยายามจัดสรร ram ให้มากที่สุดเท่าที่จะทำได้เพื่อจัดเก็บแม้กระทั่งข้อมูลสำหรับการอ่านที่รวดเร็วหรือไม่?

ฉันต้องการเรียกใช้แอปพลิเคชัน mongodb + อื่น ๆ และดูเหมือนว่า mongodb เป็นแอปพลิเคชั่นเดียวที่ไม่อนุญาตให้ฉันกำหนดช่วงของ RAM เพื่อบอกว่า "max_memory_allocated_or_reserved = 8GB"

หากไม่มีวิธีที่จะทำเช่นนั้นฉันควรจะอธิบายกับนักฆ่าอุ้มว่า mongod เป็นกระบวนการ "ไม่ดี" ซึ่งไม่ใช่แนวปฏิบัติที่ดีที่สุดในความคิดของฉัน ...

คำตอบ:


18

เหตุผลที่แท้จริงว่าทำไมคุณไม่สามารถทำตามที่คุณถามได้ (จำกัด หน่วยความจำ) เพราะ MongoDB ไม่จัดการหน่วยความจำที่ใช้โดยตรง - ทำให้ระบบปฏิบัติการทำได้ MongoDB เพียงหน่วยความจำแมปข้อมูลทั้งหมดแล้วมีหน้าระบบปฏิบัติการในและนอกหน่วยความจำตามต้องการ เป็นผลให้ไม่มีการจัดการโดยตรงของจำนวนเงินที่ใช้ไปได้จนกว่า MongoDB จะดำเนินการนี้ในวิธีที่แตกต่างอย่างสิ้นเชิงหรือระบบปฏิบัติการอนุญาต (ไม่สามารถทำได้ใน Linux ตั้งแต่ 2.4 วัน)

วิธีเดียวที่จะแยกทรัพยากรอย่างแท้จริงในปัจจุบันคือการใช้โซลูชันการจำลองเสมือนและแยก MongoDB ใน VM ของตัวเอง ใช่มีค่าใช้จ่ายที่เกี่ยวข้อง (แม้ว่าไฮเปอร์ไวเซอร์ได้รับมากขึ้น) แต่ในขณะนี้คือราคาที่ต้องจ่ายสำหรับการควบคุมทรัพยากรระดับนั้น

ในแง่ของ OOM Killer แม้ว่าจะไม่มีกระบวนการอื่นใดบนโฮสต์ตราบใดที่ชุดข้อมูลและดัชนีโดยรวมของคุณมีหน่วยความจำเกินกว่าที่มีอยู่ MongoDB ก็สามารถแก้ไขปัญหา OOM Killer ได้ นี่เป็นเพราะข้อมูลถูกเพจออกจากหน่วยความจำ - ถ้าไม่มีความกดดันหน่วยความจำ (ไม่มีสิ่งใดต้องการหน่วยความจำ Resident) และคุณยังคงเพิ่ม / สัมผัสข้อมูลใหม่และดัชนีใหม่ ๆ ในที่สุดมันก็จะกิน RAM ที่มีอยู่ทั้งหมด ดังนั้นคำแนะนำให้กำหนดค่าการสลับบางอย่างเสมอเมื่อรัน MongoDB:

https://docs.mongodb.com/manual/administration/production-notes/#swap

แน่นอนว่าข้อมูล LRU จะถูกเพจก่อนกระบวนการอื่นอาจใช้ res mem ได้เช่นกัน แต่แนวคิดนี้ยังคงมีผลบังคับใช้เว้นแต่คุณจะโหลดข้อมูลของคุณที่ตั้งไว้ในหน่วยความจำ สิ่งที่ดีที่สุดที่ควรทำหากคุณกังวลคือนำไปไว้ใน MMS และติดตามการใช้งานเมื่อเวลาผ่านไป:

http://mms.mongodb.com

อัปเดต: สิงหาคม 2558

ตั้งแต่ฉันเขียนคำตอบนี้สิ่งต่าง ๆ ได้ย้ายไปบ้างและข้อมูลค่อนข้างล้าสมัย ตัวอย่างเช่น Linux มีcgroupsและเทคโนโลยีที่เกี่ยวข้อง ( เช่นDocker container ) ที่ครบกำหนดจนถึงจุดที่อนุญาตให้คุณแยกและ จำกัด ทรัพยากร ( รวมถึงหน่วยความจำ ) ที่ใช้โดยกระบวนการใด ๆ ในสภาพแวดล้อมการผลิตแม้กระทั่งที่ใช้ การแมปหน่วยความจำเช่น MongoDB

นอกจากนี้ด้วยการมีเอนจิ้นการจัดเก็บใหม่นอกเหนือจาก MMAP เช่น WiredTiger ใน MongoDB 3.0+ คุณสามารถใช้ฟังก์ชันการทำงานในตัวเพื่อจำกัด ขนาดแคชสำหรับ MongoDB ดังนั้นความต้องการของ RAM ในตอนนี้จะขึ้นอยู่กับวิธีที่คุณเลือกกำหนดค่า MongoDB สภาพแวดล้อมที่คุณใช้และเครื่องมือเก็บข้อมูลที่คุณเลือก


เกี่ยวกับ WiredTiger: " The storage.wiredTiger.engineConfig.cacheSizeGB จะ จำกัด ขนาดของแคช WiredTiger เท่านั้นไม่รวมจำนวนหน่วยความจำทั้งหมดที่ใช้โดย mongod แคช WiredTiger เป็นเพียงองค์ประกอบหนึ่งของ RAM ที่ MongoDB ใช้โดยอัตโนมัติ หน่วยความจำฟรีบนเครื่องผ่านแคชของระบบแฟ้ม ... "
Stefan Rogin

ถูกต้อง แต่สามารถพูดได้เหมือนกันว่าแอปพลิเคชันใด ๆ ที่หน้าข้อมูลจากดิสก์แคช FS ไม่ได้เป็นวิธีการแคชหลักสำหรับข้อมูลอีกต่อไปเมื่อมันเคยมีไฟล์ที่แมปหน่วยความจำในเครื่องมือจัดเก็บ MMAP
Adam C

6

MongoDB จะใช้หน่วยความจำว่างที่มีอยู่สำหรับการแคชและสลับไปยังดิสก์ตามต้องการเพื่อให้หน่วยความจำกับแอปพลิเคชันอื่นบนเซิร์ฟเวอร์เดียวกัน เพื่อประสิทธิภาพที่ดีที่สุดคุณจะต้องมี RAM เพียงพอที่จะเก็บดัชนีและข้อมูลที่ใช้บ่อย ("ชุดการทำงาน") ในหน่วยความจำ

การอ่านที่เป็นประโยชน์:


3

มีการเปลี่ยนแปลงบางสิ่งในปีเกี่ยวกับ MongoDB

TL; DR

หากเก็บรักษาเครื่องยนต์ MMAPv1 จะถูกใช้ใน MongoDB working setขนาดต้องพอดีแรม https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

หากเก็บรักษาเครื่องยนต์ WiredTiger จะถูกใช้ใน MongoDB, ไม่จำเป็นต้องกังวลเกี่ยวกับแรมคือเหมาะสำหรับworking setหรือไม่ https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

การวินิจฉัยหน่วยความจำสำหรับเอ็นจิน WiredTiger Storage

ขนาดชุดการทำงานของฉันต้องพอดีกับ RAM หรือไม่

เลขที่

ฉันจะคำนวณ RAM ที่ฉันต้องการสำหรับแอปพลิเคชันของฉันได้อย่างไร

ด้วย WiredTiger นั้น MongoDB ใช้ทั้งแคชภายใน WiredTiger และแคชของระบบไฟล์

เปลี่ยนเป็นเวอร์ชั่น 3.2: เริ่มต้นใน MongoDB 3.2 โดยค่าเริ่มต้นแคชภายใน WiredTiger จะใช้ขนาดใหญ่กว่า:

60% ของ RAM ลบ 1 GB หรือ 1 GB


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