Partilhar via


Utilização de Recursos / Memória

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

commit_timestamp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de marca temporal de confirmação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 0-131072
Tipo de parâmetro estático
Documentation commit_timestamp_buffers

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

hash_mem_multiplier

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Múltiplo de "work_mem" a utilizar para tabelas de hash.
Tipo de dados numérico
Valor predefinido 2
Valores permitidos 1-1000
Tipo de parâmetro dynamic
Documentation hash_mem_multiplier

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Uso de páginas enormes no Linux ou Windows.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

tamanho_de_página_grande

Attribute Valor
Categoria Utilização de Recursos / Memória
Description O tamanho da página enorme que deve ser solicitado.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation huge_page_size

io_combine_limit

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Limite o tamanho dos dados lidos e gravados.
Tipo de dados número inteiro
Valor predefinido 16
Valores permitidos 1-128
Tipo de parâmetro dynamic
Documentation io_combine_limit

io_max_combine_limit

Attribute Valor
Categoria Utilização de Recursos / Memória
Description ** Limite em todo o servidor que limita o parâmetro io_combine_limit.
Tipo de dados número inteiro
Valor predefinido 16
Valores permitidos 1-128
Tipo de parâmetro dynamic
Documentation io_max_combine_limit

io_max_concurrency

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Número máximo de IOs que um processo pode executar simultaneamente.
Tipo de dados número inteiro
Valor predefinido 64
Valores permitidos -1-1024
Tipo de parâmetro estático
Documentation io_max_concurrency

io_method

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona o método para executar E/S assíncrona.
Tipo de dados enumeração
Valor predefinido worker
Valores permitidos worker,sync
Tipo de parâmetro estático
Documentation io_method

io_workers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Número de processos de trabalho de E/S, para io_method=worker.
Tipo de dados número inteiro
Valor predefinido 3
Valores permitidos 1-32
Tipo de parâmetro dynamic
Documentation io_workers

logical_decoding_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para decodificação lógica. Essa quantidade de memória pode ser usada por cada buffer de reordenação interno antes de derramar para o disco.
Tipo de dados número inteiro
Valor predefinido 65536
Valores permitidos 64-2147483647
Tipo de parâmetro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção. Isso inclui operações como VACUUM e CREATE INDEX.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Quantidade de memória compartilhada dinâmica reservada na inicialização.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation min_dynamic_shared_memory

multixact_buffers_de_membros

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de membros do MultiXact.
Tipo de dados número inteiro
Valor predefinido 32
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation multixact_member_buffers

multixact_offset_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de deslocamento MultiXact.
Tipo de dados número inteiro
Valor predefinido 16
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation multixact_offset_buffers

notify_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de mensagens LISTEN/NOTIFY .
Tipo de dados número inteiro
Valor predefinido 16
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation notify_buffers

serializable_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do pool de buffer dedicado usado para o cache de transações serializável.
Tipo de dados número inteiro
Valor predefinido 32
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation serializable_buffers

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memória_compartilhada

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada.
Tipo de dados enumeração
Valor predefinido mmap
Valores permitidos mmap
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada

subtransaction_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do pool de buffer dedicado usado para o cache de subtransações. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 0-131072
Tipo de parâmetro estático
Documentation subtransaction_buffers

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

transaction_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de status da transação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 0-131072
Tipo de parâmetro estático
Documentation transaction_buffers

vacuum_buffer_usage_limit

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do pool de buffer para VACUUM, ANALYZE e autovacuum.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 0-16777216
Tipo de parâmetro dynamic
Documentation vacuum_buffer_usage_limit

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para espaços de trabalho de consulta. Essa quantidade de memória pode ser usada por cada operação de classificação interna e tabela de hash antes de mudar para arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

commit_timestamp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de marca temporal de confirmação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 0-131072
Tipo de parâmetro estático
Documentation commit_timestamp_buffers

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

