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 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