Uso de Recursos / Memória
autovacuum_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático. |
Tipo de dados | Número inteiro |
Valor padrão | -1 |
Valores permitidos | -1-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | autovacuum_work_mem |
dynamic_shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 | read-only |
Documentação | dynamic_shared_memory_type |
hash_mem_multiplier
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Vários work_mem a serem usados para tabelas de hash. |
Tipo de dados | numeric |
Valor padrão | 2 |
Valores permitidos | 1-1000 |
Tipo de parâmetro | dinâmico |
Documentação | hash_mem_multiplier |
huge_pages
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Habilita/desabilita o uso de páginas enormes de memória. 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 | static |
Documentação | huge_pages |
Descrição
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:
- Elas reduzem a sobrecarga associada a tarefas de gerenciamento de memória, como menos erros de TLB (buffer lookaside de tradução).
- Elas 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, que estabiliza ainda mais o desempenho.
Recomendações
- 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_pages
emTRY
para uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas enormes 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 enormes será ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers
.
huge_page_size
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | O tamanho da página enorme que deve ser solicitado. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | huge_page_size |
logical_decoding_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para decodificação lógica. |
Tipo de dados | Número inteiro |
Valor padrão | 65536 |
Valores permitidos | 65536 |
Tipo de parâmetro | read-only |
Documentação | logical_decoding_work_mem |
maintenance_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Criar Índice. |
Tipo de dados | Número 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 | dinâmico |
Documentação | maintenance_work_mem |
Descrição
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 INDEX
e 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.
Pontos-chave
- Limite de memória a vácuo: se você quer acelerar a limpeza de tuplas inativas com o aumento de
maintenance_work_mem
, lembre-se de que oVACUUM
tem uma limitação interna para coletar identificadores de tupla inativas. Ele pode usar apenas até 1 GB de memória para esse processo. - Separação de memória para vácuo automático: você pode usar a configuração
autovacuum_work_mem
para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_work_mem
. Você pode decidir a quantidade de memória usada pelo vácuo automático 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 parâmetro maintenance_work_mem
de acordo com os valores na fórmula a seguir.
A fórmula usada para calcular o valor 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 que este parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:
Tamanho da memória | maintenance_work_mem |
---|---|
2 GiB | 99328 KiB |
4 GiB | 157696 KiB |
8 GiB | 216064 KiB |
16 GiB | 274432 KiB |
32 GiB | 332800 KiB |
48 GiB | 367616 KiB |
64 GiB | 392192 KiB |
80 GiB | 410624 KiB |
128 GiB | 450560 KiB |
160 GiB | 468992 KiB |
192 GiB | 484352 KiB |
256 GiB | 508928 KiB |
384 GiB | 542720 KiB |
432 GiB | 552960 KiB |
672 GiB | 590848 KiB |
max_prepared_transactions
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você precisa definir esse parâmetro com o mesmo valor ou um valor maior do que no servidor mestre. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0-262143 |
Tipo de parâmetro | static |
Documentação | max_prepared_transactions |
max_stack_depth
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a profundidade máxima da pilha, em quilobytes. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 2048 |
Tipo de parâmetro | read-only |
Documentação | max_stack_depth |
min_dynamic_shared_memory
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | min_dynamic_shared_memory |
shared_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
Tipo de dados | Número 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 | static |
Documentação | shared_buffers |
Descrição
O parâmetro de configuração shared_buffers
determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenar dados em buffer. 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 ignora 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 parâmetro de servidor shared_buffers
dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá ajustar o valor do parâmetro shared_buffers
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 que este 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 |
shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Seleciona a implementação de memória compartilhada usada para a região de memória compartilhada principal. |
Tipo de dados | enumeração |
Valor padrão | mmap |
Valores permitidos | mmap |
Tipo de parâmetro | read-only |
Documentação | shared_memory_type |
temp_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de buffers temporários usados por cada sessão do banco de dados. |
Tipo de dados | Número inteiro |
Valor padrão | 1024 |
Valores permitidos | 100-1073741823 |
Tipo de parâmetro | dinâmico |
Documentação | temp_buffers |
vacuum_buffer_usage_limit
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o tamanho do pool de buffers para VACUUM, ANALYZE e autovacuum. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 0-16777216 |
Tipo de parâmetro | dinâmico |
Documentação | vacuum_buffer_usage_limit |
work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 de disco temporários. |
Tipo de dados | Número inteiro |
Valor padrão | 4096 |
Valores permitidos | 4096-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | work_mem |
Descrição
O parâmetro work_mem
no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e 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 de work_mem
adequado, 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_mem
faz 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_buffers
usa. - Uso específico de consulta: nem todas as sessões ou consultas usam
work_mem
. É improvável que consultas simples comoSELECT 1
exijamwork_mem
. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dework_mem
. - Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end poderia potencialmente utilizar uma ou várias partes de
work_mem
.
Monitorando e ajustando work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem
conforme necessário, principalmente se ocorrerem tempos lentos de execução de consulta relacionados a operações de classificação ou hash. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
- Insights de desempenho de consulta: verifique a guia Consultas principais 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: utilize a guia Arquivos temporários elevados nas guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Ao gerenciar o parâmetro work_mem
, 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. Ela também minimiza o risco de encontrar problemas de memória insuficiente. Veja como 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 intenso de memória, considere personalizar o valor
work_mem
para esse usuário. Use o comandoALTER ROLE
para melhorar o desempenho das operações do usuário.Nível de função/procedimento: nos casos em que funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o valor
work_mem
no nível específico da função ou do procedimento pode ser benéfico. Use o comandoALTER FUNCTION
ouALTER PROCEDURE
para alocar especificamente mais memória a essas operações.Nível de Banco de Dados: altere
work_mem
no nível do banco de dados se apenas bancos de dados específicos estiverem gerando grandes quantidades de arquivos temporários.Nível global: se uma análise do sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas algumas estão criando arquivos grandes, pode ser prudente aumentar globalmente o valor
work_mem
. 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 aumento do valorwork_mem
.
Determinação do valor mínimo work_mem para operações de classificação
Para localizar o valor mínimo work_mem
para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor
work_mem
inicial ligeiramente superior a 20 MB para considerar cabeçalhos adicionais ao processar na memória. Use um comando como:SET work_mem TO '25MB'
. - Execute
EXPLAIN ANALYZE
na consulta problemática na mesma sessão. - Revise a saída de
"Sort Method: quicksort Memory: xkB"
. Se indicar"external merge Disk: xkB"
, aumente o valor dowork_mem
de forma incremental e teste novamente até que"quicksort Memory"
apareça. A aparência de"quicksort Memory"
sinaliza 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
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático. |
Tipo de dados | Número inteiro |
Valor padrão | -1 |
Valores permitidos | -1-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | autovacuum_work_mem |
dynamic_shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 | read-only |
Documentação | dynamic_shared_memory_type |
hash_mem_multiplier
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Vários work_mem a serem usados para tabelas de hash. |
Tipo de dados | numeric |
Valor padrão | 2 |
Valores permitidos | 1-1000 |
Tipo de parâmetro | dinâmico |
Documentação | hash_mem_multiplier |
huge_pages
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Habilita/desabilita o uso de páginas enormes de memória. 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 | static |
Documentação | huge_pages |
Descrição
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:
- Elas reduzem a sobrecarga associada a tarefas de gerenciamento de memória, como menos erros de TLB (buffer lookaside de tradução).
- Elas 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, que estabiliza ainda mais o desempenho.
Recomendações
- 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_pages
emTRY
para uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas enormes 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 enormes será ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers
.
huge_page_size
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | O tamanho da página enorme que deve ser solicitado. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | huge_page_size |
logical_decoding_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para decodificação lógica. |
Tipo de dados | Número inteiro |
Valor padrão | 65536 |
Valores permitidos | 64-2147483647 |
Tipo de parâmetro | dinâmico |
Documentação | logical_decoding_work_mem |
maintenance_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Criar Índice. |
Tipo de dados | Número 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 | dinâmico |
Documentação | maintenance_work_mem |
Descrição
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 INDEX
e 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.
Pontos-chave
- Limite de memória a vácuo: se você quer acelerar a limpeza de tuplas inativas com o aumento de
maintenance_work_mem
, lembre-se de que oVACUUM
tem uma limitação interna para coletar identificadores de tupla inativas. Ele pode usar apenas até 1 GB de memória para esse processo. - Separação de memória para vácuo automático: você pode usar a configuração
autovacuum_work_mem
para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_work_mem
. Você pode decidir a quantidade de memória usada pelo vácuo automático 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 parâmetro maintenance_work_mem
de acordo com os valores na fórmula a seguir.
A fórmula usada para calcular o valor 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 que este parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:
Tamanho da memória | maintenance_work_mem |
---|---|
2 GiB | 99328 KiB |
4 GiB | 157696 KiB |
8 GiB | 216064 KiB |
16 GiB | 274432 KiB |
32 GiB | 332800 KiB |
48 GiB | 367616 KiB |
64 GiB | 392192 KiB |
80 GiB | 410624 KiB |
128 GiB | 450560 KiB |
160 GiB | 468992 KiB |
192 GiB | 484352 KiB |
256 GiB | 508928 KiB |
384 GiB | 542720 KiB |
432 GiB | 552960 KiB |
672 GiB | 590848 KiB |
max_prepared_transactions
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você precisa definir esse parâmetro com o mesmo valor ou um valor maior do que no servidor mestre. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0-262143 |
Tipo de parâmetro | static |
Documentação | max_prepared_transactions |
max_stack_depth
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a profundidade máxima da pilha, em quilobytes. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 2048 |
Tipo de parâmetro | read-only |
Documentação | max_stack_depth |
min_dynamic_shared_memory
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | min_dynamic_shared_memory |
shared_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
Tipo de dados | Número 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 | static |
Documentação | shared_buffers |
Descrição
O parâmetro de configuração shared_buffers
determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenar dados em buffer. 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 ignora 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 parâmetro de servidor shared_buffers
dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá ajustar o valor do parâmetro shared_buffers
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 que este 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 |
shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Seleciona a implementação de memória compartilhada usada para a região de memória compartilhada principal. |
Tipo de dados | enumeração |
Valor padrão | mmap |
Valores permitidos | mmap |
Tipo de parâmetro | read-only |
Documentação | shared_memory_type |
temp_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de buffers temporários usados por cada sessão do banco de dados. |
Tipo de dados | Número inteiro |
Valor padrão | 1024 |
Valores permitidos | 100-1073741823 |
Tipo de parâmetro | dinâmico |
Documentação | temp_buffers |
vacuum_buffer_usage_limit
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o tamanho do pool de buffers para VACUUM, ANALYZE e autovacuum. |
Tipo de dados | Número inteiro |
Valor padrão | 256 |
Valores permitidos | 0-16777216 |
Tipo de parâmetro | dinâmico |
Documentação | vacuum_buffer_usage_limit |
work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 de disco temporários. |
Tipo de dados | Número inteiro |
Valor padrão | 4096 |
Valores permitidos | 4096-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | work_mem |
Descrição
O parâmetro work_mem
no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e 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 de work_mem
adequado, 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_mem
faz 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_buffers
usa. - Uso específico de consulta: nem todas as sessões ou consultas usam
work_mem
. É improvável que consultas simples comoSELECT 1
exijamwork_mem
. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dework_mem
. - Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end poderia potencialmente utilizar uma ou várias partes de
work_mem
.
Monitorando e ajustando work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem
conforme necessário, principalmente se ocorrerem tempos lentos de execução de consulta relacionados a operações de classificação ou hash. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
- Insights de desempenho de consulta: verifique a guia Consultas principais 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: utilize a guia Arquivos temporários elevados nas guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Ao gerenciar o parâmetro work_mem
, 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. Ela também minimiza o risco de encontrar problemas de memória insuficiente. Veja como 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 intenso de memória, considere personalizar o valor
work_mem
para esse usuário. Use o comandoALTER ROLE
para melhorar o desempenho das operações do usuário.Nível de função/procedimento: nos casos em que funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o valor
work_mem
no nível específico da função ou do procedimento pode ser benéfico. Use o comandoALTER FUNCTION
ouALTER PROCEDURE
para alocar especificamente mais memória a essas operações.Nível de Banco de Dados: altere
work_mem
no nível do banco de dados se apenas bancos de dados específicos estiverem gerando grandes quantidades de arquivos temporários.Nível global: se uma análise do sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas algumas estão criando arquivos grandes, pode ser prudente aumentar globalmente o valor
work_mem
. 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 aumento do valorwork_mem
.
Determinação do valor mínimo work_mem para operações de classificação
Para localizar o valor mínimo work_mem
para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor
work_mem
inicial ligeiramente superior a 20 MB para considerar cabeçalhos adicionais ao processar na memória. Use um comando como:SET work_mem TO '25MB'
. - Execute
EXPLAIN ANALYZE
na consulta problemática na mesma sessão. - Revise a saída de
"Sort Method: quicksort Memory: xkB"
. Se indicar"external merge Disk: xkB"
, aumente o valor dowork_mem
de forma incremental e teste novamente até que"quicksort Memory"
apareça. A aparência de"quicksort Memory"
sinaliza 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
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático. |
Tipo de dados | Número inteiro |
Valor padrão | -1 |
Valores permitidos | -1-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | autovacuum_work_mem |
dynamic_shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 | read-only |
Documentação | dynamic_shared_memory_type |
hash_mem_multiplier
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Vários work_mem a serem usados para tabelas de hash. |
Tipo de dados | numeric |
Valor padrão | 2 |
Valores permitidos | 1-1000 |
Tipo de parâmetro | dinâmico |
Documentação | hash_mem_multiplier |
huge_pages
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Habilita/desabilita o uso de páginas enormes de memória. 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 | static |
Documentação | huge_pages |
Descrição
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:
- Elas reduzem a sobrecarga associada a tarefas de gerenciamento de memória, como menos erros de TLB (buffer lookaside de tradução).
- Elas 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, que estabiliza ainda mais o desempenho.
Recomendações
- 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_pages
emTRY
para uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas enormes 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 enormes será ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers
.
huge_page_size
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | O tamanho da página enorme que deve ser solicitado. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | huge_page_size |
logical_decoding_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para decodificação lógica. |
Tipo de dados | Número inteiro |
Valor padrão | 65536 |
Valores permitidos | 64-2147483647 |
Tipo de parâmetro | dinâmico |
Documentação | logical_decoding_work_mem |
maintenance_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Criar Índice. |
Tipo de dados | Número 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 | dinâmico |
Documentação | maintenance_work_mem |
Descrição
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 INDEX
e 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.
Pontos-chave
- Limite de memória a vácuo: se você quer acelerar a limpeza de tuplas inativas com o aumento de
maintenance_work_mem
, lembre-se de que oVACUUM
tem uma limitação interna para coletar identificadores de tupla inativas. Ele pode usar apenas até 1 GB de memória para esse processo. - Separação de memória para vácuo automático: você pode usar a configuração
autovacuum_work_mem
para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_work_mem
. Você pode decidir a quantidade de memória usada pelo vácuo automático 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 parâmetro maintenance_work_mem
de acordo com os valores na fórmula a seguir.
A fórmula usada para calcular o valor 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 que este parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:
Tamanho da memória | maintenance_work_mem |
---|---|
2 GiB | 99328 KiB |
4 GiB | 157696 KiB |
8 GiB | 216064 KiB |
16 GiB | 274432 KiB |
32 GiB | 332800 KiB |
48 GiB | 367616 KiB |
64 GiB | 392192 KiB |
80 GiB | 410624 KiB |
128 GiB | 450560 KiB |
160 GiB | 468992 KiB |
192 GiB | 484352 KiB |
256 GiB | 508928 KiB |
384 GiB | 542720 KiB |
432 GiB | 552960 KiB |
672 GiB | 590848 KiB |
max_prepared_transactions
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você precisa definir esse parâmetro com o mesmo valor ou um valor maior do que no servidor mestre. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0-262143 |
Tipo de parâmetro | static |
Documentação | max_prepared_transactions |
max_stack_depth
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a profundidade máxima da pilha, em quilobytes. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 2048 |
Tipo de parâmetro | read-only |
Documentação | max_stack_depth |
min_dynamic_shared_memory
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | min_dynamic_shared_memory |
shared_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
Tipo de dados | Número 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 | static |
Documentação | shared_buffers |
Descrição
O parâmetro de configuração shared_buffers
determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenar dados em buffer. 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 ignora 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 parâmetro de servidor shared_buffers
dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá ajustar o valor do parâmetro shared_buffers
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 que este 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 |
shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Seleciona a implementação de memória compartilhada usada para a região de memória compartilhada principal. |
Tipo de dados | enumeração |
Valor padrão | mmap |
Valores permitidos | mmap |
Tipo de parâmetro | read-only |
Documentação | shared_memory_type |
temp_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de buffers temporários usados por cada sessão do banco de dados. |
Tipo de dados | Número inteiro |
Valor padrão | 1024 |
Valores permitidos | 100-1073741823 |
Tipo de parâmetro | dinâmico |
Documentação | temp_buffers |
work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 de disco temporários. |
Tipo de dados | Número inteiro |
Valor padrão | 4096 |
Valores permitidos | 4096-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | work_mem |
Descrição
O parâmetro work_mem
no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e 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 de work_mem
adequado, 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_mem
faz 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_buffers
usa. - Uso específico de consulta: nem todas as sessões ou consultas usam
work_mem
. É improvável que consultas simples comoSELECT 1
exijamwork_mem
. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dework_mem
. - Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end poderia potencialmente utilizar uma ou várias partes de
work_mem
.
Monitorando e ajustando work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem
conforme necessário, principalmente se ocorrerem tempos lentos de execução de consulta relacionados a operações de classificação ou hash. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
- Insights de desempenho de consulta: verifique a guia Consultas principais 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: utilize a guia Arquivos temporários elevados nas guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Ao gerenciar o parâmetro work_mem
, 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. Ela também minimiza o risco de encontrar problemas de memória insuficiente. Veja como 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 intenso de memória, considere personalizar o valor
work_mem
para esse usuário. Use o comandoALTER ROLE
para melhorar o desempenho das operações do usuário.Nível de função/procedimento: nos casos em que funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o valor
work_mem
no nível específico da função ou do procedimento pode ser benéfico. Use o comandoALTER FUNCTION
ouALTER PROCEDURE
para alocar especificamente mais memória a essas operações.Nível de Banco de Dados: altere
work_mem
no nível do banco de dados se apenas bancos de dados específicos estiverem gerando grandes quantidades de arquivos temporários.Nível global: se uma análise do sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas algumas estão criando arquivos grandes, pode ser prudente aumentar globalmente o valor
work_mem
. 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 aumento do valorwork_mem
.
Determinação do valor mínimo work_mem para operações de classificação
Para localizar o valor mínimo work_mem
para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor
work_mem
inicial ligeiramente superior a 20 MB para considerar cabeçalhos adicionais ao processar na memória. Use um comando como:SET work_mem TO '25MB'
. - Execute
EXPLAIN ANALYZE
na consulta problemática na mesma sessão. - Revise a saída de
"Sort Method: quicksort Memory: xkB"
. Se indicar"external merge Disk: xkB"
, aumente o valor dowork_mem
de forma incremental e teste novamente até que"quicksort Memory"
apareça. A aparência de"quicksort Memory"
sinaliza 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
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático. |
Tipo de dados | Número inteiro |
Valor padrão | -1 |
Valores permitidos | -1-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | autovacuum_work_mem |
dynamic_shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 | read-only |
Documentação | dynamic_shared_memory_type |
hash_mem_multiplier
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Vários work_mem a serem usados para tabelas de hash. |
Tipo de dados | numeric |
Valor padrão | 1 |
Valores permitidos | 1-1000 |
Tipo de parâmetro | dinâmico |
Documentação | hash_mem_multiplier |
huge_pages
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Habilita/desabilita o uso de páginas enormes de memória. 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 | static |
Documentação | huge_pages |
Descrição
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:
- Elas reduzem a sobrecarga associada a tarefas de gerenciamento de memória, como menos erros de TLB (buffer lookaside de tradução).
- Elas 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, que estabiliza ainda mais o desempenho.
Recomendações
- 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_pages
emTRY
para uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas enormes 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 enormes será ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers
.
huge_page_size
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | O tamanho da página enorme que deve ser solicitado. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | huge_page_size |
logical_decoding_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para decodificação lógica. |
Tipo de dados | Número inteiro |
Valor padrão | 65536 |
Valores permitidos | 64-2147483647 |
Tipo de parâmetro | dinâmico |
Documentação | logical_decoding_work_mem |
maintenance_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Criar Índice. |
Tipo de dados | Número 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 | dinâmico |
Documentação | maintenance_work_mem |
Descrição
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 INDEX
e 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.
Pontos-chave
- Limite de memória a vácuo: se você quer acelerar a limpeza de tuplas inativas com o aumento de
maintenance_work_mem
, lembre-se de que oVACUUM
tem uma limitação interna para coletar identificadores de tupla inativas. Ele pode usar apenas até 1 GB de memória para esse processo. - Separação de memória para vácuo automático: você pode usar a configuração
autovacuum_work_mem
para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_work_mem
. Você pode decidir a quantidade de memória usada pelo vácuo automático 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 parâmetro maintenance_work_mem
de acordo com os valores na fórmula a seguir.
A fórmula usada para calcular o valor 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 que este parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:
Tamanho da memória | maintenance_work_mem |
---|---|
2 GiB | 99328 KiB |
4 GiB | 157696 KiB |
8 GiB | 216064 KiB |
16 GiB | 274432 KiB |
32 GiB | 332800 KiB |
48 GiB | 367616 KiB |
64 GiB | 392192 KiB |
80 GiB | 410624 KiB |
128 GiB | 450560 KiB |
160 GiB | 468992 KiB |
192 GiB | 484352 KiB |
256 GiB | 508928 KiB |
384 GiB | 542720 KiB |
432 GiB | 552960 KiB |
672 GiB | 590848 KiB |
max_prepared_transactions
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você precisa definir esse parâmetro com o mesmo valor ou um valor maior do que no servidor mestre. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0-262143 |
Tipo de parâmetro | static |
Documentação | max_prepared_transactions |
max_stack_depth
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a profundidade máxima da pilha, em quilobytes. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 2048 |
Tipo de parâmetro | read-only |
Documentação | max_stack_depth |
min_dynamic_shared_memory
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Quantidade de memória compartilhada dinâmica reservada na inicialização. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0 |
Tipo de parâmetro | read-only |
Documentação | min_dynamic_shared_memory |
shared_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
Tipo de dados | Número 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 | static |
Documentação | shared_buffers |
Descrição
O parâmetro de configuração shared_buffers
determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenar dados em buffer. 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 ignora 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 parâmetro de servidor shared_buffers
dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá ajustar o valor do parâmetro shared_buffers
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 que este 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 |
shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Seleciona a implementação de memória compartilhada usada para a região de memória compartilhada principal. |
Tipo de dados | enumeração |
Valor padrão | mmap |
Valores permitidos | mmap |
Tipo de parâmetro | read-only |
Documentação | shared_memory_type |
temp_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de buffers temporários usados por cada sessão do banco de dados. |
Tipo de dados | Número inteiro |
Valor padrão | 1024 |
Valores permitidos | 100-1073741823 |
Tipo de parâmetro | dinâmico |
Documentação | temp_buffers |
work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 de disco temporários. |
Tipo de dados | Número inteiro |
Valor padrão | 4096 |
Valores permitidos | 4096-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | work_mem |
Descrição
O parâmetro work_mem
no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e 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 de work_mem
adequado, 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_mem
faz 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_buffers
usa. - Uso específico de consulta: nem todas as sessões ou consultas usam
work_mem
. É improvável que consultas simples comoSELECT 1
exijamwork_mem
. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dework_mem
. - Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end poderia potencialmente utilizar uma ou várias partes de
work_mem
.
Monitorando e ajustando work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem
conforme necessário, principalmente se ocorrerem tempos lentos de execução de consulta relacionados a operações de classificação ou hash. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
- Insights de desempenho de consulta: verifique a guia Consultas principais 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: utilize a guia Arquivos temporários elevados nas guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Ao gerenciar o parâmetro work_mem
, 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. Ela também minimiza o risco de encontrar problemas de memória insuficiente. Veja como 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 intenso de memória, considere personalizar o valor
work_mem
para esse usuário. Use o comandoALTER ROLE
para melhorar o desempenho das operações do usuário.Nível de função/procedimento: nos casos em que funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o valor
work_mem
no nível específico da função ou do procedimento pode ser benéfico. Use o comandoALTER FUNCTION
ouALTER PROCEDURE
para alocar especificamente mais memória a essas operações.Nível de Banco de Dados: altere
work_mem
no nível do banco de dados se apenas bancos de dados específicos estiverem gerando grandes quantidades de arquivos temporários.Nível global: se uma análise do sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas algumas estão criando arquivos grandes, pode ser prudente aumentar globalmente o valor
work_mem
. 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 aumento do valorwork_mem
.
Determinação do valor mínimo work_mem para operações de classificação
Para localizar o valor mínimo work_mem
para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor
work_mem
inicial ligeiramente superior a 20 MB para considerar cabeçalhos adicionais ao processar na memória. Use um comando como:SET work_mem TO '25MB'
. - Execute
EXPLAIN ANALYZE
na consulta problemática na mesma sessão. - Revise a saída de
"Sort Method: quicksort Memory: xkB"
. Se indicar"external merge Disk: xkB"
, aumente o valor dowork_mem
de forma incremental e teste novamente até que"quicksort Memory"
apareça. A aparência de"quicksort Memory"
sinaliza 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
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático. |
Tipo de dados | Número inteiro |
Valor padrão | -1 |
Valores permitidos | -1-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | autovacuum_work_mem |
dynamic_shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 | read-only |
Documentação | dynamic_shared_memory_type |
hash_mem_multiplier
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Vários work_mem a serem usados para tabelas de hash. |
Tipo de dados | numeric |
Valor padrão | 1 |
Valores permitidos | 1-1000 |
Tipo de parâmetro | dinâmico |
Documentação | hash_mem_multiplier |
huge_pages
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Habilita/desabilita o uso de páginas enormes de memória. 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 | static |
Documentação | huge_pages |
Descrição
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:
- Elas reduzem a sobrecarga associada a tarefas de gerenciamento de memória, como menos erros de TLB (buffer lookaside de tradução).
- Elas 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, que estabiliza ainda mais o desempenho.
Recomendações
- 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_pages
emTRY
para uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas enormes 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 enormes será ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers
.
logical_decoding_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para decodificação lógica. |
Tipo de dados | Número inteiro |
Valor padrão | 65536 |
Valores permitidos | 64-2147483647 |
Tipo de parâmetro | dinâmico |
Documentação | logical_decoding_work_mem |
maintenance_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Criar Índice. |
Tipo de dados | Número 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 | dinâmico |
Documentação | maintenance_work_mem |
Descrição
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 INDEX
e 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.
Pontos-chave
- Limite de memória a vácuo: se você quer acelerar a limpeza de tuplas inativas com o aumento de
maintenance_work_mem
, lembre-se de que oVACUUM
tem uma limitação interna para coletar identificadores de tupla inativas. Ele pode usar apenas até 1 GB de memória para esse processo. - Separação de memória para vácuo automático: você pode usar a configuração
autovacuum_work_mem
para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_work_mem
. Você pode decidir a quantidade de memória usada pelo vácuo automático 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 parâmetro maintenance_work_mem
de acordo com os valores na fórmula a seguir.
A fórmula usada para calcular o valor 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 que este parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:
Tamanho da memória | maintenance_work_mem |
---|---|
2 GiB | 99328 KiB |
4 GiB | 157696 KiB |
8 GiB | 216064 KiB |
16 GiB | 274432 KiB |
32 GiB | 332800 KiB |
48 GiB | 367616 KiB |
64 GiB | 392192 KiB |
80 GiB | 410624 KiB |
128 GiB | 450560 KiB |
160 GiB | 468992 KiB |
192 GiB | 484352 KiB |
256 GiB | 508928 KiB |
384 GiB | 542720 KiB |
432 GiB | 552960 KiB |
672 GiB | 590848 KiB |
max_prepared_transactions
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você precisa definir esse parâmetro com o mesmo valor ou um valor maior do que no servidor mestre. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0-262143 |
Tipo de parâmetro | static |
Documentação | max_prepared_transactions |
max_stack_depth
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a profundidade máxima da pilha, em quilobytes. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 2048 |
Tipo de parâmetro | read-only |
Documentação | max_stack_depth |
shared_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
Tipo de dados | Número 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 | static |
Documentação | shared_buffers |
Descrição
O parâmetro de configuração shared_buffers
determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenar dados em buffer. 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 ignora 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 parâmetro de servidor shared_buffers
dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá ajustar o valor do parâmetro shared_buffers
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 que este 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 |
shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Seleciona a implementação de memória compartilhada usada para a região de memória compartilhada principal. |
Tipo de dados | enumeração |
Valor padrão | mmap |
Valores permitidos | mmap |
Tipo de parâmetro | read-only |
Documentação | shared_memory_type |
temp_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de buffers temporários usados por cada sessão do banco de dados. |
Tipo de dados | Número inteiro |
Valor padrão | 1024 |
Valores permitidos | 100-1073741823 |
Tipo de parâmetro | dinâmico |
Documentação | temp_buffers |
work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 de disco temporários. |
Tipo de dados | Número inteiro |
Valor padrão | 4096 |
Valores permitidos | 4096-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | work_mem |
Descrição
O parâmetro work_mem
no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e 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 de work_mem
adequado, 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_mem
faz 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_buffers
usa. - Uso específico de consulta: nem todas as sessões ou consultas usam
work_mem
. É improvável que consultas simples comoSELECT 1
exijamwork_mem
. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dework_mem
. - Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end poderia potencialmente utilizar uma ou várias partes de
work_mem
.
Monitorando e ajustando work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem
conforme necessário, principalmente se ocorrerem tempos lentos de execução de consulta relacionados a operações de classificação ou hash. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
- Insights de desempenho de consulta: verifique a guia Consultas principais 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: utilize a guia Arquivos temporários elevados nas guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Ao gerenciar o parâmetro work_mem
, 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. Ela também minimiza o risco de encontrar problemas de memória insuficiente. Veja como 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 intenso de memória, considere personalizar o valor
work_mem
para esse usuário. Use o comandoALTER ROLE
para melhorar o desempenho das operações do usuário.Nível de função/procedimento: nos casos em que funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o valor
work_mem
no nível específico da função ou do procedimento pode ser benéfico. Use o comandoALTER FUNCTION
ouALTER PROCEDURE
para alocar especificamente mais memória a essas operações.Nível de Banco de Dados: altere
work_mem
no nível do banco de dados se apenas bancos de dados específicos estiverem gerando grandes quantidades de arquivos temporários.Nível global: se uma análise do sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas algumas estão criando arquivos grandes, pode ser prudente aumentar globalmente o valor
work_mem
. 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 aumento do valorwork_mem
.
Determinação do valor mínimo work_mem para operações de classificação
Para localizar o valor mínimo work_mem
para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor
work_mem
inicial ligeiramente superior a 20 MB para considerar cabeçalhos adicionais ao processar na memória. Use um comando como:SET work_mem TO '25MB'
. - Execute
EXPLAIN ANALYZE
na consulta problemática na mesma sessão. - Revise a saída de
"Sort Method: quicksort Memory: xkB"
. Se indicar"external merge Disk: xkB"
, aumente o valor dowork_mem
de forma incremental e teste novamente até que"quicksort Memory"
apareça. A aparência de"quicksort Memory"
sinaliza 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
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático. |
Tipo de dados | Número inteiro |
Valor padrão | -1 |
Valores permitidos | -1-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | autovacuum_work_mem |
dynamic_shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 | read-only |
Documentação | dynamic_shared_memory_type |
hash_mem_multiplier
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Vários work_mem a serem usados para tabelas de hash. |
Tipo de dados | numeric |
Valor padrão | 1 |
Valores permitidos | 1-1000 |
Tipo de parâmetro | dinâmico |
Documentação | hash_mem_multiplier |
huge_pages
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Habilita/desabilita o uso de páginas enormes de memória. 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 | static |
Documentação | huge_pages |
Descrição
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:
- Elas reduzem a sobrecarga associada a tarefas de gerenciamento de memória, como menos erros de TLB (buffer lookaside de tradução).
- Elas 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, que estabiliza ainda mais o desempenho.
Recomendações
- 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_pages
emTRY
para uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas enormes 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 enormes será ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers
.
maintenance_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Criar Índice. |
Tipo de dados | Número 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 | dinâmico |
Documentação | maintenance_work_mem |
Descrição
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 INDEX
e 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.
Pontos-chave
- Limite de memória a vácuo: se você quer acelerar a limpeza de tuplas inativas com o aumento de
maintenance_work_mem
, lembre-se de que oVACUUM
tem uma limitação interna para coletar identificadores de tupla inativas. Ele pode usar apenas até 1 GB de memória para esse processo. - Separação de memória para vácuo automático: você pode usar a configuração
autovacuum_work_mem
para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_work_mem
. Você pode decidir a quantidade de memória usada pelo vácuo automático 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 parâmetro maintenance_work_mem
de acordo com os valores na fórmula a seguir.
A fórmula usada para calcular o valor 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 que este parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:
Tamanho da memória | maintenance_work_mem |
---|---|
2 GiB | 99328 KiB |
4 GiB | 157696 KiB |
8 GiB | 216064 KiB |
16 GiB | 274432 KiB |
32 GiB | 332800 KiB |
48 GiB | 367616 KiB |
64 GiB | 392192 KiB |
80 GiB | 410624 KiB |
128 GiB | 450560 KiB |
160 GiB | 468992 KiB |
192 GiB | 484352 KiB |
256 GiB | 508928 KiB |
384 GiB | 542720 KiB |
432 GiB | 552960 KiB |
672 GiB | 590848 KiB |
max_prepared_transactions
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você precisa definir esse parâmetro com o mesmo valor ou um valor maior do que no servidor mestre. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0-262143 |
Tipo de parâmetro | static |
Documentação | max_prepared_transactions |
max_stack_depth
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a profundidade máxima da pilha, em quilobytes. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 2048 |
Tipo de parâmetro | read-only |
Documentação | max_stack_depth |
shared_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
Tipo de dados | Número 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 | static |
Documentação | shared_buffers |
Descrição
O parâmetro de configuração shared_buffers
determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenar dados em buffer. 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 ignora 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 parâmetro de servidor shared_buffers
dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá ajustar o valor do parâmetro shared_buffers
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 que este 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 |
shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Seleciona a implementação de memória compartilhada usada para a região de memória compartilhada principal. |
Tipo de dados | enumeração |
Valor padrão | mmap |
Valores permitidos | mmap |
Tipo de parâmetro | read-only |
Documentação | shared_memory_type |
temp_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de buffers temporários usados por cada sessão do banco de dados. |
Tipo de dados | Número inteiro |
Valor padrão | 1024 |
Valores permitidos | 100-1073741823 |
Tipo de parâmetro | dinâmico |
Documentação | temp_buffers |
work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 de disco temporários. |
Tipo de dados | Número inteiro |
Valor padrão | 4096 |
Valores permitidos | 4096-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | work_mem |
Descrição
O parâmetro work_mem
no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e 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 de work_mem
adequado, 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_mem
faz 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_buffers
usa. - Uso específico de consulta: nem todas as sessões ou consultas usam
work_mem
. É improvável que consultas simples comoSELECT 1
exijamwork_mem
. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dework_mem
. - Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end poderia potencialmente utilizar uma ou várias partes de
work_mem
.
Monitorando e ajustando work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem
conforme necessário, principalmente se ocorrerem tempos lentos de execução de consulta relacionados a operações de classificação ou hash. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
- Insights de desempenho de consulta: verifique a guia Consultas principais 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: utilize a guia Arquivos temporários elevados nas guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Ao gerenciar o parâmetro work_mem
, 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. Ela também minimiza o risco de encontrar problemas de memória insuficiente. Veja como 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 intenso de memória, considere personalizar o valor
work_mem
para esse usuário. Use o comandoALTER ROLE
para melhorar o desempenho das operações do usuário.Nível de função/procedimento: nos casos em que funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o valor
work_mem
no nível específico da função ou do procedimento pode ser benéfico. Use o comandoALTER FUNCTION
ouALTER PROCEDURE
para alocar especificamente mais memória a essas operações.Nível de Banco de Dados: altere
work_mem
no nível do banco de dados se apenas bancos de dados específicos estiverem gerando grandes quantidades de arquivos temporários.Nível global: se uma análise do sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas algumas estão criando arquivos grandes, pode ser prudente aumentar globalmente o valor
work_mem
. 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 aumento do valorwork_mem
.
Determinação do valor mínimo work_mem para operações de classificação
Para localizar o valor mínimo work_mem
para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor
work_mem
inicial ligeiramente superior a 20 MB para considerar cabeçalhos adicionais ao processar na memória. Use um comando como:SET work_mem TO '25MB'
. - Execute
EXPLAIN ANALYZE
na consulta problemática na mesma sessão. - Revise a saída de
"Sort Method: quicksort Memory: xkB"
. Se indicar"external merge Disk: xkB"
, aumente o valor dowork_mem
de forma incremental e teste novamente até que"quicksort Memory"
apareça. A aparência de"quicksort Memory"
sinaliza 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
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada por cada processo de trabalho de vácuo automático. |
Tipo de dados | Número inteiro |
Valor padrão | -1 |
Valores permitidos | -1-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | autovacuum_work_mem |
dynamic_shared_memory_type
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 | read-only |
Documentação | dynamic_shared_memory_type |
huge_pages
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Habilita/desabilita o uso de páginas enormes de memória. 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 | static |
Documentação | huge_pages |
Descrição
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:
- Elas reduzem a sobrecarga associada a tarefas de gerenciamento de memória, como menos erros de TLB (buffer lookaside de tradução).
- Elas 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, que estabiliza ainda mais o desempenho.
Recomendações
- 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_pages
emTRY
para uma transição perfeita e desempenho ideal.
Observações específicas do Azure
Para servidores com quatro ou mais vCores, páginas enormes 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 enormes será ajustado automaticamente se alguma configuração de memória compartilhada for alterada, incluindo alterações em shared_buffers
.
maintenance_work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a memória máxima a ser usada para operações de manutenção, como VACUUM, Criar Índice. |
Tipo de dados | Número 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 | dinâmico |
Documentação | maintenance_work_mem |
Descrição
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 INDEX
e 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.
Pontos-chave
- Limite de memória a vácuo: se você quer acelerar a limpeza de tuplas inativas com o aumento de
maintenance_work_mem
, lembre-se de que oVACUUM
tem uma limitação interna para coletar identificadores de tupla inativas. Ele pode usar apenas até 1 GB de memória para esse processo. - Separação de memória para vácuo automático: você pode usar a configuração
autovacuum_work_mem
para controlar a memória que as operações de vácuo automático usam independentemente. Essa configuração atua como um subconjunto demaintenance_work_mem
. Você pode decidir a quantidade de memória usada pelo vácuo automático 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 parâmetro maintenance_work_mem
de acordo com os valores na fórmula a seguir.
A fórmula usada para calcular o valor 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 que este parâmetro de servidor seria definido dependendo da quantidade de memória provisionada:
Tamanho da memória | maintenance_work_mem |
---|---|
2 GiB | 99328 KiB |
4 GiB | 157696 KiB |
8 GiB | 216064 KiB |
16 GiB | 274432 KiB |
32 GiB | 332800 KiB |
48 GiB | 367616 KiB |
64 GiB | 392192 KiB |
80 GiB | 410624 KiB |
128 GiB | 450560 KiB |
160 GiB | 468992 KiB |
192 GiB | 484352 KiB |
256 GiB | 508928 KiB |
384 GiB | 542720 KiB |
432 GiB | 552960 KiB |
672 GiB | 590848 KiB |
max_prepared_transactions
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de transações preparadas simultaneamente. Ao executar um servidor de réplica, você precisa definir esse parâmetro com o mesmo valor ou um valor maior do que no servidor mestre. |
Tipo de dados | Número inteiro |
Valor padrão | 0 |
Valores permitidos | 0-262143 |
Tipo de parâmetro | static |
Documentação | max_prepared_transactions |
max_stack_depth
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define a profundidade máxima da pilha, em quilobytes. |
Tipo de dados | Número inteiro |
Valor padrão | 2048 |
Valores permitidos | 2048 |
Tipo de parâmetro | read-only |
Documentação | max_stack_depth |
shared_buffers
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número de buffers de memória compartilhada usados pelo servidor. A unidade é de 8kb. Os valores permitidos estão dentro do intervalo de 10% a 75% da memória disponível. |
Tipo de dados | Número 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 | static |
Documentação | shared_buffers |
Descrição
O parâmetro de configuração shared_buffers
determina a quantidade de memória do sistema alocada para o banco de dados PostgreSQL para armazenar dados em buffer. 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 ignora 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 parâmetro de servidor shared_buffers
dessa instância.
Sempre que você alterar o produto atribuído a uma instância, você também deverá ajustar o valor do parâmetro shared_buffers
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 que este 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
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | Define o número máximo de buffers temporários usados por cada sessão do banco de dados. |
Tipo de dados | Número inteiro |
Valor padrão | 1024 |
Valores permitidos | 100-1073741823 |
Tipo de parâmetro | dinâmico |
Documentação | temp_buffers |
work_mem
Atributo | Valor |
---|---|
Categoria | Uso de Recursos / Memória |
Descrição | 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 de disco temporários. |
Tipo de dados | Número inteiro |
Valor padrão | 4096 |
Valores permitidos | 4096-2097151 |
Tipo de parâmetro | dinâmico |
Documentação | work_mem |
Descrição
O parâmetro work_mem
no PostgreSQL controla a quantidade de memória alocada para determinadas operações internas dentro da área de memória privada de cada sessão de banco de dados. Exemplos dessas operações são classificação e 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 de work_mem
adequado, 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_mem
faz 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_buffers
usa. - Uso específico de consulta: nem todas as sessões ou consultas usam
work_mem
. É improvável que consultas simples comoSELECT 1
exijamwork_mem
. No entanto, consultas complexas que envolvem operações como classificação ou hash podem consumir uma ou várias partes dework_mem
. - Operações paralelas: para consultas que abrangem vários back-ends paralelos, cada back-end poderia potencialmente utilizar uma ou várias partes de
work_mem
.
Monitorando e ajustando work_mem
É essencial monitorar continuamente o desempenho do sistema e ajustar work_mem
conforme necessário, principalmente se ocorrerem tempos lentos de execução de consulta relacionados a operações de classificação ou hash. Aqui estão maneiras de monitorar o desempenho usando as ferramentas disponíveis no portal do Azure:
- Insights de desempenho de consulta: verifique a guia Consultas principais 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: utilize a guia Arquivos temporários elevados nas guias de solução de problemas para identificar consultas problemáticas.
Ajuste granular
Ao gerenciar o parâmetro work_mem
, 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. Ela também minimiza o risco de encontrar problemas de memória insuficiente. Veja como 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 intenso de memória, considere personalizar o valor
work_mem
para esse usuário. Use o comandoALTER ROLE
para melhorar o desempenho das operações do usuário.Nível de função/procedimento: nos casos em que funções ou procedimentos específicos estão gerando arquivos temporários substanciais, aumentar o valor
work_mem
no nível específico da função ou do procedimento pode ser benéfico. Use o comandoALTER FUNCTION
ouALTER PROCEDURE
para alocar especificamente mais memória a essas operações.Nível de Banco de Dados: altere
work_mem
no nível do banco de dados se apenas bancos de dados específicos estiverem gerando grandes quantidades de arquivos temporários.Nível global: se uma análise do sistema revelar que a maioria das consultas está gerando pequenos arquivos temporários, enquanto apenas algumas estão criando arquivos grandes, pode ser prudente aumentar globalmente o valor
work_mem
. 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 aumento do valorwork_mem
.
Determinação do valor mínimo work_mem para operações de classificação
Para localizar o valor mínimo work_mem
para uma consulta específica, especialmente uma que gera arquivos de disco temporários durante o processo de classificação, comece considerando o tamanho do arquivo temporário gerado durante a execução da consulta. Por exemplo, se uma consulta estiver gerando um arquivo temporário de 20 MB:
- Conecte-se ao banco de dados usando psql ou seu cliente PostgreSQL preferido.
- Defina um valor
work_mem
inicial ligeiramente superior a 20 MB para considerar cabeçalhos adicionais ao processar na memória. Use um comando como:SET work_mem TO '25MB'
. - Execute
EXPLAIN ANALYZE
na consulta problemática na mesma sessão. - Revise a saída de
"Sort Method: quicksort Memory: xkB"
. Se indicar"external merge Disk: xkB"
, aumente o valor dowork_mem
de forma incremental e teste novamente até que"quicksort Memory"
apareça. A aparência de"quicksort Memory"
sinaliza 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.