it-swarm-eu.dev

MongoDB: RAM požadavky

Stačí mít celý index v paměti/RAM nebo se mongodb dokonce pokouší přidělit co nejvíce RAM k uložení i dat pro rychlé čtení?

Chtěl bych spouštět mongodb + další aplikace a vypadá to, že mongodb je jediný, který mi neumožňuje definovat rozsah paměti RAM, řekněme „max_memory_allocated_or_reserved = 8GB“.

Pokud tomu tak není, měl bych vysvětlit zabijákovi, že mongod je „špatný“ proces, který podle mého názoru není osvědčeným postupem ...

20
ledy

Skutečný důvod, proč nemůžete dělat, jak se ptáte (omezit paměť), je ten, že MongoDB nespravuje paměť, kterou používá, přímo - umožňuje to OS. MongoDB pouze paměť mapuje všechna svá data a poté má OS stránku podle potřeby dovnitř a ven. Výsledkem je, že není možná přímá správa použitého množství, dokud to MongoDB implementuje úplně jiným způsobem, nebo pokud to operační systém neumožňuje (v Linuxu to není možné od 2,4 dne).

Jediným způsobem, jak v současnosti skutečně oddělit zdroje, je použít virtualizační řešení a izolovat MongoDB ve svém vlastním virtuálním počítači. Ano, jsou do toho zahrnuty režijní náklady (i když hypervizoři se dostali mnohem lépe), ale v tuto chvíli je to cena, která se má platit za tuto úroveň kontroly zdrojů.

Pokud jde o zabijáka OOM, i bez dalších procesů na hostiteli, pokud vaše sada dat a indexy celkově přesáhnou dostupnou paměť, může MongoDB zasáhnout do problémů s OOM zabijákem. Je to kvůli tomu, jak se data ukládají z paměti - pokud neexistuje žádný paměťový tlak (nic jiného si nepřeje rezidentní paměť), a stále přidáváte/dotýkáte se nových dat a indexů, nakonec nakonec poroste a spotřebuje veškerou dostupnou RAM. Z tohoto důvodu doporučení vždy nakonfigurovat nějaký swap při spuštění MongoDB:

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

Data LRU budou samozřejmě nejprve vybrána stránkou, ostatní procesy mohou také převzít res mem, ale koncept stále platí, pokud nenahrajete soubor dat do paměti a pak zůstane statický. Nejlepší způsob, jak se obávat, je dostat se do MMS a sledovat využití v čase:

http://mms.mongodb.com

Aktualizace: srpen 2015

Od té doby, co jsem napsal tuto odpověď, se věci trochu posunuly a informace jsou trochu zastaralé. Například Linux nyní má cgroups a související technologie ( například Docker kontejnery )), které dozrávaly do té míry, že vám umožňují lépe izolovat a omezit zdroje (- včetně paměti ) spotřebované jakýmkoli procesem v produkčním prostředí, i když používá mapování paměti jako MongoDB.

Navíc s příchodem nových paměťových modulů mimo MMAP, jako je WiredTiger v MongoDB 3.0+, můžete vestavěné funkce použít pro omezit velikost mezipaměti pro MongoDB. Požadavky RAM) nyní skutečně opravdu závisí na tom, jak se rozhodnete konfigurovat MongoDB, v jakém prostředí je spustíte a na jakém úložném motoru si vyberete.

18
Adam C

MongoDB použije dostupnou volnou paměť pro ukládání do mezipaměti a podle potřeby ji vymění na disk, aby poskytla paměť dalším aplikacím na stejném serveru. Pro nejlepší výkon budete chtít mít dost RAM), aby se vaše indexy a často používaná data („pracovní sada“) v paměti uchovávaly.

Užitečné čtení:

6
Stennie

V průběhu let se něco mění o MongoDB.

TL; DR

Pokud je na MongoDB použit paměťový modul MMAPv1 working set velikost musí odpovídat [~ # ~] ram [~ # ~] . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

Pokud je v MongoDB používán úložný stroj WiredTiger, se nemusíte starat o RAM je vhodné pro working set nebo ne . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Diagnostika paměti pro paměťový modul WiredTiger

Musí moje velikost pracovní sady vyhovovat RAM?

Ne.

Jak mohu vypočítat, kolik RAM potřebuji pro svou aplikaci?

U WiredTiger MongoDB využívá interní mezipaměť WiredTiger i mezipaměť souborového systému.

Změněno ve verzi 3.2: Počínaje MongoDB 3.2 bude interní mezipaměť WiredTiger ve výchozím nastavení používat větší z obou:

60% z RAM mínus 1 GB nebo 1 GB).

3
efkan