MongoDB: RAM gereksinimleri


20

Tüm dizinin bellekte / ram'de olması yeterli mi veya mongodb, verileri hızlı okumalar için bile saklamak için mümkün olduğunca çok ram tahsis etmeye çalışıyor mu?

Mongodb + diğer uygulamaları çalıştırmak istiyorum ve mongodb, "max_memory_allocated_or_reserved = 8GB" diyelim, bir RAM aralığı tanımlamama izin vermeyen tek biri gibi görünüyor.

Bunu yapmanın bir yolu yoksa, oom-katile, mongod'un benim görüşüme göre en iyi uygulama olmayan "kötü" süreç olduğunu açıklamalıyım ...

Yanıtlar:


18

İstediğiniz gibi yapamamanızın asıl nedeni (belleği sınırlamak) MongoDB'nin kullandığı belleği doğrudan yönetmemesidir - işletim sisteminin bunu yapmasına izin verir. MongoDB sadece bellek tüm verilerini eşler ve daha sonra OS sayfasını gerektiğinde belleğe girip çıkarır. Sonuç olarak, MongoDB bunu tamamen farklı bir şekilde uygulayana veya işletim sistemi izin verene kadar (2.4 günde Linux'ta mümkün değildir) kullanılan miktarın doğrudan yönetimi yoktur.

Şu anda kaynakları gerçekten ayırmanın tek yolu bir sanallaştırma çözümü kullanmak ve MongoDB'yi kendi VM'sinde izole etmektir. Evet, ilgili genel giderler var (hipervizörler çok daha iyi hale gelmiş olsa da), ancak şu anda bu kaynak kontrolü seviyesi için ödenecek fiyat.

OOM Killer açısından, ana bilgisayar üzerinde başka hiçbir işlem yapılmasa bile, veri kümeniz ve dizinleriniz genel olarak kullanılabilir belleği aştığı sürece MongoDB, OOM Killer sorunlarını vurabilir. Bunun nedeni, verilerin bellekte nasıl bellekte kalmasıdır - bellek baskısı yoksa (başka bir şey Yerleşik bellek istemez) ve yeni veri ve dizinler eklemeye / dokunmaya devam ederseniz, sonunda tüm kullanılabilir RAM'i tüketmek için büyür. Bu nedenle MongoDB'yi çalıştırırken her zaman bazı takas yapılandırmanız önerilir:

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

Tabii ki, LRU verileri önce çağrılacaktır, diğer işlemler de res memünü alabilir, ancak veri setinizi belleğe yüklemediğiniz ve daha sonra statik kalmadıkça kavram hala geçerlidir. Endişeleniyorsanız yapılacak en iyi şey, MMS'e almak ve zaman içinde kullanımı izlemek:

http://mms.mongodb.com

Güncelleme: Ağustos 2015

Bu cevabı yazdığımdan beri işler biraz ilerledi ve bilgiler biraz güncel değil. Örneğin, Linux artık üretim ortamında herhangi bir işlem tarafından tüketilen kaynakları ( bellek dahil ) daha iyi izole etmenize ve sınırlandırmanıza izin veren noktaya kadar olgunlaşan gruplara ve ilgili teknolojilere ( örneğin Docker kapsayıcıları ) sahiptir. MongoDB gibi bellek eşleme.

Ayrıca, MongoDB 3.0 ve sonraki sürümlerinde WiredTiger gibi MMAP'ın ötesindeki yeni depolama motorlarının ortaya çıkmasıyla MongoDB'nin önbellek boyutunu sınırlamak için yerleşik işlevselliği kullanabilirsiniz . Bu nedenle, RAM gereksinimleri artık MongoDB'yi nasıl yapılandırmayı seçtiğinize, hangi ortamda çalıştırdığınıza ve hangi depolama motorunu seçtiğinize bağlıdır.


WiredTiger ile ilgili olarak: " storage.wiredTiger.engineConfig.cacheSizeGB, mongod tarafından kullanılan toplam bellek miktarını değil, sadece WiredTiger önbelleğinin boyutunu sınırlar. WiredTiger önbelleği, MongoDB tarafından kullanılan RAM'in yalnızca bir bileşenidir. dosya sistemi önbelleği üzerinden makinede boş bellek ... "
Stefan Rogin

sağ, ancak aynı şey verileri diskten sayfalayan herhangi bir uygulama için söylenebilir, FS önbelleği artık bir zamanlar MMAP depolama motorundaki bellek eşlemeli dosyalarla olduğu gibi veriler için birincil önbellekleme yöntemi değildir
Adam C


3

Yıllar içinde MongoDB ile ilgili bazı şeyler değişti.

TL; DR

MMAPv1 depolama motoru MongoDB'de kullanılıyorsa, RAMworking set boyutuna uymalıdır . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

WiredTiger depolama motoru MongoDB'de kullanılıyorsa, RAM'in uygun olup olmadığı konusunda endişelenmenize gerek working setyoktur . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

WiredTiger Depolama Motoru için Bellek Tanılama

Çalışma setimin boyutu RAM uygun mu?

Yok hayır.

Uygulamam için ne kadar RAM'e ihtiyacım olduğunu nasıl hesaplayabilirim?

WiredTiger ile MongoDB hem WiredTiger dahili önbelleğini hem de dosya sistemi önbelleğini kullanır.

Sürüm 3.2'de değiştirildi: MongoDB 3.2'den başlayarak, varsayılan olarak WiredTiger dahili önbelleği aşağıdakilerden daha büyük olanını kullanır:

RAM'in% 60'ı eksi 1 GB veya 1 GB.


Peki bu cevap çok yardımcı değil, ne de çok doğru.
Philip Schiff
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.