Esta seção oferece uma visão geral abrangente dos componentes de hardware e sua influencia no processo mongot. Ele fornece diretrizes de dimensionamento, recomendações essenciais de monitoramento e conselhos práticos de dimensionamento.
CPU
Impacto
Aumentar o número e a qualidade das CPUs geralmente tem um impacto positivo na taxa de transferência de replicação e na taxa de transferência de query (QPS). A CPU é especialmente aproveitada para queries que usam a pesquisa simultânea de segmentos.
Diretriz de dimensionamento
Uma estimativa útil com base na taxa de transferência da query é de 10 QPS por núcleo de CPU. Esta é uma linha de base, pois o QPS real é influenciada pela complexidade da query e mapeamentos de índice.
Monitoramento
Ver consistentemente o uso da CPU acima de 80% sugere a necessidade de escalar (adicionar núcleos de CPU), enquanto consistentemente abaixo de 20% pode indicar uma oportunidade de reduzir (reduzir os núcleos de CPU).
ESCALABILIDADE
O dimensionamento horizontal (adicionar mais nós mongot) aumenta o total da CPU para aumentar o QPS.
Observação
O dimensionamento horizontal adiciona carga adicional a um conjunto de réplicas porque cada mongot precisa replicar dados de índice de uma collection de origem. Cada pesquisa ou índice de pesquisa vetorial cria um novo change stream por mongot, o que pode degradar o desempenho se o conjunto de réplicas não for dimensionado para lidar com a carga de replicação adicional.
O dimensionamento vertical afeta principalmente a latência da query, pois pode atender a mais queries em paralelo e reduzir o enfileiramento de solicitações de query.
Memória (RAM)
Impacto
mongot usa memória do sistema para heap JVM (para estruturas de dados e caches relacionados ao Lucene) e cache do sistema de arquivos (para acessar com eficiência dados indexados).
Diretriz de dimensionamento
Para arquiteturas colocalizadas, as configurações padrão oferecem um bom equilíbrio. No entanto, para a infraestrutura dedicada, ajustar o tamanho padrão do heap da JVM pode ser benéfico. As seções a seguir fornecem orientações sobre como otimizar essa configuração para seu hardware e volume de trabalho específicos.
Dimensionamento do heap da JVM
mongot usa o heap JVM principalmente para estruturas de dados e caches relacionados ao Lucene. Em geral, o uso de heap de mongot é dimensionado aproximadamente com o número de campos indexados. O uso do heap não é amplamente afetado pelo número de documentos ou pelo número de vetores. A modelagem de dados eficaz para pesquisa de texto completo e pesquisa vetorial geralmente minimiza o número de campos indexados.
Como estimativa, aloque 50% do total de memória do sistema disponível, sem exceder o máximo de aproximadamente 30GB. Isso permite que memória suficiente seja usada para o cache do sistema de arquivos do sistema operacional, que executa um papel essencial no desempenho do Lucene ao armazenar em cache segmentos de índice acessados com frequência do disco. Por padrão, o mongot aloca até 25% do total de memória do sistema disponível para o heap da JVM , até 32GB (com 128GB de memória do sistema). Essas diretrizes de dimensionamento são um aumento desse padrão.
Além disso, manter os tamanhos de heap abaixo de 30GB permite que a JVM use ponteiros de objeto compactados, economizando memória. Se os tamanhos de heap forem aumentados acima desse limite de 30GB, recomenda-se que o tamanho de heap seja aumentado diretamente para 48GB ou superior.
Para substituir as configurações de tamanho de heap padrão, especifique o tamanho exigido como argumentos para o script de início do mongot. É recomendado definir o tamanho mínimo de heap (Xms) e máximo de heap (Xmx) para o mesmo valor. Por exemplo:
/etc/mongot/mongot --config /etc/mongot/mongot.conf --jvm-flags "-Xms4g -Xmx4g"
Cache do sistema de arquivos
Os segmentos de índice são acessados por meio de arquivos mapeados de memória, portanto, a latência e a taxa de transferência da query dependem muito do cache do sistema de arquivos do sistema operacional. Você deve agendar memória suficiente para o volume de trabalho do cache do sistema de arquivos. O uso de hardware isolado para mongot pode reduzir a contenção de cache.
Observação
Aumentar o tamanho do heap da JVM além de 50% da memória disponível pode resultar em memória insuficiente para o uso do cache do sistema de arquivos.
Orientação para Vector Search
Para pesquisa vetorial, a "Memória do Processo de Pesquisa" é usada para armazenamento eficiente de estruturas de dados como o gráfico HNSW. Se o tamanho do índice vetorial exceder 3GB, use a quantização vetorial. Ao numerar seus vetores, apenas 4% do índice precisa ser armazenado na memória, em vez do índice completo.
Monitoramento de memória insuficiente
Um aumento nas falhas da página de pesquisa e no IOPS de disco indica que o sistema operacional está recuperando frequentemente páginas necessárias do disco, sugerindo memória baixa. Ver consistentemente Falhas de Página acima de 1000/s é uma indicação para considerar o aumento.
ESCALABILIDADE
Se o processo mongot terminar com um OutOfMemoryError, significa que o JVM Heap é muito pequeno para sua indexação e volume de trabalho de query. Isso geralmente é causado pelo armazenamento de muitos campos de origem ou por uma "explosão de mapeamento" de mapeamentos dinâmicos em dados não estruturados. As principais recomendações para resolver esse problema são:
Aumentar o tamanho do heap Java (Escalamento vertical)
A solução mais direta é alocar mais RAM para o processo mongot. Se o seu host tiver memória disponível, você poderá aumentar o tamanho máximo do heap Java . Isso oferece mais espaço para os padrões de índice e query existentes sem alterar a definição do índice.
Reduzir o espaço de memória do índice
Se dimensionar o hardware não for uma opção, ou se você quiser otimizar a eficiência, poderá reduzir a quantidade de memória exigida pelo índice.
Revise sua definição de índice e reduza os campos storedSource e remova todos os campos não essenciais do índice para reduzir a pressão do heap.
Usar mapeamento estático. Um mapeamento dinâmico criará um campo de índice para cada campo exclusivo nos documentos de uma coleção. Ser mais seletivo e indexar apenas campos essenciais reduzirá o consumo de heap.
Taxa de transferência e armazenamento de disco
Impacto
As IOPS de leitura e gravação são cruciais para o desempenho mongot, afetando a replicação, a sincronização inicial e a taxa de transferência da query. Para a maioria dos casos de uso, recomendamos SSDs de uso geral.
Geralmente, os IOPS de leitura e gravação são importantes para o desempenho do mongot. A replicação de dados envolve não apenas gravações em disco, mas também leituras, à medida que segmentos de índice antigos são mesclados em segmentos maiores. Assim, a taxa de transferência do disco tem vários efeitos em todos os aspectos do desempenho do mongot, desde a taxa de transferência da query até a taxa de transferência da indexação sincronização inicial .
Diretriz de dimensionamento
Reconstruções de Índices
Criar ou reconstruir um índice do Atlas Search exige muitos recursos e pode impacto o desempenho do cluster. Para indexação sem tempo de inatividade, aloque espaço livre em disco igual a 125% do espaço em disco usado pelo seu índice antigo. Esse espaço é importante porque o índice antigo é mantido no disco durante uma reconstrução. Como recomendações gerais, você deve dobrar a permissão de disco para mongot para acomodar as reconstruções do índice.
Monitoramento
Para acompanhar o consumo atual do índice, monitore Search Disk Space Used. O uso contínuo de IOPS acima de 1K exige uma análise.
Observação
Quando a utilização do armazenamento do host mongot atinge 90%, mongot entra em um estado somente de leitura. Enquanto estiver nesse estado, mongot continua a atender consultas usando os índices em seu estado atual. Os resultados da pesquisa podem ficar obsoletos se forem feitas alterações na collection de origem sem mitigação.
Para retomar a sincronização do índice com as coleções de origem, reduza a utilização do armazenamento para abaixo de 85% excluindo dados de índice ou aumentando a capacidade de armazenamento.
ESCALABILIDADE
Ao aumentar os tamanhos dos índices e com volumes maiores de dados de índice, especialmente com quantização binária, certifique-se de que as instâncias tenham memória suficiente para suportar conjuntos de trabalho maiores de dados de índice. No entanto, a quantidade exata de memória necessária varia dependendo da carga de trabalho.
Por exemplo, grandes conjuntos de dados que raramente são consultados em sua totalidade podem ser capazes de atender a queries em uma baixa latência com menos memória do que o conjunto de dados do mesmo tamanho que geralmente é consultado em sua totalidade .
Se você usar mongot com altas taxas de armazenamento para memória, monitore cuidadosamente o uso da memória. Como exemplo, 64GB de memória pode não ser suficiente para 6400GB de armazenamento.