Por que o mongod não está usando toda a RAM disponível?

1

Temos um runnning mongod instance em uma VM e parece não estar usando toda a memória disponível. Sua falha de página é significativamente maior do que o normal, e o desempenho do sistema foi significativamente degradado ultimamente.

Mais especificamente, se eu htop mongod , eu vejo:

  • VIRT: 3471G
  • RES: 11.8G

A VM tem ~ 60 GB de memória, atualmente, ~ 4.6GB é "usada" e o restante está em buffers ou cache.

Meu entendimento é que mongod mmap s os arquivos de banco de dados. (É por isso que VIRT é enorme.) No entanto, não estamos claros sobre o motivo pelo qual o número RES não está mais próximo de 60 GB: como mongod precisa de dados do disco, esses dados devem ser incluídos nos processos RSS, não? O Mongo relata que é uma falha de página, portanto, seria de se supor que o RSS cresceria com o tempo; o nosso está se mantendo firme.

Não há nada mais significativo em execução nesta máquina. (É o servidor de banco de dados.) O que está consumindo o restante de buffers e cache e, especificamente, por que o RES size de mongod não está expandindo para preencher a RAM disponível?

    
por Thanatos 23.02.2014 / 04:47

1 resposta

2

Esse pode ser um processo longo e complicado, mas deixe-me primeiro dizer isso como um ponto de partida. Eu (e muitos outros com quem já trabalhei) consegui chegar mais perto do uso máximo de memória residente. Exatamente o que esse máximo é, vai variar de sistema para sistema e tem um monte de variáveis que entram em jogo, mas eu geralmente tiro para 60-80%, qualquer coisa maior é um bônus.

A próxima coisa a fazer é alguma leitura. Tem havido bastante escrito sobre este tópico, muitas vezes a partir da outra perspectiva (melhor eficiência de memória, ajustando-se mais à RAM quando ela está cheia, etc.). Por exemplo:

Com tudo isso fora do caminho, você espera ter uma idéia decente sobre como ajustar seu sistema para tirar o máximo proveito da memória disponível (geralmente, mas nem sempre, derrubando a leitura e certificando-se de NUMA está desativada com sucesso), e são capazes de ver onde mais a pressão da memória pode estar chegando de. A próxima parte a ser entendida é um pouco mais complicada e envolve o funcionamento do diário do MongoDB, e como isso, por sua vez, interage com o modo como o kernel rastreia o uso da memória de processos individuais.

Isso é abordado em detalhes como parte de uma longa edição do MongoDB Jira - SERVIDOR-9415 . O que descobrimos ao investigar esse problema é que o comportamento do periódico ao fazer uma mescla de leituras e gravações poderia (drasticamente reduzir a memória residente relatada para o processo do MongoDB) (nem sempre, mas era reproduzível). A mecânica disso foi descrita em detalhes por Kristina Chodorow aqui e há mais detalhes na edição de Jira também.

Então, o que tudo isso significa?

Isso significa que o relatório e a interpretação das estatísticas de memória residentes são complexas, particularmente em um sistema que também faz gravações, especialmente se esse sistema tiver pressão de memória fora do processo mongod . Em geral, recomendo a seguinte metodologia:

  • Leia em ( toque ou o pré-aquecimento manual com uma consulta / explicação grande) uma quantidade grande e conhecida de dados que devem caber na memória
  • Execute algumas consultas, agregações etc. nesse conjunto de dados e verifique se a falha na página é mínima
  • Se as falhas de página forem baixas, os dados estarão na memória, você terá um problema de geração de relatórios. Você pode repetir os testes com conjuntos de dados maiores até encontrar seu limite real.
  • Se as falhas de página forem altas, os dados foram removidos, não foram totalmente carregados etc. e você deve investigar (pressão de leitura, pressão da memória, certificar-se de que o NUMA está desativado, etc.)

Eu geralmente recomendo executar o Monitoramento de MMS (gratuito) durante o teste, permitindo que você rastreie as estatísticas de memória, bem como as não Memória mapeada ao longo do tempo, falhas de página e muito mais, bem como mongostat (para sub um resolução mínima) para obter uma imagem decente do que está acontecendo.

    
por 24.02.2014 / 15:17