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 internas 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, aumentar esse valor de parâmetro poderá melhorar o desempenho, permitindo verificações maiores na memória antes de derramar em disco.

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

Para ajustar esse valor, use a RAM total * 0,25/ max_connections como 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 internas e tabelas de hash. O valor padrão é 64 KB, mas aumentar esse valor melhora o desempenho para aspirar.

autovacuum_work_mem define a memória máxima a ser usada por cada processo de vácuo automático.

temp_buffers define a memória para armazenar tabelas temporárias. Esse parâmetro define o número máximo de buffers temporários usados por cada sessão de 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 planejador de consultas PostgreSQL determina se essa memória é fixa na RAM. As verificações de índice são mais propensas a serem usadas em relação a valores mais altos; caso contrário, as verificações sequenciais serã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 compartilhados usados pelo servidor. O PostgreSQL carrega páginas de tabelas e índices do armazenamento persistente para um pool de buffers compartilhado e funciona nelas na memória. Esse pool de buffer compartilhado é o componente principal da memória compartilhada usada pelo servidor. O valor padrão é de 128 MB (dependendo da camada de computação). Se você decidir alocar mais memória, precisará reiniciar 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 você poderia desejar ajustar são:

  • shared_buffers
  • work_mem (memória de trabalho)
  • tamanho_efetivo_do_cache