Entender a memória compartilhada do PostgreSQL

Concluído

O PostgreSQL usa memória que pode ser classificada como:

  • Memória local – alocada para cada processo
  • Memória compartilhada – usada por todos os processos

Memória local

Cada processo no PostgreSQL requer memória para processamento de consulta. Os seguintes parâmetros de servidor permitem que você defina o uso de memória:

work_mem define a memória necessária para classificar tuplas para operações ORDER BY e DISTINCT. Esse parâmetro determina a quantidade de memória disponível para operações de classificação interna e tabelas de hash. Se você tiver uma grande quantidade de memória disponível e sua carga de trabalho tiver consultas com classificação complexa, o aumento desse valor de parâmetro poderá aprimorar o desempenho, permitindo verificações maiores na memória antes de despejar no disco.

No entanto, uma consulta complexa pode ter muitas operações de hash e de classificação em execução simultaneamente. Cada operação usa o máximo de memória que esse valor permite antes de começar a gravar em arquivos temporários baseados em disco. Portanto, em um sistema ocupado, o uso total da memória é muitas vezes maior do que o de um parâmetro work_mem individual.

Para ajustar esse valor, use a fórmula RAM Total * 0,25 / max_connections como o valor inicial.

maintenance_work_mem é a memória exigida por vacuum e reindex. Esse parâmetro determina a quantidade de memória disponível para operações de classificação interna e tabelas de hash. O valor padrão é 64 KB, mas o aumento desse valor aprimora o desempenho para aspiração.

autovacuum_work_mem define a memória máxima a ser usada por cada processo de aspiração automática.

temp_buffers define a memória para armazenamento de tabelas temporárias. Esse parâmetro define o número máximo de buffers temporários usados por cada sessão do banco de dados.

effective_cache_size define a quantidade de memória disponível para cache de disco pelo sistema operacional e dentro do banco de dados. O plano de consulta do PostgreSQL determina se essa memória é fixa na RAM. As verificações de índice têm maior probabilidade de serem usadas em valores mais altos, enquanto as verificações sequenciais são usadas se o valor for baixo.

Defina effective_cache_size como 50% da RAM total do computador.

Memória compartilhada

A memória compartilhada é alocada na inicialização. A memória compartilhada é usada para:

shared_buffers define os buffers de memória compartilhada usados pelo servidor. O PostgreSQL carrega páginas de tabelas e índices do armazenamento persistente para um pool de buffers compartilhado e trabalha neles na memória. Esse pool de buffers compartilhado é o componente principal da memória compartilhada usada pelo servidor. O valor padrão é 128 MB (dependendo da camada de computação). Se você decidir alocar mais memória, reinicie o servidor.

wal_buffers define o número de buffers de página de disco na memória compartilhada para WAL (registro em log write-ahead) antes de gravá-lo no armazenamento persistente.

Em resumo, os parâmetros de servidor importantes relacionados à memória que talvez você queira ajustar são:

  • shared_buffers
  • work_mem
  • effective_cache_size