Pelo que entendi, o WiredTiger comprime o diário, as coleções e os índices. Também os comprime enquanto estão armazenados na RAM?
Por exemplo, se meu índice de compressas usa 10 MiB no disco, posso assumir que eles também usam 10 MiB de RAM? Ou devo esperar um índice descompactado maior na RAM?
O WiredTiger tem diferentes representações de dados no disco versus na memória e usa diferentes abordagens de compactação para índices versus dados de coleta.
A resposta sobre o que é compactado na memória é um pouco sutil, mas o resumo de alto nível é:
Abordagens de Compressão
Por padrão, o WiredTiger usa compactação de bloco Snappy para dados de coleta, mas há outras opções disponíveis, incluindo compactação zlib ou sem compactação. A compactação de bloco pode fornecer economia significativa de armazenamento, mas os dados devem ser descompactados para serem manipulados pelo servidor. Independentemente das opções de compactação, os dados ainda são gravados no disco em um formato de bloco que difere da representação na memória no cache do WiredTiger.
Os índices são compactados usando a compactação de prefixo de índice, que efetivamente elimina a duplicação de prefixos comuns de campos indexados. Isso pode ser especialmente eficaz para índices compostos, pois os valores de campo iniciais serão repetidos com valores exclusivos para campos adicionais no índice. A compactação de prefixo também permite que as consultas operem diretamente em índices compactados.
O que está compactado na RAM?
Como no MongoDB 3.4 (e incluindo versões anteriores do MongoDB com WiredTiger), existem dois caches significativos para dados na RAM:
O cache interno WiredTiger, que é controlado pela definição de
cacheSizeGB
configuração .O tamanho do cache padrão no MongoDB 3.4 é o maior de 50% de RAM menos 1 GB ou 256 MB. Os dados de coleta no cache interno são descompactados, no entanto, os dados de índice ainda usam a compactação de prefixo. Os dados no cache interno do WiredTiger são efetivamente o conjunto de trabalho atual .
O cache do sistema de arquivos do sistema operacional, que geralmente é o restante da RAM livre que não é usada pelo cache WiredTiger ou outros processos.
O cache do sistema de arquivos é idêntico à representação em disco.
Ajuste de Cache
Observe que o cache WiredTiger não representa o uso total de memória do MongoDB:
mongod
ainda será necessário alocar memória fora do cache para outros usos, como conexões e processamento de dados (por exemplo, agregação, mapa/redução, classificação na memória).O cache interno do WiredTiger geralmente deve ser deixado no tamanho padrão ou potencialmente reduzido. Se seus dados forem bem compactados e os dados não compactados forem muito maiores que a RAM, você poderá colocar mais dados na RAM geral reduzindo o tamanho do cache do WiredTiger para liberar memória para o cache do sistema de arquivos. O manual do MongoDB tem um FAQ com mais informações: Para que tamanho devo definir o cache interno do WiredTiger? .
Para obter mais informações, recomendo revisar a postagem do blog New Compression Options in MongoDB 3.0 e a apresentação A Technical Introduction to WiredTiger .