hash_mem_multiplier

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Múltiplo de "work_mem" a utilizar para tabelas de hash.
Tipo de dados numérico
Valor predefinido 2
Valores permitidos 1-1000
Tipo de parâmetro dynamic
Documentation hash_mem_multiplier

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Uso de páginas enormes no Linux ou Windows.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

tamanho_de_página_grande

Attribute Valor
Categoria Utilização de Recursos / Memória
Description O tamanho da página enorme que deve ser solicitado.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation huge_page_size

io_combine_limit

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Limite o tamanho dos dados lidos e gravados.
Tipo de dados número inteiro
Valor predefinido 16
Valores permitidos 16
Tipo de parâmetro só de leitura
Documentation io_combine_limit

logical_decoding_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para decodificação lógica. Essa quantidade de memória pode ser usada por cada buffer de reordenação interno antes de derramar para o disco.
Tipo de dados número inteiro
Valor predefinido 65536
Valores permitidos 64-2147483647
Tipo de parâmetro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção. Isso inclui operações como VACUUM e CREATE INDEX.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Quantidade de memória compartilhada dinâmica reservada na inicialização.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation min_dynamic_shared_memory

multixact_buffers_de_membros

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de membros do MultiXact.
Tipo de dados número inteiro
Valor predefinido 32
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation multixact_member_buffers

multixact_offset_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de deslocamento MultiXact.
Tipo de dados número inteiro
Valor predefinido 16
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation multixact_offset_buffers

notify_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de mensagens LISTEN/NOTIFY .
Tipo de dados número inteiro
Valor predefinido 16
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation notify_buffers

serializable_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do pool de buffer dedicado usado para o cache de transações serializável.
Tipo de dados número inteiro
Valor predefinido 32
Valores permitidos 16-131072
Tipo de parâmetro estático
Documentation serializable_buffers

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memória_compartilhada

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada.
Tipo de dados enumeração
Valor predefinido mmap
Valores permitidos mmap
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada

subtransaction_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do pool de buffer dedicado usado para o cache de subtransações. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 0-131072
Tipo de parâmetro estático
Documentation subtransaction_buffers

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

transaction_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do buffer pool dedicado usado para o cache de status da transação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 0-131072
Tipo de parâmetro estático
Documentation transaction_buffers

vacuum_buffer_usage_limit

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do pool de buffer para VACUUM, ANALYZE e autovacuum.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 0-16777216
Tipo de parâmetro dynamic
Documentation vacuum_buffer_usage_limit

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para espaços de trabalho de consulta. Essa quantidade de memória pode ser usada por cada operação de classificação interna e tabela de hash antes de mudar para arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

hash_mem_multiplier

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Multiplicador de work_mem a usar para tabelas de hash.
Tipo de dados numérico
Valor predefinido 2
Valores permitidos 1-1000
Tipo de parâmetro dynamic
Documentation hash_mem_multiplier

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Habilita/desabilita o uso de páginas de memória enormes. Essa configuração não é aplicável a servidores com menos de 4 vCores.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

tamanho_de_página_grande

Attribute Valor
Categoria Utilização de Recursos / Memória
Description O tamanho da página enorme que deve ser solicitado.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation huge_page_size

logical_decoding_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para decodificação lógica.
Tipo de dados número inteiro
Valor predefinido 65536
Valores permitidos 64-2147483647
Tipo de parâmetro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Create Index.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você deve definir esse parâmetro para o mesmo valor ou maior do que no servidor primário.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Quantidade de memória compartilhada dinâmica reservada na inicialização.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation min_dynamic_shared_memory

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% - 75% da memória disponível.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memória_compartilhada

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada.
Tipo de dados enumeração
Valor predefinido mmap
Valores permitidos mmap
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão de banco de dados.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

