Memória do RDS para PostgreSQL
A memória do RDS para PostgreSQL está dividida em compartilhada e local.
Memória compartilhada no RDS para PostgreSQL
O RDS para PostgreSQL aloca memória compartilhada quando a instância é iniciada. A memória compartilhada está dividida em várias subáreas. As seções a seguir fornecem descrições das mais importantes.
Buffers compartilhados
O grupo de buffer compartilhado é uma área de memória do RDS para PostgreSQL que contém todas as páginas que estão ou estavam sendo utilizadas por conexões de aplicações. Uma página é a versão de memória de um bloco de disco. O grupo de buffer compartilhado armazena em cache os blocos de dados lidos do disco. O grupo reduz a necessidade de reler dados do disco, fazendo com que o banco de dados opere de maneira mais eficiente.
Cada tabela e índice são armazenados como uma matriz de páginas com tamanho fixo. Cada bloco contém várias tuplas, que correspondem a linhas. Uma tupla pode ser armazenada em qualquer página.
O grupo de buffer compartilhado possui memória finita. Se uma nova solicitação exigir uma página que não esteja na memória e não houver mais memória, o RDS para PostgreSQL removerá uma página utilizada com menos frequência para acomodar essa solicitação. A política de despejo é implementada por um algoritmo de varredura de relógio.
O parâmetro shared_buffers
determina a quantidade de memória que o servidor dedica ao armazenamento em cache de dados. O valor padrão é definido como {DBInstanceClassMemory/32768}
bytes, com base na memória disponível para a instância de banco de dados.
Buffers de log de gravação antecipada (WAL)
Um buffer de log de gravação antecipada (WAL) mantém dados de transação que o RDS para PostgreSQL grava posteriormente no armazenamento persistente. Utilizando o mecanismo WAL, o RDS para PostgreSQL pode fazer o seguinte:
-
Recupere dados após uma falha
-
Reduzir a E/S de disco, evitando gravações frequentes em disco
Quando um cliente altera dados, o RDS para PostgreSQL grava as alterações no buffer de WAL. Quando o cliente emite um COMMIT
, o processo gravador WAL grava dados de transação no arquivo de WAL.
O parâmetro wal_level
determina quantas informações são gravadas no WAL, com valores possíveis como minimal
, replica
e logical
.
Memória local no RDS para PostgreSQL
Todo processo de backend aloca memória local para processamento de consultas.
Tópicos
Área de memória de trabalho
A área de memória de trabalhocontém dados temporários para consultas que executam classificações e hashes. Por exemplo, uma consulta com uma cláusula ORDER
BY
executa uma classificação. Consultas usam tabelas de hash em agregações e junções de hash.
O parâmetro work_mem
é a quantidade de memória a ser utilizada por operações de classificação internas e tabelas de hash antes da gravação em arquivos de disco temporários, o que é medido em megabytes. O valor padrão é 4 MB. Várias sessões podem ser executadas simultaneamente, e cada uma pode executar operações de manutenção em paralelo. Por esse motivo, a memória de trabalho total utilizada pode ser múltiplos da configuração work_mem
.
Área de memória de trabalho para manutenção
A área de memória de trabalho para manutenção armazena dados em cache para operações de manutenção. Essas operações incluem aspiração, criação de índices e adição de chaves externas.
O parâmetro maintenance_work_mem
especifica a quantidade máxima de memória a ser utilizada por operações de manutenção, o que é medido em megabytes. O valor padrão é 64 MB. Uma sessão de banco de dados apenas pode executar uma operação de manutenção de cada vez.
Área de buffer temporária
A área de buffer temporária armazena tabelas temporárias em cache para cada sessão de banco de dados.
Cada sessão aloca buffers temporários conforme necessário até o limite especificado. Quando a sessão termina, o servidor limpa os buffers.
O parâmetro temp_buffers
define o número máximo de buffers temporários utilizados por cada sessão, o que é medido em megabytes. O valor padrão é de 8 MB. Antes do primeiro uso de tabelas temporárias em uma sessão, é possível alterar o valor de temp_buffers
.