MongoDB non utilizza tutta la RAM disponibile


9

Ho circa 200 GB di dati memorizzati in un cluster mongo. La memoria fisica su una delle istanze che esegue mongo è di 8 GB. Nient'altro che abbia conseguenze su questa istanza. Per quanto posso capire sulla base dei documenti di Mongo (come questo: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ) ciò significa che il processo mongod dovrebbe utilizzare circa il 100% di la memoria fisica disponibile. Ma se guardi il seguente output dal topcomando vedrai che l'istanza mongod sta usando solo 2 GB di memoria residente e ci sono 2 GB di memoria fisica libera disponibile che non viene affatto utilizzata.

Qualcuno può spiegarmi questo comportamento? Perché ci sono 2 GB di memoria libera?

top produzione:

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
 ...

Informazioni di sistema:

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

Appunti:

  • C'è un'altra istanza in questo cluster in cui mongod si sta comportando come mi aspetterei e utilizzando tutta la memoria disponibile.
  • Guardando mongostat sembra che avessero costantemente qualche errore di pagina, quindi la quantità di memoria utilizzata dovrebbe aumentare:
  • (Ho fatto la stessa domanda sul gruppo google utente mongodb ma non ho ricevuto risposta.)

Quale distro Linux? È a 32 o 64 bit? (Modifica la tua domanda con l'output di lsb-release -ae per uname -afavore)
Phil

Grazie. Aggiunto unamema non ho lsb-releaseinstallato.
Chris W.

Hai scaricato accidentalmente la versione a 32 bit di MongoDB? La dimensione massima di un'istanza Mongo a 32 bit è di 2 GB.
Aaron,

@ BryceAtNetwork23 no; abbiamo sicuramente più di 2 GB nel nostro totale di mongodb (diverse centinaia di concerti in realtà).
Chris W.

@ChrisW indica la dimensione massima della memoria, non la dimensione del database. E sembra che spiegherebbe bene i 2 GB.
rfusca,

Risposte:


5

La dimensione della memoria residente rappresenta il numero di pagine in memoria effettivamente toccate dal mongodprocesso. Se quello è significativamente inferiore alla memoria disponibile e i dati superano la memoria disponibile (la tua lo fa), allora potrebbe trattarsi semplicemente di non aver ancora toccato attivamente abbastanza pagine.

Per determinare se questo è il caso, è necessario eseguire free -m, l'output dovrebbe essere simile al seguente:

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

Nel mio esempio, la cache non è vicina al totale, il che significa che non solo mongod non ha toccato abbastanza pagine, ma la cache del filesystem non è stata nemmeno riempita dalle pagine lette dal disco in generale.

Un rapido rimedio per questo sarebbe il comando touch (aggiunto in 2.2) - dovrebbe essere usato con cautela su grandi set di dati in quanto tenterà di caricare tutto nella RAM anche se i dati sono troppo grandi per adattarsi (causando un sacco di I / O del disco e errori di pagina). Riempirà sicuramente la memoria in modo efficace :)

Se il valore memorizzato nella cache è vicino al totale disponibile, il problema è che un gran numero di pagine che vengono lette in memoria dal disco non sono rilevanti (e quindi non toccate da) il processo mongod. Il solito candidato per questo tipo di discrepanza è readahead. Ho già trattato questo particolare argomento altrove in dettaglio, quindi collegherò quelle due risposte per future letture, se necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.