vacuum_buffer_usage_limit

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o tamanho do pool de buffer para VACUUM, ANALYZE e autovacuum.
Tipo de dados número inteiro
Valor predefinido 256
Valores permitidos 0-16777216
Tipo de parâmetro dynamic
Documentation vacuum_buffer_usage_limit

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a quantidade de memória a ser usada por operações de classificação internas e tabelas de hash antes de gravar em arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

hash_mem_multiplier

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Multiplicador de work_mem a usar para tabelas de hash.
Tipo de dados numérico
Valor predefinido 2
Valores permitidos 1-1000
Tipo de parâmetro dynamic
Documentation hash_mem_multiplier

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Habilita/desabilita o uso de páginas de memória enormes. Essa configuração não é aplicável a servidores com menos de 4 vCores.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

tamanho_de_página_grande

Attribute Valor
Categoria Utilização de Recursos / Memória
Description O tamanho da página enorme que deve ser solicitado.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation huge_page_size

logical_decoding_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para decodificação lógica.
Tipo de dados número inteiro
Valor predefinido 65536
Valores permitidos 64-2147483647
Tipo de parâmetro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Create Index.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você deve definir esse parâmetro para o mesmo valor ou maior do que no servidor primário.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Quantidade de memória compartilhada dinâmica reservada na inicialização.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation min_dynamic_shared_memory

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% - 75% da memória disponível.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memória_compartilhada

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada.
Tipo de dados enumeração
Valor predefinido mmap
Valores permitidos mmap
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão de banco de dados.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a quantidade de memória a ser usada por operações de classificação internas e tabelas de hash antes de gravar em arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

hash_mem_multiplier

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Multiplicador de work_mem a usar para tabelas de hash.
Tipo de dados numérico
Valor predefinido 1
Valores permitidos 1-1000
Tipo de parâmetro dynamic
Documentation hash_mem_multiplier

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Habilita/desabilita o uso de páginas de memória enormes. Essa configuração não é aplicável a servidores com menos de 4 vCores.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

tamanho_de_página_grande

Attribute Valor
Categoria Utilização de Recursos / Memória
Description O tamanho da página enorme que deve ser solicitado.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation huge_page_size

logical_decoding_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para decodificação lógica.
Tipo de dados número inteiro
Valor predefinido 65536
Valores permitidos 64-2147483647
Tipo de parâmetro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Create Index.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você deve definir esse parâmetro para o mesmo valor ou maior do que no servidor primário.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

min_dynamic_shared_memory

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Quantidade de memória compartilhada dinâmica reservada na inicialização.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0
Tipo de parâmetro só de leitura
Documentation min_dynamic_shared_memory

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% - 75% da memória disponível.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memória_compartilhada

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada.
Tipo de dados enumeração
Valor predefinido mmap
Valores permitidos mmap
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão de banco de dados.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a quantidade de memória a ser usada por operações de classificação internas e tabelas de hash antes de gravar em arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

hash_mem_multiplier

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Multiplicador de work_mem a usar para tabelas de hash.
Tipo de dados numérico
Valor predefinido 1
Valores permitidos 1-1000
Tipo de parâmetro dynamic
Documentation hash_mem_multiplier

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Habilita/desabilita o uso de páginas de memória enormes. Essa configuração não é aplicável a servidores com menos de 4 vCores.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

logical_decoding_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para decodificação lógica.
Tipo de dados número inteiro
Valor predefinido 65536
Valores permitidos 64-2147483647
Tipo de parâmetro dynamic
Documentation logical_decoding_work_mem

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Create Index.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você deve definir esse parâmetro para o mesmo valor ou maior do que no servidor primário.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% - 75% da memória disponível.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memória_compartilhada

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada.
Tipo de dados enumeração
Valor predefinido mmap
Valores permitidos mmap
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão de banco de dados.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a quantidade de memória a ser usada por operações de classificação internas e tabelas de hash antes de gravar em arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

