Mam następującą konfigurację:
- maszyna hosta, która obsługuje trzy kontenery dokerów:
- MongoDB
- Redis
- Program wykorzystujący dwa poprzednie kontenery do przechowywania danych
Zarówno Redis, jak i MongoDB służą do przechowywania ogromnych ilości danych. Wiem, że Redis musi przechowywać wszystkie swoje dane w pamięci RAM i nie mam nic przeciwko. Niestety zdarza się, że mongo zaczyna zajmować dużo pamięci RAM, a gdy pamięć RAM hosta jest pełna (mówimy tutaj o 32 GB), następuje awaria mongo lub Redis.
Przeczytałem następujące poprzednie pytania na ten temat:
- Ogranicz użycie pamięci RAM MongoDB : najwyraźniej większość pamięci RAM jest zużywana przez pamięć podręczną WiredTiger
- Limit pamięci MongoDB : tutaj najwyraźniej problemem były dane dziennika
- Ogranicz użycie pamięci RAM w MongoDB : tutaj sugerują ograniczenie pamięci Mongo, aby używała mniejszej ilości pamięci na pamięć podręczną / dzienniki / dane
- MongoDB zużywa zbyt dużo pamięci : tutaj mówią, że jest to system buforowania WiredTiger, który zwykle wykorzystuje jak najwięcej pamięci RAM, aby zapewnić szybszy dostęp. Podają także
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- Czy jest jakaś opcja ograniczenia wykorzystania pamięci Mongodb? : buforowanie ponownie, oni także dodają
MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
- Relacja indeks / pamięć RAM MongoDB : cytat:
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.
- jak zwolnić buforowanie używane przez MongoDB? : taka sama odpowiedź jak w 5.
Teraz wydaje mi się, że rozumiem na podstawie tych wszystkich odpowiedzi:
- Dla szybszego dostępu lepiej byłoby, aby mongo pasowało do wszystkich wskaźników w pamięci RAM. Jednak w moim przypadku nie mam nic przeciwko indeksom częściowo znajdującym się na dysku, ponieważ mam dość szybki dysk SSD.
- Pamięć RAM jest najczęściej używana do buforowania przez mongo.
Biorąc to pod uwagę, spodziewałem się, że mongo spróbuje użyć jak największej ilości pamięci RAM, ale będę w stanie funkcjonować również z niewielką ilością pamięci RAM i pobierając większość rzeczy z dysku. Jednak ograniczyłem pamięć kontenera Docker mongo (na przykład do 8 GB), używając --memory
i --memory-swap
, ale zamiast pobierać rzeczy z dysku, mongo po prostu się zawiesiło, gdy tylko zabrakło pamięci.
Jak zmusić mongo do używania tylko dostępnej pamięci i pobierania z dysku wszystkiego, co nie mieści się w pamięci?
dmesg
korelują z nieoczekiwanym zamknięciem? Najbardziej prawdopodobne jest to w przypadku Dockera, że procesy w kontenerze wykrywają całkowitą dostępną pamięć RAM, a nie limit kontenera.
mongod
w pojemniku ( lxc
, cgroups
, Döcker, etc.), które ma nie mieć dostęp do wszystkich pamięci RAM dostępnej w systemie, należy ustawić storage.wiredTiger.engineConfig.cacheSizeGB
na wartość mniejszą niż ilość pamięci RAM dostępny w pojemnik. Dokładna ilość zależy od innych procesów uruchomionych w kontenerze, ale zazwyczaj nie powinna przekraczać domyślnej wartości 50% pamięci RAM minus 1 GB.