MongoDB nie używa całej dostępnej pamięci RAM

9

Mam około 200 GB wartości danych przechowywanych w klastrze mongo. Pamięć fizyczna w jednym z instancji, w których działa mongo, wynosi 8 GB. W tym przypadku nie działa nic innego. Tak blisko, jak mogę zrozumieć na podstawie dokumentów Mongo (takich jak ten: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ), oznacza to, że proces mongod powinien wykorzystywać około 100% dostępna pamięć fizyczna. Ale jeśli spojrzysz na następujące dane wyjściowe toppolecenia, zobaczysz, że instancja mongod używa tylko 2 GB pamięci rezydentnej i jest dostępna pełna 2 GB wolnej pamięci fizycznej, która w ogóle nie jest używana.

Czy ktoś może mi wyjaśnić to zachowanie? Dlaczego jest 2 GB wolnej pamięci?

top wynik:

top - 23:19:43 up 89 days, 20:05,  2 users,  load average: 0.41, 0.55, 0.59
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.0%us,  1.3%sy,  0.0%ni, 93.9%id,  2.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8163664k total,  6131764k used,  2031900k free,    54976k buffers
Swap: 16771848k total,    10604k used, 16761244k free,  5367700k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
 1401 mongodb   20   0  174g 2.0g 1.9g S   23 26.2  18070:55 mongod
 ...

Informacja o systemie:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

Uwagi:

  • Istnieje inny przykład w tym klastrze, w którym mongod zachowuje się tak, jakbym się spodziewał i wykorzystuje całą dostępną pamięć.
  • Patrząc na mongostat, wygląda na to, że ciągle ma błędy stronicowania, więc ilość używanej pamięci powinna rosnąć:
  • ( Zadałem to samo pytanie grupie google mongodb-user, ale nie otrzymałem odpowiedzi).
Chris W.
źródło
Jaka dystrybucja Linuksa? Czy to 32 czy 64-bit? (Edytuj swoje pytanie z wyjściem lsb-release -ai uname -aproszę)
Philᵀᴹ
Dzięki. Dodano, unameale nie lsb-releasezainstalowałem.
Chris W.,
Czy przypadkowo pobrałeś 32-bitową wersję MongoDB? Maksymalny rozmiar 32-bitowej instancji Mongo wynosi 2 GB.
Aaron
@ BryceAtNetwork23 nope; zdecydowanie mamy ponad 2 GB w naszej mongodb (kilkaset koncertów).
Chris W.,
@ChrisW ma na myśli maksymalny rozmiar pamięci - nie rozmiar bazy danych. I wydaje się, że to dobrze wyjaśnia 2GB.
rfusca

Odpowiedzi:

5

Rozmiar pamięci rezydentnej reprezentuje liczbę stron w pamięci faktycznie dotkniętych przez mongodproces. Jeśli jest to znacznie mniej niż dostępna pamięć, a dane przekraczają dostępną pamięć (twoja robi), może to być po prostu brak aktywnego dotknięcia wystarczającej liczby stron.

Aby ustalić, czy tak jest, należy uruchomić free -m, dane wyjściowe powinny wyglądać mniej więcej tak:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680

W moim przykładzie pamięć podręczna nie jest bliska sumie, co oznacza, że ​​mongod nie dotknął wystarczającej liczby stron, pamięć podręczna systemu plików nie została nawet zapełniona przez strony odczytywane ogólnie z dysku.

Szybkim rozwiązaniem tego byłoby polecenie dotykowe (dodane w 2.2) - należy zachować ostrożność w przypadku dużych zestawów danych, ponieważ będzie on próbował załadować wszystko do pamięci RAM, nawet jeśli dane są zbyt duże, aby je zmieścić (powodując wiele We / Wy dysku i błędy strony). Z pewnością jednak skutecznie zapełni pamięć :)

Jeśli twoja wartość w pamięci podręcznej jest zbliżona do całkowitej dostępnej, problem polega na tym, że duża liczba stron wczytywanych do pamięci z dysku nie ma związku z procesem mongod (a zatem nie jest przez niego dotykana). Zwykłym kandydatem na tego rodzaju rozbieżności jest powściągliwość. Omówiłem już szczegółowo ten konkretny temat w innym miejscu, więc w razie potrzeby połączę te dwie odpowiedzi do przyszłego czytania.

Adam C.
źródło