MongoDB: Persyaratan RAM

20

Apakah cukup untuk memiliki seluruh indeks dalam memori / ram atau apakah mongodb bahkan mencoba mengalokasikan ram sebanyak mungkin untuk menyimpan bahkan data untuk dibaca cepat?

Saya ingin menjalankan mongodb + aplikasi lain dan sepertinya mongodb adalah satu-satunya yang tidak memungkinkan saya untuk menentukan kisaran RAM, untuk mengatakan "max_memory_allocated_or_reserved = 8GB".

Jika tidak ada cara untuk melakukannya, saya harus menjelaskan kepada pembunuh bahwa mongod adalah proses "buruk" yang bukan praktik terbaik menurut saya ...

ledy
sumber

Jawaban:

18

Alasan sebenarnya mengapa Anda tidak dapat melakukan apa yang Anda minta (batasi memori) adalah karena MongoDB tidak mengelola memori yang digunakan secara langsung - itu memungkinkan OS melakukannya. MongoDB hanya memetakan memori semua data dan kemudian memiliki halaman OS itu masuk dan keluar dari memori sesuai kebutuhan. Akibatnya, tidak ada manajemen langsung dari jumlah yang digunakan mungkin sampai MongoDB mengimplementasikan ini dengan cara yang sama sekali berbeda, atau OS memungkinkannya (tidak mungkin di Linux sejak 2,4 hari).

Satu-satunya cara untuk benar-benar memisahkan sumber daya saat ini adalah dengan menggunakan solusi virtualisasi dan mengisolasi MongoDB dalam VM-nya sendiri. Ya, ada overhead yang terlibat (meskipun hypervisor sudah jauh lebih baik), tetapi pada saat itu adalah harga yang harus dibayar untuk tingkat kontrol sumber daya tersebut.

Dalam hal OOM Killer, bahkan tanpa proses lain pada host, selama kumpulan data dan indeks Anda secara keseluruhan melebihi memori yang tersedia, MongoDB dapat menekan masalah OOM Killer. Ini karena cara data keluar dari memori - jika tidak ada tekanan memori (tidak ada yang menginginkan memori penduduk), dan Anda terus menambahkan / menyentuh data dan indeks baru, maka pada akhirnya akan tumbuh untuk mengkonsumsi semua RAM yang tersedia. Karenanya rekomendasi untuk selalu mengonfigurasi beberapa swap saat menjalankan MongoDB:

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

Tentu saja, data LRU akan keluar terlebih dahulu, proses lain juga dapat mengambil res, tetapi konsep tersebut tetap berlaku kecuali jika Anda memuat kumpulan data ke dalam memori dan kemudian tetap statis. Hal terbaik untuk dilakukan jika Anda khawatir adalah memasukkannya ke MMS dan melacak penggunaannya dari waktu ke waktu:

http://mms.mongodb.com

Pembaruan: Agustus 2015

Sejak saya menulis jawaban ini, banyak hal telah berubah dan informasinya sedikit ketinggalan zaman. Sebagai contoh, Linux sekarang memiliki cgroup dan teknologi terkait ( Docker misalnya) yang telah matang hingga memungkinkan mereka untuk mengisolasi dan membatasi sumber daya ( termasuk memori ) dengan lebih baik yang dikonsumsi oleh setiap proses dalam lingkungan produksi, bahkan yang menggunakan pemetaan memori seperti MongoDB.

Selain itu, dengan munculnya mesin penyimpanan baru di luar MMAP seperti WiredTiger di MongoDB 3.0+ Anda dapat menggunakan fungsi bawaan untuk membatasi ukuran cache untuk MongoDB. Oleh karena itu, persyaratan RAM sekarang benar-benar tergantung pada bagaimana Anda memilih untuk mengkonfigurasi MongoDB, lingkungan tempat Anda menjalankannya, dan mesin penyimpanan apa yang Anda pilih.

Adam C
sumber
mengenai WiredTiger: "Storage.wiredTiger.engineConfig.cacheSizeGB hanya membatasi ukuran cache WiredTiger, bukan jumlah total memori yang digunakan oleh mongod. Cache WiredTiger hanya satu komponen RAM yang digunakan oleh MongoDB. MongoDB juga secara otomatis menggunakan semua bebaskan memori pada mesin melalui cache filesystem ... "
Stefan Rogin
benar, tetapi hal yang sama dapat dikatakan dari aplikasi apa pun yang mem-page data dari disk, cache FS tidak lagi menjadi metode caching utama untuk data seperti dulu dengan memori yang dipetakan file dalam mesin penyimpanan MMAP
Adam C
3

Sesuatu berubah selama bertahun-tahun tentang MongoDB.

TL; DR

Jika mesin penyimpanan MMAPv1 digunakan pada working setukuran MongoDB harus sesuai dengan RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-si--zeze-fit-ram

Jika mesin penyimpanan WiredTiger digunakan pada MongoDB, tidak perlu khawatir tentang RAM yang cocok working setatau tidak . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Diagnostik Memori untuk Mesin Penyimpanan WiredTiger

Apakah ukuran set kerja saya harus sesuai dengan RAM?

Tidak.

Bagaimana saya menghitung berapa banyak RAM yang saya butuhkan untuk aplikasi saya?

Dengan WiredTiger, MongoDB menggunakan cache internal WiredTiger dan cache sistem file.

Berubah dalam versi 3.2: Mulai di MongoDB 3.2, cache internal WiredTiger, secara default, akan menggunakan yang lebih besar dari:

60% RAM minus 1 GB, atau 1 GB.

efkan
sumber
baik jawaban ini tidak banyak membantu, juga tidak terlalu akurat.
Philip Schiff