MongoDB não está usando toda a RAM disponível

9

Eu tenho algo em torno de 200 GB no valor de dados armazenados em um cluster mongo. A memória física em uma das instâncias que executa o mongo é de 8 GB. Nada mais, de qualquer consequência, é executado nesta instância. Até onde eu entendo com base nos documentos do Mongo (como este: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ), isso significa que o processo mongod deve usar cerca de 100% dos a memória física disponível. Mas se você observar a seguinte saída do topcomando, verá que a instância mongod está usando apenas 2 GB de memória residente e há 2 GB de memória física livre disponível, que não está sendo usada.

Alguém pode me explicar esse comportamento? Por que existem 2 GB de memória livre?

top resultado:

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

Informação do 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

Notas:

  • Há outra instância neste cluster em que o mongod está se comportando como seria de esperar e utilizando toda a memória disponível.
  • Olhando para mongostat parece que foram consistentemente ter algum páginas falha, assim que a quantidade de memória utilizada deve ser a crescer:
  • (Fiz a mesma pergunta no grupo mongodb-user do google, mas não obtive resposta.)
Chris W.
fonte
Que distribuição Linux? É 32 ou 64 bits? (Editar sua pergunta com a saída lsb-release -ae uname -a, por favor)
Philᵀᴹ
Obrigado. Adicionado, unamemas eu não tenho lsb-releaseinstalado.
Chris W.
Você baixou acidentalmente a versão de 32 bits do MongoDB? O tamanho máximo de uma instância do Mongo de 32 bits é de 2 GB.
Aaron
@ BryceAtNetwork23 não; nós definitivamente temos mais de 2 GB no total de mongodb (várias centenas de shows na verdade).
Chris W.
@ Chris, ele significa o tamanho máximo da memória - não o tamanho do banco de dados. E isso parece explicar bem os 2 GB.
Rfusca

Respostas:

5

O tamanho da memória residente representa o número de páginas na memória realmente tocadas pelo mongodprocesso. Se isso for significativamente menor do que a memória e os dados disponíveis excederem a memória disponível (a sua), então pode ser o caso de simplesmente não ter tocado ativamente páginas suficientes ainda.

Para determinar se este é o caso, você deve executar free -m, a saída deve ser algo como isto:

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

No meu exemplo, o cache não está próximo do total, o que significa que o mongod não apenas tocou em páginas suficientes, como o cache do sistema de arquivos ainda não foi preenchido pelas páginas lidas do disco em geral.

Uma solução rápida para isso seria o comando touch (adicionado em 2.2) - ele deve ser usado com cautela em grandes conjuntos de dados, pois tentará carregar tudo na RAM, mesmo que os dados sejam muito grandes para caber (causando muitos E / S de disco e falhas de página). Certamente, ele preencherá efetivamente a memória :)

Se o seu valor em cache estiver próximo ao total disponível, o problema será que um grande número de páginas lidas na memória do disco não é relevante (e, portanto, não é tocado pelo) processo mongod. O candidato usual para esse tipo de discrepância é o readahead. Já abordei esse tópico em particular em outro lugar em detalhes, portanto, vincularei essas duas respostas para futuras leituras, se necessário.

Adam C
fonte