Os nós parecem estar usando mais memória do que quando estavam em execução com o Cassandra 2.1.
Quando os nós foram atualizados para uma versão mais recente do Cassandra, a utilização de memória nos servidores subitamente disparou, com alguns nós relatando erros de falta de memória. O que está causando esse comportamento?
Sintomas
Usuários relataram problemas de desempenho não observados quando os clusters estavam sendo executados com o Cassandra 2.1. Logo após a atualização para o Cassandra 2.2 ou 3.x, os nós apresentam problemas apesar de fatores como carga do aplicativo, tráfego do cluster, padrões de acesso, hora do dia/semana/mês e recursos de hardware/rede serem iguais.
Os sintomas incluem:
top
ousar
).nodetool tablehistograms
saída).Em um caso raro, o Cassandra iniciado em um nó não consegue concluir a sequência de inicialização porque a maior parte da memória é consumida muito rapidamente e eventualmente se esgota, então o Linux
oom-killer
encerra o processo do Cassandra.Causa
O Apache Cassandra usa E/S de arquivo mapeado na memória por meio da chamada de sistema Unix
mmap()
(oummap
para abreviar). A chamada de sistema mmap permite que o Cassandra use a memória virtual do sistema operacional para armazenar cópias de arquivos de dados, de modo que a leitura de SSTables seja rápida. Uma propriedade ocultacassandra.yaml
chamadadisk_access_mode
determina como os arquivos de dados são acessados. As opções válidas são:auto
(padrão) - tanto os dados SSTable quanto os arquivos de índice são mapeados em sistemas de 64 bits; somente os arquivos de índice são mapeados para sistemas de 32 bitsmmap
- ambos os arquivos de dados e índice são mapeados para a memóriammap_index_only
- somente arquivos de índice são mapeados para a memóriastandard
- Cassandra usa IO padrão e nenhum arquivo é mapeado para a memóriaNas versões do Cassandra 2.1 ou anteriores, a leitura de SSTables compactadas envolvia os dados sendo copiados no heap e então enviados para um buffer no heap para serem descompactados e se comportando como se o modo de acesso ao disco estivesse definido,
mmap_index_only
apesar do modo padrão serauto
.Com o suporte adicional para descompressão direta de buffer no Cassandra 2.2 ( CASSANDRA-8464 ), o comportamento do modo de acesso ao disco mudou para a forma como foi projetado, ou seja, o
auto
modo padrão em sistemas de 64 bits agorammap()
inclui dados SSTable e arquivos de índice.Em casos em que há muitas leituras aleatórias, e o conjunto de SSTables sendo lido intensamente é maior do que a memória disponível, os nós afetados terão um alto número de falhas de página. Em alguns casos, os servidores afetados ficam sem memória e o Linux
oom-killer
encerra o Cassandra.Solução
Como o CASSANDRA-8464 permite mapear dados compactados diretamente, é mais eficiente mapear apenas arquivos de índice.
Com o padrão
disk_access_mode: auto
durante a inicialização, o Cassandra registra uma entrada semelhante a esta:Definido
disk_access_mode
para :mmap_index_only
cassandra.yaml
Após reiniciar o Cassandra, uma entrada nos logs será semelhante a:
Esta entrada de log indica que os arquivos de dados SSTable são usados com E/S de disco padrão, mas os arquivos de índice serão mapeados para a memória.
Créditos
Esta postagem foi republicada do artigo da Base de conhecimento de suporte do DataStax Aumento do uso de memória em nós após a atualização para o DSE 5.0 ou DSE 5.1 e a Comunidade DataStax (retirado em preferência para a Rede Stack Exchange).