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 top
comando, 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.)
lsb-release -a
euname -a
, por favor)uname
mas eu não tenholsb-release
instalado.Respostas:
O tamanho da memória residente representa o número de páginas na memória realmente tocadas pelo
mongod
processo. 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: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.
fonte