hash_mem_multiplier

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Multiplicador de work_mem a usar para tabelas de hash.
Tipo de dados numérico
Valor predefinido 1
Valores permitidos 1-1000
Tipo de parâmetro dynamic
Documentation hash_mem_multiplier

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Habilita/desabilita o uso de páginas de memória enormes. Essa configuração não é aplicável a servidores com menos de 4 vCores.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Create Index.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você deve definir esse parâmetro para o mesmo valor ou maior do que no servidor primário.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% - 75% da memória disponível.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

tipo_de_memória_compartilhada

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada usada para a região principal de memória compartilhada.
Tipo de dados enumeração
Valor predefinido mmap
Valores permitidos mmap
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão de banco de dados.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a quantidade de memória a ser usada por operações de classificação internas e tabelas de hash antes de gravar em arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.

autovacuum_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático.
Tipo de dados número inteiro
Valor predefinido -1
Valores permitidos -1-2097151
Tipo de parâmetro dynamic
Documentation autovacuum_work_mem

tipo_de_memória_partilhada_dinâmica

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Seleciona a implementação de memória compartilhada dinâmica usada.
Tipo de dados enumeração
Valor predefinido posix
Valores permitidos posix
Tipo de parâmetro só de leitura
Documentation tipo_de_memória_partilhada_dinâmica

páginas grandes

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Habilita/desabilita o uso de páginas de memória enormes. Essa configuração não é aplicável a servidores com menos de 4 vCores.
Tipo de dados enumeração
Valor predefinido try
Valores permitidos on,off,try
Tipo de parâmetro estático
Documentation huge_pages

Description

Páginas enormes são um recurso que permite que a memória seja gerenciada em blocos maiores. Normalmente, você pode gerenciar blocos de até 2 MB, em oposição às páginas padrão de 4 KB.

O uso de páginas enormes pode oferecer vantagens de desempenho que efetivamente descarregam a CPU:

  • Eles reduzem a sobrecarga associada a tarefas de gestão de memória, como a redução de falhas de buffer de tradução lookaside (TLB).
  • Eles reduzem o tempo necessário para o gerenciamento de memória.

Especificamente, no PostgreSQL, você pode usar páginas enormes apenas para a área de memória compartilhada. Uma parte significativa da área de memória compartilhada é alocada para buffers compartilhados.

Outra vantagem é que páginas enormes impedem a troca da área de memória compartilhada para o disco, o que estabiliza ainda mais o desempenho.

Recommendations

  • Para servidores com recursos de memória significativos, evite desativar páginas enormes. Desativar páginas enormes pode comprometer o desempenho.
  • Caso comece com um servidor menor que não suporta páginas enormes, mas antecipe escalar-se para um servidor que o suporte, mantenha a configuração huge_pages em TRY para uma transição perfeita e desempenho ideal.

Notas específicas do Azure

Para servidores com quatro ou mais vCores, páginas enormes são automaticamente alocadas a partir do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas enormes é ajustado automaticamente se quaisquer configurações de memória compartilhada forem alteradas, incluindo alterações no shared_buffers.

maintenance_work_mem

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Create Index.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 1024-2097151
Tipo de parâmetro dynamic
Documentation maintenance_work_mem

Description

maintenance_work_mem é um parâmetro de configuração no PostgreSQL. Ele governa a quantidade de memória alocada para operações de manutenção, como VACUUM, CREATE INDEXe ALTER TABLE. Ao contrário de work_mem, que afeta a alocação de memória para operações de consulta, maintenance_work_mem é reservado para tarefas que mantêm e otimizam a estrutura do banco de dados.

! [OBSERVAÇÃO] A configuração maintenance_work_mem para valores excessivamente agressivos pode causar periodicamente erros de falta de memória no sistema. É extremamente importante entender a quantidade de memória disponível no servidor e o número de operações simultâneas que podem alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.

