MongoDB, belleği dolduğunda sona erer


11

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:

  1. 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
  2. MongoDB limit belleği : görünüşe göre sorun günlük verileriydi
  3. 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
  4. Ç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 belirtiyorlarit's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
  5. Mongodb bellek kullanımını sınırlama seçeneği var mı? : tekrar önbellekleme, ayrıcaMongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
  6. 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.
  7. 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:

  1. 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.
  2. 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, --memoryve 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?


Buna OOM katili denir. MongoDB, emtia donanımında çalışmak üzere tasarlanmıştır. Asla yapay olarak sınırlı kaynaklarda çalıştırmam. Yalnızca küçük bir veritabanınız varsa, MongoDB ideal seçim değildir. Büyük bir veritabanınız varsa (üç rakam Milyon ila milyar giriş) kaynakları sınırlamak kötü bir seçimdir. Sorununa göre: pastaya sahip olamaz ve yiyemezsin. Seç.
Markus W Mahlberg

Doğru yapılandırılırsa, bellek yetersiz olduğunda MongoDB çökmemelidir. MongoDB sunucusunun ve kullandığınız O / S'nin belirli sürümünü onaylayabilir ve ayrıca çökmeyi daha ayrıntılı olarak açıklayabilir misiniz? Örneğin, MongoDB günlüğünde veya dmesgbeklenmeyen 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.
Stennie

Gereğince MongoDB Prodüksiyon Notları : koşarsan mongodbir 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.cacheSizeGBRAM 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.
Stennie

Yanıtlar:


9

MongoDB BOL gereğince Burada sürüm 3.4 değiştirildi: Değerler arasında olabilir 256MBiçin 10TBve bir olabilir float. Ayrıca, varsayılan değer de değişti.

Başlangıçta 3.4, WiredTiger dahili önbelleği varsayılan olarak şunlardan birini kullanır:

50% of RAM minus 1 GB, or
256 MB.

İle WiredTiger, MongoDB hem WiredTiger internal cache hem de filesystem cache.

Via filesystem cache, MongoDB otomatik tarafından kullanılmayan tüm serbest bellek kullanan WiredTiger cacheveya diğer işlemlerle.

Storage.wiredTiger.engineConfig.cacheSizeGB boyutunu sınırlar WiredTigeriç cache. İşletim sistemi, sıkıştırılmış MongoDB veri dosyalarının bellekte kalmasını sağlayan dosya sistemi önbelleği için kullanılabilir boş belleği kullanır. Ayrıca, operating systemdosya sistemi bloklarını ve dosya sistemi önbelleğini tamponlamak için herhangi bir boş RAM kullanır.

Ek RAM tüketicilerini barındırmak için WiredTigerdahili önbellek boyutunu azaltmanız gerekebilir .

Daha fazla bilgi için ref WiredTiger Depolama Altyapısı ve Yapılandırma Dosyası Seçenekleriniz


4

Aslında, yakından bakarsanız, "bellek yetersiz" için ölen mongod değil, mongod'u öldüren çekirdek OOM (bellek dışı) yöneticisi, çünkü en büyük bellek kullanımı var.

Evet, sorunu monngodb yapılandırma parametresi cacheSizeGB ile çözmeye çalışabilirsiniz , ancak kap ortamında, üç kapınızdan herhangi birinin aldığı kaynakları sınırlamak için cgroups kullanmak daha iyidir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.