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.
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:
źródło
W MongoDB coś się zmieniło od lat.
TL; DR
Jeśli silnik pamięci masowej MMAPv1 jest używany w MongoDB,
working set
rozmiar musi pasować do pamięci RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ramJeśli silnik pamięci WiredTiger jest używany w MongoDB, nie musisz się martwić o to,
working set
czy pamięć RAM jest odpowiednia, czy nie . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engineźródło