Pontos principais:

  • Tampa de memória de vácuo: Se você quiser acelerar a limpeza de tuplas mortas aumentando maintenance_work_mem, esteja ciente de que VACUUM tem uma limitação embutida para coletar identificadores de tupla morta. Ele pode usar apenas até 1 GB de memória para este processo.
  • Separação de memória para autovácuo: Você pode usar a autovacuum_work_mem configuração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto de maintenance_work_mem. Você pode decidir quanta memória o autovacuum usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.

Notas específicas do Azure

O valor padrão para o maintenance_work_mem parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não terão qualquer efeito sobre o valor padrão para o maintenance_work_mem parâmetro de servidor dessa instância.

Toda vez que você alterar o produto atribuído a uma instância, você também deve ajustar o valor para o maintenance_work_mem parâmetro de acordo com os valores na fórmula a seguir.

A fórmula usada para calcular o valor de maintenance_work_mem é (long)(82.5 * ln(memoryGiB) + 40) * 1024.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória maintenance_work_mem
2 GiB 99.328 KiB
4 GiB 157.696 KiB
8 GiB 216.064 KiB
16 GiB 274.432 KiB
32 GiB 332.800 KiB
48 GiB 367.616 KiB
64 GiB 392.192 KiB
80 GiB 410.624 KiB
128 GiB 450.560 KiB
160 GiB 468.992 KiB
192 GiB 484.352 KiB
256 GiB 508.928 KiB
384 GiB 542.720 KiB
432 GiB 552.960 KiB
672 GiB 590.848 KiB

max_prepared_transactions (máximo de transações preparadas)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você deve definir esse parâmetro para o mesmo valor ou maior do que no servidor primário.
Tipo de dados número inteiro
Valor predefinido 0
Valores permitidos 0-262143
Tipo de parâmetro estático
Documentation max_prepared_transactions

max_stack_depth

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a profundidade máxima da pilha, em quilobytes.
Tipo de dados número inteiro
Valor predefinido 2048
Valores permitidos 2048
Tipo de parâmetro só de leitura
Documentation max_stack_depth

shared_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% - 75% da memória disponível.
Tipo de dados número inteiro
Valor predefinido Depende dos recursos (vCores, RAM ou espaço em disco) alocados para o servidor.
Valores permitidos 16-1073741823
Tipo de parâmetro estático
Documentation shared_buffers

Description

O parâmetro de configuração shared_buffers determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenamento em buffer de dados. Ele serve como um pool de memória centralizado acessível a todos os processos de banco de dados.

Quando os dados são necessários, o processo do banco de dados primeiro verifica o buffer compartilhado. Se os dados necessários estiverem presentes, eles serão recuperados rapidamente e ignorarão uma leitura de disco mais demorada. Os buffers compartilhados servem como intermediários entre os processos do banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.

Notas específicas do Azure

O valor padrão para o shared_buffers parâmetro server é calculado quando você provisiona a instância do Banco de Dados do Azure para servidor flexível PostgreSQL, com base no nome do produto selecionado para sua computação. Quaisquer alterações subsequentes da seleção de produtos para a computação que suporta o servidor flexível não têm qualquer efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.

Sempre que alterar o produto atribuído a uma instância, você também deve ajustar o valor do shared_buffers parâmetro de acordo com os valores nas fórmulas a seguir.

Para máquinas virtuais com até 2 GiB de memória, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 16384.

Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor de shared_buffers é memoryGib * 32768.

Com base na fórmula anterior, a tabela a seguir lista os valores para os quais esse parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:

Tamanho da memória shared_buffers
2 GiB 32768
4 GiB 131072
8 GiB 262144
16 GiB 524288
32 GiB 1048576
48 GiB 1572864
64 GiB 2097152
80 GiB 2621440
128 GiB 4194304
160 GiB 5242880
192 GiB 6291456
256 GiB 8388608
384 GiB 12582912
432 GiB 14155776
672 GiB 22020096

