Saya memiliki konfigurasi berikut:
- mesin host yang menjalankan tiga kontainer buruh pelabuhan:
- MongoDB
- Redis
- Suatu program yang menggunakan dua wadah sebelumnya untuk menyimpan data
Redis dan MongoDB digunakan untuk menyimpan sejumlah besar data. Saya tahu Redis perlu menyimpan semua datanya dalam RAM dan saya baik-baik saja dengan ini. Sayangnya, yang terjadi adalah mongo mulai mengambil banyak RAM dan segera setelah RAM host penuh (kita berbicara tentang 32GB di sini), baik mongo atau Redis crash.
Saya telah membaca pertanyaan sebelumnya tentang ini:
- Batasi Penggunaan MongoDB RAM : tampaknya sebagian besar RAM digunakan oleh cache WiredTiger
- Memori batas MongoDB : di sini rupanya masalahnya adalah data log
- Batasi penggunaan memori RAM di MongoDB : di sini mereka menyarankan untuk membatasi memori mongo sehingga menggunakan jumlah memori yang lebih kecil untuk cache / log / data
- MongoDB menggunakan terlalu banyak memori : di sini mereka mengatakan itu sistem caching WiredTiger yang cenderung menggunakan RAM sebanyak mungkin untuk menyediakan akses yang lebih cepat. Mereka juga menyatakan
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- Apakah ada opsi untuk membatasi penggunaan memori mongodb? : caching lagi, mereka juga menambahkan
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
- Hubungan indeks MongoDB / RAM : kutipan:
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.
- bagaimana cara melepaskan caching yang digunakan oleh MongoDB? : jawaban yang sama seperti pada 5.
Sekarang apa yang tampaknya saya pahami dari semua jawaban ini adalah:
- Untuk akses yang lebih cepat akan lebih baik bagi mongo agar sesuai dengan semua indeks dalam RAM. Namun, dalam kasus saya, saya baik-baik saja dengan indeks sebagian berada pada disk karena saya memiliki SSD yang cukup cepat.
- RAM sebagian besar digunakan untuk caching oleh mongo.
Mempertimbangkan hal ini, saya mengharapkan mongo untuk mencoba dan menggunakan ruang RAM sebanyak mungkin tetapi dapat berfungsi juga dengan sedikit ruang RAM dan mengambil sebagian besar hal dari disk. Namun, saya membatasi memori penampung mongo Docker (hingga 8GB misalnya), dengan menggunakan --memory
dan --memory-swap
, tetapi alih-alih mengambil barang dari disk, mongo langsung macet begitu kehabisan memori.
Bagaimana saya bisa memaksa mongo untuk hanya menggunakan memori yang tersedia dan untuk mengambil dari disk semua yang tidak sesuai dengan memori?
dmesg
berkorelasi dengan shutdown yang tidak terduga? Kemungkinan yang paling mungkin dengan Docker adalah bahwa proses dalam wadah mendeteksi keseluruhan RAM yang tersedia daripada batas wadah.
mongod
dalam wadah ( lxc
,, cgroups
Docker, dll.) Yang tidak memiliki akses ke semua RAM yang tersedia dalam suatu sistem, Anda harus menetapkan storage.wiredTiger.engineConfig.cacheSizeGB
nilai kurang dari jumlah RAM yang tersedia di wadah. Jumlah persisnya tergantung pada proses lain yang berjalan di dalam wadah, tetapi biasanya tidak boleh lebih dari nilai default 50% dari RAM dikurangi 1GB.