Entender a memória compartilhada do PostgreSQL
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