MongoDB: wymagania dotyczące pamięci RAM

20

Czy wystarczy mieć cały indeks w pamięci / pamięci RAM, czy mongodb próbuje nawet przydzielić tak dużo pamięci RAM, jak to możliwe, aby przechowywać nawet dane do szybkiego odczytu?

Chciałbym uruchomić mongodb + inne aplikacje i wygląda na to, że mongodb jest jedyną, która nie pozwala mi zdefiniować zakresu pamięci RAM, powiedzmy „max_memory_allocated_or_reserved = 8GB”.

Jeśli nie ma na to sposobu, powinienem wyjaśnić zabójcy zagłady, że mongod to „zły” proces, który moim zdaniem nie jest najlepszą praktyką…

ledy
źródło

Odpowiedzi:

18

Prawdziwym powodem, dla którego nie możesz zrobić tego, o co prosisz (ograniczenie pamięci), jest to, że MongoDB nie zarządza pamięcią, której używa bezpośrednio - pozwala to systemowi operacyjnemu. MongoDB po prostu mapuje wszystkie swoje dane, a następnie w razie potrzeby wyświetla stronę OS w pamięci. W rezultacie nie ma bezpośredniego zarządzania wykorzystaną kwotą, dopóki MongoDB nie zaimplementuje tego w zupełnie inny sposób, lub system operacyjny na to pozwoli (nie jest to możliwe w Linuksie od 2.4 dni).

Jedynym obecnie sposobem na prawdziwą segregację zasobów jest zastosowanie rozwiązania do wirtualizacji i izolacja MongoDB na własnej maszynie wirtualnej. Tak, w grę wchodzą koszty ogólne (choć hiperwizory stały się znacznie lepsze), ale w tej chwili jest to cena, jaką należy zapłacić za ten poziom kontroli zasobów.

Jeśli chodzi o OOM Killer, nawet bez żadnych innych procesów na hoście, dopóki zestaw danych i indeksy ogólnie przekraczają dostępną pamięć, MongoDB może trafić w problemy z OOM Killer. Wynika to z tego, w jaki sposób dane są stronicowane z pamięci - jeśli nie ma presji pamięci (nic innego nie chce pamięci rezydentnej), a ty ciągle dodajesz / dotykasz nowych danych i indeksów, w końcu wzrośnie, aby zużyć całą dostępną pamięć RAM. Stąd zalecenie, aby zawsze konfigurować wymianę podczas uruchamiania MongoDB:

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

Oczywiście dane LRU zostaną najpierw stronicowane, inne procesy mogą również zająć pamięć res, ale koncepcja nadal obowiązuje, chyba że załadujesz zestaw danych do pamięci, a następnie pozostanie on statyczny. Najlepszą rzeczą do zrobienia, jeśli martwisz się, jest wprowadzenie go do wiadomości MMS i śledzenie zużycia w czasie:

http://mms.mongodb.com

Aktualizacja: sierpień 2015 r

Od czasu, gdy napisałem tę odpowiedź, sytuacja trochę się zmieniła, a informacje są nieco nieaktualne. Na przykład Linux ma teraz grupy cg i pokrewne technologie ( na przykład kontenery Docker ), które osiągnęły dojrzałość do tego stopnia, że ​​pozwalają lepiej izolować i ograniczać zasoby (w tym pamięć ) zużywane przez dowolny proces w środowisku produkcyjnym, nawet takim, który używa mapowanie pamięci jak MongoDB.

Ponadto wraz z pojawieniem się nowych silników pamięci masowej poza MMAP, takich jak WiredTiger w MongoDB 3.0+, możesz użyć wbudowanych funkcji, aby ograniczyć rozmiar pamięci podręcznej dla MongoDB. Dlatego wymagania dotyczące pamięci RAM naprawdę zależą teraz od tego, jak zdecydujesz się skonfigurować MongoDB, w jakim środowisku go uruchomisz i jaki silnik pamięci wybierzesz.

Adam C.
źródło
w odniesieniu do WiredTiger: „Storage.wiredTiger.engineConfig.cacheSizeGB ogranicza tylko rozmiar pamięci podręcznej WiredTiger, a nie całkowitą ilość pamięci używanej przez mongod. Pamięć podręczna WiredTiger jest tylko jednym z elementów pamięci RAM używanej przez MongoDB. MongoDB również automatycznie wykorzystuje wszystkie wolna pamięć na maszynie poprzez pamięć podręczną systemu plików ...
Stefan Rogin
tak, ale to samo można powiedzieć o każdej aplikacji, która wysyła dane z dysku, pamięć podręczna FS nie jest już podstawową metodą buforowania danych, tak jak kiedyś w przypadku plików mapowanych w pamięci w silniku pamięci MMAP
Adam C
6

MongoDB użyje dostępnej wolnej pamięci do buforowania i w razie potrzeby zamieni się na dysk, aby udostępnić pamięć innym aplikacjom na tym samym serwerze. Aby uzyskać najlepszą wydajność, musisz mieć wystarczającą ilość pamięci RAM, aby zachować swoje indeksy i często używane dane („zestaw roboczy”) w pamięci.

Pomocna lektura:

Stennie
źródło
3

W MongoDB coś się zmieniło od lat.

TL; DR

Jeśli silnik pamięci masowej MMAPv1 jest używany w MongoDB, working setrozmiar musi pasować do pamięci RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

Jeśli silnik pamięci WiredTiger jest używany w MongoDB, nie musisz się martwić o to, working setczy pamięć RAM jest odpowiednia, czy nie . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Diagnostyka pamięci dla silnika pamięci WiredTiger

Czy mój zestaw roboczy musi pasować do pamięci RAM?

Nie.

Jak obliczyć, ile pamięci RAM potrzebuję do mojej aplikacji?

W przypadku WiredTiger MongoDB wykorzystuje zarówno wewnętrzną pamięć podręczną WiredTiger, jak i pamięć podręczną systemu plików.

Zmieniono w wersji 3.2: Począwszy od wersji MongoDB 3.2, wewnętrzna pamięć podręczna WiredTiger domyślnie używa większej z następujących opcji:

60% pamięci RAM minus 1 GB lub 1 GB.

efkan
źródło
cóż, ta odpowiedź nie jest zbyt pomocna ani strasznie dokładna.
Philip Schiff