Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
autovacuum_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
commit_timestamp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de carimbo de data/hora de confirmação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers. |
| Tipo de dados | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parâmetro | estático |
| Documentation | commit_timestamp_buffers |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
hash_mem_multiplier
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Múltiplo de "work_mem" que será usado para tabelas de hash. |
| Tipo de dados | numérico |
| Valor padrão | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parâmetro | dynamic |
| Documentation | hash_mem_multiplier |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Uso de páginas enormes no Linux ou no Windows. |
| Tipo de dados | enumeração |
| Valor padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
tamanho_de_página_grande (huge_page_size)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | O tamanho da página enorme que deve ser solicitada. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | huge_page_size |
io_combine_limit
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Limite no tamanho das leituras e gravações de dados. |
| Tipo de dados | inteiro |
| Valor padrão | 16 |
| Valores permitidos | 1-128 |
| Tipo de parâmetro | dynamic |
| Documentation | io_combine_limit |
io_limite_máximo_de_combinado
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | : Limite global do servidor que limita o io_combine_limit. |
| Tipo de dados | inteiro |
| Valor padrão | 16 |
| Valores permitidos | 1-128 |
| Tipo de parâmetro | dynamic |
| Documentation | io_max_combine_limit |
io_max_concurrency
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Número máximo de IOs que um processo pode executar simultaneamente. |
| Tipo de dados | inteiro |
| Valor padrão | 64 |
| Valores permitidos | -1-1024 |
| Tipo de parâmetro | estático |
| Documentation | io_max_concurrency |
método_io
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona o método para executar E/S assíncrona. |
| Tipo de dados | enumeração |
| Valor padrão | worker |
| Valores permitidos | worker,sync |
| Tipo de parâmetro | estático |
| Documentation | io_method |
io_workers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Número de processos de trabalho de E/S, para io_method=worker. |
| Tipo de dados | inteiro |
| Valor padrão | 3 |
| Valores permitidos | 1-32 |
| Tipo de parâmetro | dynamic |
| Documentation | io_workers |
logical_decoding_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para decodificação lógica. Esta quantidade de memória pode ser usada por cada buffer de reordenação interno antes de ser despejada no disco. |
| Tipo de dados | inteiro |
| Valor padrão | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parâmetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número máximo de transações preparadas simultaneamente. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | min_dynamic_shared_memory |
multixact_member_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de membro MultiXact. |
| Tipo de dados | inteiro |
| Valor padrão | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | multixact_member_buffers |
multixact_offset_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de deslocamento MultiXact. |
| Tipo de dados | inteiro |
| Valor padrão | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | multixact_offset_buffers |
notify_buffers (buffers de notificação)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de mensagens LISTEN/NOTIFY. |
| Tipo de dados | inteiro |
| Valor padrão | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | notify_buffers |
serializable_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de transações serializável. |
| Tipo de dados | inteiro |
| Valor padrão | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | serializable_buffers |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 padrão | mmap |
| Valores permitidos | mmap |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_memória_compartilhada |
subtransaction_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de subtransação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers. |
| Tipo de dados | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parâmetro | estático |
| Documentation | subtransaction_buffers |
temp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número máximo de buffers temporários usados por cada sessão. |
| Tipo de dados | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
transaction_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parâmetro | estático |
| Documentation | transaction_buffers |
vacuum_buffer_usage_limit
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffer para VACUUM, ANALYZE e autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 0-16777216 |
| Tipo de parâmetro | dynamic |
| Documentation | vacuum_buffer_usage_limit |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para espaços de trabalho de consulta. Esta quantidade de memória pode ser usada por cada operação de classificação interna e tabela de hash antes de alternar para arquivos temporários em disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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 | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
commit_timestamp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de carimbo de data/hora de confirmação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers. |
| Tipo de dados | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parâmetro | estático |
| Documentation | commit_timestamp_buffers |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
hash_mem_multiplier
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Múltiplo de "work_mem" que será usado para tabelas de hash. |
| Tipo de dados | numérico |
| Valor padrão | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parâmetro | dynamic |
| Documentation | hash_mem_multiplier |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Uso de páginas enormes no Linux ou no Windows. |
| Tipo de dados | enumeração |
| Valor padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
tamanho_de_página_grande (huge_page_size)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | O tamanho da página enorme que deve ser solicitada. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | huge_page_size |
io_combine_limit
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Limite no tamanho das leituras e gravações de dados. |
| Tipo de dados | inteiro |
| Valor padrão | 16 |
| Valores permitidos | 16 |
| Tipo de parâmetro | somente leitura |
| Documentation | io_combine_limit |
logical_decoding_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para decodificação lógica. Esta quantidade de memória pode ser usada por cada buffer de reordenação interno antes de ser despejada no disco. |
| Tipo de dados | inteiro |
| Valor padrão | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parâmetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número máximo de transações preparadas simultaneamente. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | min_dynamic_shared_memory |
multixact_member_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de membro MultiXact. |
| Tipo de dados | inteiro |
| Valor padrão | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | multixact_member_buffers |
multixact_offset_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de deslocamento MultiXact. |
| Tipo de dados | inteiro |
| Valor padrão | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | multixact_offset_buffers |
notify_buffers (buffers de notificação)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de mensagens LISTEN/NOTIFY. |
| Tipo de dados | inteiro |
| Valor padrão | 16 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | notify_buffers |
serializable_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de transações serializável. |
| Tipo de dados | inteiro |
| Valor padrão | 32 |
| Valores permitidos | 16-131072 |
| Tipo de parâmetro | estático |
| Documentation | serializable_buffers |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 padrão | mmap |
| Valores permitidos | mmap |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_memória_compartilhada |
subtransaction_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers dedicado usado para o cache de subtransação. Especifique 0 para que esse valor seja determinado como uma fração de shared_buffers. |
| Tipo de dados | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parâmetro | estático |
| Documentation | subtransaction_buffers |
temp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número máximo de buffers temporários usados por cada sessão. |
| Tipo de dados | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
transaction_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffers 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 0-131072 |
| Tipo de parâmetro | estático |
| Documentation | transaction_buffers |
vacuum_buffer_usage_limit
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffer para VACUUM, ANALYZE e autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 0-16777216 |
| Tipo de parâmetro | dynamic |
| Documentation | vacuum_buffer_usage_limit |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para espaços de trabalho de consulta. Esta quantidade de memória pode ser usada por cada operação de classificação interna e tabela de hash antes de alternar para arquivos temporários em disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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 | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
hash_mem_multiplier
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Múltiplo de work_mem a ser usado para tabelas de hash. |
| Tipo de dados | numérico |
| Valor padrão | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parâmetro | dynamic |
| Documentation | hash_mem_multiplier |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso 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 padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
tamanho_de_página_grande (huge_page_size)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | O tamanho da página enorme que deve ser solicitada. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | huge_page_size |
logical_decoding_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para decodificação lógica. |
| Tipo de dados | inteiro |
| Valor padrão | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parâmetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para operações de manutenção, como VACUUM e Create Index. |
| Tipo de dados | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso 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 este parâmetro com o mesmo valor ou um valor maior que o do servidor primário. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | min_dynamic_shared_memory |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 padrão | mmap |
| Valores permitidos | mmap |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_memória_compartilhada |
temp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
vacuum_buffer_usage_limit
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o tamanho do pool de buffer para VACUUM, ANALYZE e autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | 256 |
| Valores permitidos | 0-16777216 |
| Tipo de parâmetro | dynamic |
| Documentation | vacuum_buffer_usage_limit |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a quantidade de memória a ser usada por operações de classificação interna e tabelas de hash antes de gravar em arquivos temporários do disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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 | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
hash_mem_multiplier
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Múltiplo de work_mem a ser usado para tabelas de hash. |
| Tipo de dados | numérico |
| Valor padrão | 2 |
| Valores permitidos | 1-1000 |
| Tipo de parâmetro | dynamic |
| Documentation | hash_mem_multiplier |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso 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 padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
tamanho_de_página_grande (huge_page_size)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | O tamanho da página enorme que deve ser solicitada. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | huge_page_size |
logical_decoding_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para decodificação lógica. |
| Tipo de dados | inteiro |
| Valor padrão | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parâmetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para operações de manutenção, como VACUUM e Create Index. |
| Tipo de dados | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso 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 este parâmetro com o mesmo valor ou um valor maior que o do servidor primário. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | min_dynamic_shared_memory |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 padrão | mmap |
| Valores permitidos | mmap |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_memória_compartilhada |
temp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a quantidade de memória a ser usada por operações de classificação interna e tabelas de hash antes de gravar em arquivos temporários do disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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 | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
hash_mem_multiplier
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Múltiplo de work_mem a ser usado para tabelas de hash. |
| Tipo de dados | numérico |
| Valor padrão | 1 |
| Valores permitidos | 1-1000 |
| Tipo de parâmetro | dynamic |
| Documentation | hash_mem_multiplier |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso 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 padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
tamanho_de_página_grande (huge_page_size)
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | O tamanho da página enorme que deve ser solicitada. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | huge_page_size |
logical_decoding_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para decodificação lógica. |
| Tipo de dados | inteiro |
| Valor padrão | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parâmetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para operações de manutenção, como VACUUM e Create Index. |
| Tipo de dados | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso 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 este parâmetro com o mesmo valor ou um valor maior que o do servidor primário. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
min_dynamic_shared_memory
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0 |
| Tipo de parâmetro | somente leitura |
| Documentation | min_dynamic_shared_memory |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 padrão | mmap |
| Valores permitidos | mmap |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_memória_compartilhada |
temp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a quantidade de memória a ser usada por operações de classificação interna e tabelas de hash antes de gravar em arquivos temporários do disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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 | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
hash_mem_multiplier
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Múltiplo de work_mem a ser usado para tabelas de hash. |
| Tipo de dados | numérico |
| Valor padrão | 1 |
| Valores permitidos | 1-1000 |
| Tipo de parâmetro | dynamic |
| Documentation | hash_mem_multiplier |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso 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 padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
logical_decoding_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para decodificação lógica. |
| Tipo de dados | inteiro |
| Valor padrão | 65536 |
| Valores permitidos | 64-2147483647 |
| Tipo de parâmetro | dynamic |
| Documentation | logical_decoding_work_mem |
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para operações de manutenção, como VACUUM e Create Index. |
| Tipo de dados | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso 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 este parâmetro com o mesmo valor ou um valor maior que o do servidor primário. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 padrão | mmap |
| Valores permitidos | mmap |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_memória_compartilhada |
temp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a quantidade de memória a ser usada por operações de classificação interna e tabelas de hash antes de gravar em arquivos temporários do disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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 | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
hash_mem_multiplier
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Múltiplo de work_mem a ser usado para tabelas de hash. |
| Tipo de dados | numérico |
| Valor padrão | 1 |
| Valores permitidos | 1-1000 |
| Tipo de parâmetro | dynamic |
| Documentation | hash_mem_multiplier |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso 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 padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para operações de manutenção, como VACUUM e Create Index. |
| Tipo de dados | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso 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 este parâmetro com o mesmo valor ou um valor maior que o do servidor primário. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 padrão | mmap |
| Valores permitidos | mmap |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_memória_compartilhada |
temp_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a quantidade de memória a ser usada por operações de classificação interna e tabelas de hash antes de gravar em arquivos temporários do disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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 | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada por cada processo de trabalho de autovacuum. |
| Tipo de dados | inteiro |
| Valor padrão | -1 |
| Valores permitidos | -1-2097151 |
| Tipo de parâmetro | dynamic |
| Documentation | autovacuum_work_mem |
dynamic_shared_memory_type
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Seleciona a implementação de memória compartilhada dinâmica usada. |
| Tipo de dados | enumeração |
| Valor padrão | posix |
| Valores permitidos | posix |
| Tipo de parâmetro | somente leitura |
| Documentation | tipo_de_memória_compartilhada_dinâmica |
páginas gigantes
| Attribute | Value |
|---|---|
| Categoria | Uso 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 padrão | try |
| Valores permitidos | on,off,try |
| Tipo de parâmetro | estático |
| Documentation | páginas_grandes |
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 vez das 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 às tarefas de gerenciamento de memória, como menos perdas no buffer de tradução (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 que têm recursos de memória significativos, evite desabilitar páginas enormes. Desabilitar páginas enormes pode comprometer o desempenho.
- Se você começar com um servidor menor que não dá suporte a páginas enormes, mas antecipa escalar verticalmente para um servidor que o faça, mantenha a configuração de
huge_pagesemTRYpara uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas grandes são alocadas automaticamente do sistema operacional subjacente. O recurso não está disponível para servidores com menos de quatro vCores. O número de páginas grandes é ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers.
maintenance_work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a memória máxima a ser usada para operações de manutenção, como VACUUM e Create Index. |
| Tipo de dados | inteiro |
| Valor padrão | 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 rege 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 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 poderiam alocar memória para as tarefas descritas anteriormente, antes de fazer alterações nesse parâmetro.
Pontos-chave
-
Limite 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 interna para coletar identificadores de tuplas mortas. Ele pode usar apenas até 1 GB de memória para esse processo. -
Separação de memória para o vácuo automático: você pode usar a
autovacuum_work_memconfiguração para controlar a memória que as operações de vácuo automático usam de forma independente. Essa configuração atua como um subconjunto demaintenance_work_mem. Você pode decidir a quantidade de memória que o vácuo automático usa sem afetar a alocação de memória para outras tarefas de manutenção e operações de definição de dados.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor maintenance_work_mem é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações posteriores na seleção do produto para o cálculo que suporta o servidor flexível não terão efeito no valor padrão do parâmetro do servidor maintenance_work_mem dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deve ajustar o valor do 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 (número máximo de transações pré-preparadas)
| Attribute | Value |
|---|---|
| Categoria | Uso 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 este parâmetro com o mesmo valor ou um valor maior que o do servidor primário. |
| Tipo de dados | inteiro |
| Valor padrão | 0 |
| Valores permitidos | 0-262143 |
| Tipo de parâmetro | estático |
| Documentation | max_prepared_transactions |
max_stack_depth
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a profundidade máxima da pilha, em quilobytes. |
| Tipo de dados | inteiro |
| Valor padrão | 2048 |
| Valores permitidos | 2048 |
| Tipo de parâmetro | somente leitura |
| Documentation | max_stack_depth |
shared_buffers
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
| Tipo de dados | inteiro |
| Valor padrão | 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 shared_buffers parâmetro de configuração determina a quantidade de memória do sistema alocada ao banco de dados PostgreSQL para 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 de 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 um intermediário entre os processos de banco de dados e o disco e reduzem efetivamente o número de operações de E/S necessárias.
Observações específicas do Azure
O valor padrão para o parâmetro do servidor shared_buffers é calculado quando você provisiona a instância do servidor flexível do Banco de Dados do Azure para PostgreSQL, com base no nome do produto selecionado para sua computação. As alterações subsequentes da seleção do produto na computação que dá suporte ao servidor flexível não têm nenhum efeito sobre o valor padrão para o shared_buffers parâmetro de servidor dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá 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 shared_buffers é memoryGib * 16384.
Para máquinas virtuais com mais de 2 GiB, a fórmula usada para calcular o valor 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 | Value |
|---|---|
| Categoria | Uso 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 | inteiro |
| Valor padrão | 1024 |
| Valores permitidos | 100-1073741823 |
| Tipo de parâmetro | dynamic |
| Documentation | temp_buffers |
work_mem
| Attribute | Value |
|---|---|
| Categoria | Uso de Recursos/Memória |
| Description | Define a quantidade de memória a ser usada por operações de classificação interna e tabelas de hash antes de gravar em arquivos temporários do disco. |
| Tipo de dados | inteiro |
| Valor padrão | 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 na área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e hash.
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 em disco.
Pontos-chave
-
Memória de conexão privada:
work_memfaz parte da memória privada que cada sessão de banco de dados usa. 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. Consultas simples comoSELECT 1são improváveis de exigirwork_mem. No entanto, consultas complexas que envolvem operações como classificação ou funções de hash podem consumir um ou vários blocos dework_mem. -
Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end pode potencialmente usar uma ou várias partes de
work_mem.
Monitoramento e ajuste do work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem conforme necessário, principalmente se os tempos de execução de consulta relacionados a operações de classificação ou hash forem lentos. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
-
Análise do desempenho de consultas: verifique a guia Principais consultas por arquivos temporários para identificar consultas que estão gerando arquivos temporários. Essa situação sugere uma possível necessidade de aumentar
work_mem. - Guias de solução de problemas: use a guia Altos volumes de arquivos temporários nos guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Embora você esteja gerenciando 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 a memória de forma criteriosa com base nas necessidades específicas de processos e usuários. Ele também minimiza o risco de encontrar problemas de memória insuficiente. 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 têm uso intensivo de memória, considere personalizar o
work_memvalor para esse usuário. Use oALTER ROLEcomando para aprimorar o desempenho das operações do usuário.Nível de função/procedimento: se funções ou procedimentos específicos estiverem 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 alto 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 grandes, pode ser prudente aumentar globalmente o
work_memvalor. Essa ação facilita a maioria das consultas a serem processadas na memória, para que você possa evitar operações baseadas em disco e melhorar a eficiência. No entanto, sempre seja cauteloso e monitore a utilização de memória em seu servidor para garantir que ele possa lidar com o valor aumentadowork_mem.
Determinando o valor mínimo de work_mem para operações de classificação
Para localizar o valor mínimo work_mem de uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho temporário do arquivo gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor inicial
work_memligeiramente superior a 20 MB para considerar cabeçalhos adicionais durante o processamento na memória. Use um comando como:SET work_mem TO '25MB'. - Execute
EXPLAIN ANALYZEna consulta problemática na mesma sessão. - Revise a saída para
"Sort Method: quicksort Memory: xkB". Se ele 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á operando 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.