MongoDB ไม่ได้ใช้ RAM ที่มีอยู่ทั้งหมด


9

ฉันมีข้อมูลประมาณ 200 GB ที่เก็บอยู่ในคลัสเตอร์ mongo หน่วยความจำกายภาพในหนึ่งในอินสแตนซ์ที่เรียกใช้ mongo คือ 8GB ไม่มีสิ่งอื่นใดที่จะตามมาในอินสแตนซ์นี้ ใกล้ที่สุดเท่าที่ฉันสามารถเข้าใจได้จากเอกสารของ Mongo (เช่นนี้: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ) ซึ่งหมายความว่ากระบวนการ Mongo ควรใช้ประมาณ 100% ของ หน่วยความจำกายภาพที่มีอยู่ แต่ถ้าคุณดูผลลัพธ์ต่อไปนี้จากtopคำสั่งคุณจะเห็นว่าอินสแตนซ์ mongod นั้นใช้หน่วยความจำภายใน 2GB เท่านั้นและมีหน่วยความจำกายภาพฟรี 2GB เต็มรูปแบบที่มีอยู่ซึ่งไม่ได้ใช้งานเลย

บางคนสามารถอธิบายพฤติกรรมนี้ให้ฉันฟังได้ไหม ทำไมถึงมีหน่วยความจำ 2GB ฟรี

top เอาท์พุท:

top - 23:19:43 up 89 days, 20:05,  2 users,  load average: 0.41, 0.55, 0.59
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.0%us,  1.3%sy,  0.0%ni, 93.9%id,  2.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8163664k total,  6131764k used,  2031900k free,    54976k buffers
Swap: 16771848k total,    10604k used, 16761244k free,  5367700k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
 1401 mongodb   20   0  174g 2.0g 1.9g S   23 26.2  18070:55 mongod
 ...

ข้อมูลระบบ:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

หมายเหตุ:

  • มีอีกตัวอย่างหนึ่งในกลุ่มนี้ที่ mongod มีพฤติกรรมตามที่ฉันคาดหวังและใช้หน่วยความจำที่มีอยู่ทั้งหมด
  • เมื่อมองไปที่ mongostat ดูเหมือนว่าจะมีข้อผิดพลาดบางหน้าอยู่เสมอดังนั้นจำนวนหน่วยความจำที่ใช้ควรเพิ่มขึ้น:
  • (ฉันถามคำถามเดียวกันนี้ในกลุ่มผู้ใช้ mongodb-user แต่ไม่ได้รับคำตอบ)

ลินุกซ์ distro อะไร? มันคือ 32 หรือ 64 บิต (แก้ไขคำถามของคุณกับการส่งออกของlsb-release -aและuname -aโปรด)
Philᵀᴹ

ขอบคุณ เพิ่มแล้วunameแต่ฉันไม่ได้lsb-releaseติดตั้ง
Chris W.

คุณดาวน์โหลด MongoDB รุ่น 32 บิตโดยไม่ตั้งใจหรือไม่ ขนาดสูงสุดของอินสแตนซ์ Mongo แบบ 32 บิตคือ 2GB
แอรอน

@ BryceAtNetwork23 ไม่; แน่นอนเรามีมากกว่า 2GB ในจำนวน MongoDb ของเรา (หลายร้อยกิ๊กจริง ๆ )
Chris W.

@ChrisW เขาหมายถึงขนาดหน่วยความจำสูงสุด - ไม่ใช่ขนาดฐานข้อมูล และดูเหมือนว่ามันจะอธิบาย 2GB ดี
rfusca

คำตอบ:


5

ขนาดหน่วยความจำภายในมีจำนวนหน้าในหน่วยความจำจริงโดยmongodกระบวนการ หากนั่นต่ำกว่าหน่วยความจำและข้อมูลที่มีอยู่อย่างมีนัยสำคัญเกินกว่าหน่วยความจำที่มีอยู่ (ของคุณ) มันอาจเป็นกรณีที่ไม่มีหน้าสัมผัสเพียงพอ

หากต้องการตรวจสอบว่าเป็นกรณีนี้หรือไม่คุณควรเรียกใช้free -mผลลัพธ์ควรมีลักษณะดังนี้:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680

ในตัวอย่างของฉันแคชไม่ได้ใกล้เคียงกับผลรวมซึ่งหมายความว่าไม่เพียง แต่มี mongod ไม่ได้สัมผัสหน้าพอแคแคชของระบบแฟ้มยังไม่ได้เต็มไปด้วยหน้าเว็บที่อ่านจากดิสก์โดยทั่วไป

วิธีแก้ปัญหาอย่างรวดเร็วสำหรับคำสั่งนี้คือคำสั่ง touch (เพิ่มใน 2.2) - ควรใช้ด้วยความระมัดระวังในชุดข้อมูลขนาดใหญ่เนื่องจากมันจะพยายามโหลดทุกอย่างลงใน RAM แม้ว่าข้อมูลจะใหญ่เกินไปที่จะใส่ให้พอดี ดิสก์ IO และความผิดพลาดของหน้า) แน่นอนมันจะเติมหน่วยความจำได้อย่างมีประสิทธิภาพแม้ว่า :)

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

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