Aşağıdaki yapılandırmaya sahibim:
- üç liman işçisi konteyneri çalıştıran bir ana makine:
- MongoDB
- Redis
- Veri depolamak için önceki iki kapsayıcıyı kullanan bir program
Hem Redis hem de MongoDB büyük miktarda veri depolamak için kullanılır. Redis'in tüm verilerini RAM'de tutması gerektiğini biliyorum ve bu konuda iyiyim. Ne yazık ki, mongo çok fazla RAM almaya başlıyor ve ana RAM dolduğunda (burada 32GB'dan bahsediyoruz), ya mongo ya da Redis çöküyor.
Bununla ilgili aşağıdaki soruları okudum:
- MongoDB RAM Kullanımını Sınırla : Görünüşe göre çoğu RAM WiredTiger önbelleği tarafından kullanılıyor
- MongoDB limit belleği : görünüşe göre sorun günlük verileriydi
- MongoDB'deki RAM bellek kullanımını sınırlayın : burada mongo belleğini önbellek / günlükleri / verileri için daha az miktarda bellek kullanacak şekilde sınırlamanızı önerirler
- Çok fazla bellek kullanan MongoDB : burada daha hızlı erişim sağlamak için mümkün olduğunca çok RAM kullanma eğiliminde olan WiredTiger önbellek sistemi olduğunu söylüyorlar. Ayrıca belirtiyorlar
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- Mongodb bellek kullanımını sınırlama seçeneği var mı? : tekrar önbellekleme, ayrıca
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
- MongoDB endeksi / RAM ilişkisi : alıntı:
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.
- MongoDB tarafından kullanılan önbellek nasıl serbest bırakılır? : 5 ile aynı cevap.
Şimdi tüm bu cevaplardan anladığım şey şudur:
- Daha hızlı erişim için mongo'nun RAM'deki tüm indekslere uyması daha iyi olacaktır. Ancak, benim durumumda, oldukça hızlı bir SSD'ye sahip olduğum için kısmen diskte bulunan endekslerle iyiyim.
- RAM çoğunlukla mongo tarafından önbellek için kullanılır.
Bunu göz önünde bulundurarak, mongo'nun mümkün olduğunca fazla RAM alanı denemesini ve kullanmasını bekliyordum, ancak aynı zamanda az sayıda RAM alanı ile de çalışabiliyor ve diskten birçok şey getirebiliyordum. Bununla birlikte, --memory
ve kullanarak mongo Docker kabının belleğini (örneğin 8GB'a) sınırladım --memory-swap
, ancak diskten bir şeyler almak yerine, mongo bellek biter bitmez çöktü.
Mongoyu yalnızca kullanılabilir belleği kullanmaya ve belleğe sığmayan her şeyi diskten almaya nasıl zorlayabilirim?
dmesg
beklenmeyen kapanmayla ilişkili mesajlar var mı? Docker ile en olası olasılık, kaptaki işlemlerin kapsayıcı sınırı yerine kullanılabilir toplam RAM'i algılamasıdır.
mongod
bir kap (içinde lxc
, cgroups
, Docker, vs.) o gelmez değil bir sistemde kullanılabilir RAM tüm erişebilir, ayarlamanız gerekir storage.wiredTiger.engineConfig.cacheSizeGB
RAM mevcut in miktarından az bir değere kap. Kesin miktar, kapta çalışan diğer işlemlere bağlıdır, ancak genellikle RAM eksi 1GB'nin% 50'sinin varsayılan değerinden fazla olmamalıdır.