temp_buffers

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define o número máximo de buffers temporários usados por cada sessão de banco de dados.
Tipo de dados número inteiro
Valor predefinido 1024
Valores permitidos 100-1073741823
Tipo de parâmetro dynamic
Documentation temp_buffers

memória_de_trabalho (work_mem)

Attribute Valor
Categoria Utilização de Recursos / Memória
Description Define a quantidade de memória a ser usada por operações de classificação internas e tabelas de hash antes de gravar em arquivos de disco temporários.
Tipo de dados número inteiro
Valor predefinido 4096
Valores permitidos 4096-2097151
Tipo de parâmetro dynamic
Documentation work_mem

Description

O work_mem parâmetro no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hashing.

Ao contrário dos buffers compartilhados, que estão na área de memória compartilhada, work_mem é alocado em um espaço de memória privada por sessão ou por consulta. Ao definir um tamanho adequado work_mem , você pode melhorar significativamente a eficiência dessas operações e reduzir a necessidade de gravar dados temporários no disco.

Pontos principais:

  • Memória de conexão privada: work_mem faz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada que shared_buffers usa.
  • Uso específico da consulta: nem todas as sessões ou consultas usam work_mem. É improvável que consultas simples como SELECT 1 as exijam work_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes do work_mem.
  • Operações paralelas: Para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes do work_mem.

Monitorização e ajuste do work_mem

É essencial monitorar continuamente o desempenho do seu sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução da consulta relacionados às operações de classificação ou hash forem lentos. Eis algumas formas de monitorizar o desempenho utilizando as ferramentas disponíveis no portal do Azure:

  • Visão de desempenho da consulta: marque a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Esta situação sugere uma potencial necessidade de aumentar.work_mem
  • Guias de solução de problemas: use a guia Ficheiros temporários em excesso nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular

Enquanto você gerencia o work_mem parâmetro, geralmente é mais eficiente adotar uma abordagem de ajuste granular em vez de definir um valor global. Essa abordagem garante que você aloque memória criteriosamente com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de falta de memória. Veja como você pode fazer isso:

  • Nível de usuário: se um usuário específico estiver envolvido principalmente em tarefas de agregação ou relatório, que consomem muita memória, considere personalizar o work_mem valor para esse usuário. Use o ALTER ROLE comando para melhorar o desempenho das operações do usuário.

  • Nível de função/procedimento: Se funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o work_mem valor no nível de função ou procedimento específico pode ser benéfico. Use o ALTER FUNCTION comando ou ALTER PROCEDURE para alocar especificamente mais memória para essas operações.

  • Nível do banco de dados: altere work_mem no nível do banco de dados se apenas bancos de dados específicos estiverem gerando um grande número de arquivos temporários.

  • Nível global: Se uma análise do seu sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas alguns estão criando arquivos grandes, pode ser prudente aumentar globalmente o work_mem valor. Essa ação facilita o processamento da maioria das consultas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, seja sempre cauteloso e monitore a utilização da memória em seu servidor para garantir que ele possa lidar com o valor aumentado work_mem .

Determinação do valor mínimo de work_mem para operações de classificação

Para encontrar o valor mínimo work_mem para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:

  1. Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
  2. Defina um valor inicial work_mem ligeiramente superior a 20 MB para ter em conta cabeçalhos adicionais durante o processamento na memória. Use um comando como: SET work_mem TO '25MB'.
  3. Execute EXPLAIN ANALYZE a consulta problemática na mesma sessão.
  4. Analise a saída para "Sort Method: quicksort Memory: xkB". Se indicar "external merge Disk: xkB", aumente o work_mem valor incrementalmente e teste novamente até "quicksort Memory" aparecer. A aparência de "quicksort Memory" indica que a consulta agora está a operar na memória.
  5. Depois de determinar o valor por meio desse método, você pode aplicá-lo globalmente ou em níveis mais granulares (conforme descrito anteriormente) para atender às suas necessidades operacionais.