Compreender a memória partilhada do PostgreSQL
O PostgreSQL utiliza 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 consultas. Os seguintes parâmetros de servidor permitem definir o uso da memória:
work_mem define a memória necessária para classificar tuplas para operações ORDER BY e DISTINCT. Este 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 pode melhorar o desempenho, permitindo verificações maiores na memória antes de derramar para o disco.
No entanto, uma consulta complexa pode ter muitas operações de classificação e hash em execução simultânea. Cada operação usa a quantidade de memória permitida por esse valor 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 work_mem individual.
Para ajustar este valor, use Total RAM * 0.25 / max_connections como valor inicial.
maintenance_work_mem é a memória exigida pelo vácuo e reindexação. Este 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 aspiração.
autovacuum_work_mem define a memória máxima a ser usada por cada processo de autovácuo.
temp_buffers define a memória para armazenar tabelas temporárias. Este 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. É mais provável que as varreduras de índice sejam usadas contra valores mais altos; caso contrário, as verificações sequenciais serão usadas se o valor for baixo.
Defina effective_cache_size para 50% da RAM total da máquina.
Memória partilhada
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 compartilhados e, em seguida, funciona neles na memória. Esse pool de buffer compartilhado é o principal componente 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, será necessário reiniciar o servidor.
wal_buffers define o número de buffers de página de disco na memória compartilhada para registro antecipado de gravação (WAL) antes de gravá-lo no armazenamento persistente.
Em resumo, os parâmetros importantes do servidor relacionados à memória que você pode querer ajustar são:
- shared_buffers
- work_mem
- effective_cache_size