Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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_pagesemTRYpara 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_mempara 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 queVACUUMtem 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_memconfiguração para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_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_memfaz parte da memória privada usada por cada sessão de banco de dados. Essa memória é distinta da área de memória compartilhada queshared_buffersusa. -
Uso específico da consulta: nem todas as sessões ou consultas usam
work_mem. É improvável que consultas simples comoSELECT 1as exijamwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dowork_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_memvalor para esse usuário. Use oALTER ROLEcomando 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_memvalor no nível de função ou procedimento específico pode ser benéfico. Use oALTER FUNCTIONcomando ouALTER PROCEDUREpara alocar especificamente mais memória para essas operações.Nível do banco de dados: altere
work_memno 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_memvalor. 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 aumentadowork_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:
- Conecte-se ao seu banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente 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'. - Execute
EXPLAIN ANALYZEa consulta problemática na mesma sessão. - Analise a saída para
"Sort Method: quicksort Memory: xkB". Se indicar"external merge Disk: xkB", aumente owork_memvalor 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. - 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.