19.4. Consumo de recursos #

19.4.1. Memória
19.4.2. Disco
19.4.3. Uso de recursos do núcleo
19.4.4. Processo de escrita em segundo-plano
19.4.5. E/S
19.4.6. Processos trabalhadores

19.4.1. Memória #

shared_buffers (integer) #

Define a quantidade de memória que o servidor de banco de dados usa para buffers de memória compartilhada. O padrão é normalmente 128 megabytes (128MB), mas pode ser menor, se as configurações do núcleo não permitirem (conforme determinado durante initdb). Esta configuração deve ter pelo menos 128 kilobytes. Entretanto, são geralmente necessárias configurações muito maiores do que a mínima para um bom desempenho. Se o valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, normalmente 8kB. (Valores não-padrão de BLCKSZ alteram o valor mínimo.) Este parâmetro só pode ser definido na ativação do servidor.

Se for um servidor de banco de dados dedicado, com 1 GB ou mais de RAM, o valor inicial razoável para shared_buffers é 25% da memória do sistema. Existem algumas cargas de trabalho em que configurações ainda maiores para shared_buffers são eficazes, mas como o PostgreSQL também depende do cache do sistema operacional, é improvável que uma alocação de mais de 40% de RAM para shared_buffers funcione melhor do que uma quantidade menor. Configurações maiores para shared_buffers geralmente requerem um aumento correspondente para max_wal_size, para distribuir o processo de escrita de grandes quantidades de dados novos ou alterados por um intervalo de tempo mais longo.

Em sistemas com menos de 1 GB de RAM, uma porcentagem menor de RAM é apropriada, de modo a deixar espaço adequado para o sistema operacional.

huge_pages (enum) #

Controla se são requisitadas páginas de memória enormes (huge pages) para a área de memória compartilhada principal. Os valores válidos são: try (tentar) (o padrão), on, e off. Este parâmetro só pode ser definido na ativação do servidor. Com huge_pages definido como try, o servidor tentará requisitar páginas de memória enormes, mas retornará ao padrão se isto falhar. Com on, a falha ao requisitar páginas de memória enormes impedirá a ativação do servidor. Com off, não serão requisitadas páginas de memória enormes. O estado corrente das páginas de memória enormes é indicado pela variável do servidor huge_pages_status.

No momento, esta configuração é compatível apenas com os sistemas operacionais Linux e Windows. Esta configuração é ignorada nos outros sistemas operacionais quando definida como try. No Linux, há suporte apenas quando shared_memory_type está definido como mmap (o padrão).

O uso de páginas de memória enormes resulta em tabelas de páginas menores, e menos tempo de CPU gasto no gerenciamento de memória, melhorando o desempenho. Para obter mais detalhes sobre como usar páginas de memória enormes no Linux, veja Páginas de memória enormes (huge pages) no Linux.

As páginas de memória enormes são conhecidas como páginas grandes (large pages) no Windows. Para usá-las, é necessário atribuir o direito de Bloquear páginas na memória à conta do usuário do Windows que executa o PostgreSQL. Pode ser usada a ferramenta de políticas de grupo do Windows (gpedit.msc) para atribuir ao usuário o direito de bloquear páginas na memória. Para ativar o servidor de banco de dados no prompt de comando como um processo autônomo, e não como um serviço do Windows, o prompt de comando deve ser executado como administrador, ou o Controle de Acesso do Usuário (UAC) deve ser desativado. Quando o UAC está ativo, o prompt de comando normal revoga o direito do usuário de bloquear páginas na memória quando iniciado.

Note-se que esta configuração afeta apenas a área de memória compartilhada principal. Sistemas operacionais como Linux, FreeBSD e Illumos também podem usar páginas de memória enormes (também conhecidas como páginas super ou páginas grande), automaticamente, para alocação de memória normal, sem uma solicitação explícita do PostgreSQL. No Linux, isto é chamado de páginas de memória enormes transparentes (THP). Este recurso é conhecido por causar degradação de desempenho no PostgreSQL para alguns usuários em algumas versões do Linux, então no momento seu uso é desencorajado (ao contrário do uso explícito de huge_pages).

huge_page_size (integer) #

Controla o tamanho das páginas de memória enormes, quando ativadas com huge_pages. O padrão é 0. Quando definido como 0, será usado o tamanho de página de memória enorme padrão do sistema. Este parâmetro só pode ser definido na ativação do servidor.

Alguns tamanhos de página comumente disponíveis em arquiteturas modernas de servidor de 64 bits incluem: 2MB e 1GB (Intel e AMD), 16MB e 16GB (IBM POWER), e 64kB, 2MB, 32MB e 1GB (ARM). Para obter mais informações sobre uso e suporte, veja Páginas de memória enormes (huge pages) no Linux.

No momento, há suporte para as configurações não-padrão apenas no Linux.

temp_buffers (integer) #

Define a quantidade máxima de memória usada para buffers temporários em cada sessão do banco de dados. Estes são buffers locais de sessão usados apenas para acesso a tabelas temporárias. Se o valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, normalmente 8kB. O padrão é oito megabytes (8MB). (Se BLCKSZ não for 8kB, o valor padrão será dimensionado proporcionalmente a ele.) Esta configuração pode ser alterada em sessões separadamente, mas somente antes do primeiro uso de tabelas temporárias na sessão; as tentativas posteriores de alterar o valor não terão efeito nesta sessão.

A sessão irá alocar buffers temporários conforme necessário, até o limite estabelecido por temp_buffers. O custo de definir um valor grande em sessões que não precisam realmente de muitos buffers temporários é de apenas um descritor de buffer, ou cerca de 64 bytes, por incremento em temp_buffers. Entretanto, se o buffer for realmente usado, serão consumidos 8192 bytes adicionais por ele (ou, em geral, BLCKSZ bytes).

max_prepared_transactions (integer) #

Define o número máximo de transações que podem estar no estado de preparadas simultaneamente (veja PREPARE TRANSACTION). Definir este parâmetro como zero (o padrão), desativa o recurso de transação preparada. Este parâmetro só pode ser definido na ativação do servidor.

Se não se planeja usar transações preparadas, este parâmetro deve ser definido como zero, para evitar a criação acidental de transações preparadas. Se estiverem sendo usadas transações preparadas, será provavelmente desejado que max_prepared_transactions seja pelo menos tão grande quanto max_connections, para que cada sessão possa ter uma transação preparada pendente.

Ao executar um servidor em-espera, deve-se definir este parâmetro com o mesmo valor, ou um valor superior, ao do servidor primário. Caso contrário, não serão permitidas consultas no servidor em-espera.

work_mem (integer) #

Define a quantidade máxima de memória base a ser usada por uma operação de consulta (como uma classificação ou tabela de hash), antes de escrever em arquivos de disco temporários. Se o valor for especificado sem unidade, será considerado sendo kilobytes. O padrão é quatro megabytes (4MB). Note-se que uma consulta complexa pode realizar várias operações de ordenação e hash simultaneamente; geralmente, permite-se que cada operação utilize a quantidade de memória especificada por este valor antes de começar a escrever dados em arquivos temporários. Além disso, várias sessões em execução podem estar executando estas operações ao mesmo tempo. Portanto, a memória total usada pode ser muitas vezes o valor de work_mem; é preciso ter isto em mente na hora de escolher o valor. As operações de classificação são usadas para ORDER BY, DISTINCT, e junções por mesclagem. As tabelas de hash são usadas em junções por hash, agregações baseadas em hash, nós de memorização (memoize) e processamento baseado em hash de subconsultas IN.

Geralmente as operações baseadas em hash são mais sensíveis à disponibilidade de memória do que as operações baseadas em classificação equivalentes. O limite de memória para tabelas hash é calculado multiplicando work_mem por hash_mem_multiplier. Isto possibilita que operações baseadas em hash usem uma quantidade de memória que excede a quantidade base usual de work_mem.

hash_mem_multiplier (floating point) #

Usado para calcular a quantidade máxima de memória que as operações baseadas em hash podem usar. O limite final é determinado pela multiplicação de work_mem por hash_mem_multiplier. O padrão é 2,0, o que faz com que as operações baseadas em hash utilizem o dobro da quantidade base usual de work_mem.

Deve-se considerar aumentar hash_mem_multiplier em ambientes onde uma grande quantidade de operações de consulta é uma ocorrência regular, especialmente quando simplesmente aumentar work_mem resulta em pressionar a memória (a pressão de memória assume normalmente a forma de erros intermitentes de falta de memória). A configuração padrão de 2.0 costuma ser eficaz com cargas de trabalho mistas. Configurações mais altas, na faixa de 2.0 a 8.0, ou mais, podem ser efetivas em ambientes onde work_mem já foi aumentado para 40 MB ou mais.

maintenance_work_mem (integer) #

Especifica a quantidade máxima de memória a ser usada por operações de manutenção, como VACUUM, CREATE INDEX, e ALTER TABLE ADD FOREIGN KEY. Se o valor for especificado sem unidade, será considerado sendo kilobytes. O padrão é 64 megabytes (64MB). Como apenas uma dessas operações pode ser executada por vez em uma sessão de banco de dados, e uma instalação normalmente não tem muitas delas sendo executadas simultaneamente, é seguro definir este valor muito maior que work_mem. Configurações maiores podem melhorar o desempenho para limpeza e restauração de cópias de segurança de banco de dados.

Note-se que quando se executa o autovacuum pode ser alocada até autovacuum_max_workers vezes esta memória, portanto deve-se tomar cuidado para não definir um valor padrão muito alto. Pode servir fazer o controle definindo separadamente autovacuum_work_mem.

autovacuum_work_mem (integer) #

Especifica a quantidade máxima de memória a ser usada por cada processo trabalhador do autovacuum. Se o valor for especificado sem unidade, será considerado sendo kilobytes. O padrão é -1, indicando que deve ser usado o valor de maintenance_work_mem. Esta configuração não tem efeito sobre o comportamento do comando VACUUM quando executado em outros contextos. Este parâmetro só pode ser definido no arquivo postgresql.conf ou na linha de comando do servidor.

vacuum_buffer_usage_limit (integer) #

Especifica o tamanho da Estratégia de Acesso ao Buffer usado pelos comandos VACUUM e ANALYZE. Uma configuração de 0 permitirá que a operação utilize qualquer quantidade de shared_buffers. Caso contrário, os tamanhos válidos variam de 128 kB a 16 GB. Se o tamanho especificado exceder 1/8 do tamanho de shared_buffers, o tamanho é silenciosamente limitado a este valor. O padrão é 2MB. Se este valor for especificado sem unidade, é considerado como sendo kilobytes. Este parâmetro pode ser definido a qualquer momento, e pode ser sobreposto por VACUUM e ANALYZE ao se passar a opção BUFFER_USAGE_LIMIT. Configurações maiores podem permitir que VACUUM e ANALYZE sejam executados mais rapidamente, mas uma configuração excessivamente alta pode fazer com que muitas outras páginas úteis sejam removidas dos buffers compartilhados.

logical_decoding_work_mem (integer) #

Especifica a quantidade máxima de memória a ser usada pela decodificação lógica, antes que algumas das alterações decodificadas sejam escritas no disco local. Este parâmetro limita a quantidade de memória usada por conexões de fluxo de replicação lógica. O padrão é 64 megabytes (64MB). Como cada conexão de replicação usa apenas um único buffer desse tamanho, e uma instalação normalmente não tem muitas dessas conexões simultâneas (conforme limitado por max_wal_senders), é seguro definir este valor muito maior que work_mem, reduzindo a quantidade de alterações decodificadas escritas no disco.

commit_timestamp_buffers (integer) #

Especifica a quantidade de memória a ser usada para armazenar em cache o conteúdo de pg_commit_ts (veja a Tabela 66.1). Se este valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, tipicamente 8 kB. O padrão é 0, o que requisita shared_buffers/512 até 1024 blocos, mas não menos que 16 blocos. Este parâmetro só pode ser definido na ativação do servidor.

multixact_member_buffers (integer) #

Especifica a quantidade de memória compartilhada a ser usada para armazenar em cache o conteúdo de pg_multixact/members (veja a Tabela 66.1). Se este valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, tipicamente 8 kB. O padrão é 32. Este parâmetro só pode ser definido na ativação do servidor.

multixact_offset_buffers (integer) #

Especifica a quantidade de memória compartilhada a ser usada para armazenar em cache o conteúdo de pg_multixact/offsets (veja a Tabela 66.1). Se este valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, tipicamente 8 kB. O padrão é 16. Este parâmetro só pode ser definido na ativação do servidor.

notify_buffers (integer) #

Especifica a quantidade de memória compartilhada a ser usada para armazenar em cache o conteúdo de pg_notify (veja a Tabela 66.1). Se este valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, tipicamente 8 kB. O padrão é 16. Este parâmetro só pode ser definido na ativação do servidor.

serializable_buffers (integer) #

Especifica a quantidade de memória compartilhada a ser usada para armazenar em cache o conteúdo de pg_serial (veja a Tabela 66.1). Se este valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, tipicamente 8 kB. O padrão é 32. Este parâmetro só pode ser definido na ativação do servidor.

subtransaction_buffers (integer) #

Especifica a quantidade de memória compartilhada a ser usada para armazenar em cache o conteúdo de pg_subtrans (veja a Tabela 66.1). Se este valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, tipicamente 8 kB. O padrão é 0, que requisita shared_buffers/512 até 1024 blocos, mas não menos que 16 blocos. Este parâmetro só pode ser definido na ativação do servidor.

transaction_buffers (integer) #

Especifica a quantidade de memória compartilhada a ser usada para armazenar em cache o conteúdo de pg_xact (veja a Tabela 66.1). Se este valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, tipicamente 8 kB. O padrão é 0, que requisita shared_buffers/512 até 1024 blocos, mas não menos que 16 blocos. Este parâmetro só pode ser definido na ativação do servidor.

max_stack_depth (integer) #

Especifica a profundidade segura máxima da pilha de execução do servidor. A configuração ideal para este parâmetro é o limite de tamanho real da pilha imposto pelo núcleo (conforme definido por ulimit -s, ou o equivalente local), menos uma margem de segurança de um megabyte ou mais. A margem de segurança é necessária, porque a profundidade da pilha não é verificada em todas as rotinas do servidor, mas apenas nas principais rotinas potencialmente recursivas. Se o valor for especificado sem unidade, será considerado sendo kilobytes. O padrão é dois megabytes (2MB), que é conservadoramente pequeno, e com pouca probabilidade de causar falhas. Entretanto, pode ser muito pequeno para permitir a execução de funções complexas. Apenas superusuários e usuários com o privilégio SET apropriado podem alterar esta configuração.

Definir max_stack_depth maior que o limite real do núcleo significa que uma função recursiva descontrolada poderá travar um processo servidor individual. Em plataformas onde o PostgreSQL pode determinar o limite do núcleo, o servidor não permitirá que esta variável seja definida com um valor inseguro. Entretanto, nem todas as plataformas fornecem esta informação, portanto, recomenda-se cautela ao selecionar o valor.

shared_memory_type (enum) #

Especifica a implementação de memória compartilhada que o servidor deve usar para a região principal de memória compartilhada que contém os buffers compartilhados do PostgreSQL, e outros dados compartilhados. Os valores possíveis são mmap (para memória compartilhada anônima alocada usando mmap), sysv (para memória compartilhada System V alocada via shmget), e windows (para memória compartilhada do Windows). Não há suporte para todos os valores em todas as plataformas; a primeira opção com suporte é o padrão para esta plataforma. O uso da opção sysv, que não é o padrão em nenhuma plataforma, é geralmente desencorajado, porque normalmente requer configurações do núcleo não-padrão para permitir grandes alocações (veja Memória compartilhada e semáforos). Este parâmetro só pode ser definido na ativação do servidor.

dynamic_shared_memory_type (enum) #

Especifica a implementação de memória compartilhada dinâmica que o servidor deve usar. Os valores possíveis são posix (para memória compartilhada POSIX alocada usando shm_open), sysv (para memória compartilhada System V alocada via shmget), windows (para memória compartilhada do Windows), e mmap (para simular memória compartilhada usando arquivos mapeados em memória armazenados no diretório de dados). Não há suporte para todos os valores em todas as plataformas; a primeira opção com suporte é geralmente o padrão para esta plataforma. O uso da opção mmap, que não é padrão em nenhuma plataforma, é geralmente desencorajado, porque o sistema operacional pode escrever páginas modificadas de volta no disco repetidamente, aumentando a carga de E/S do sistema; no entanto, pode servir para depuração, quando o diretório pg_dynshmem é armazenado em um disco em memória RAM, ou quando outros recursos de memória compartilhada não estão disponíveis. Este parâmetro só pode ser definido na ativação do servidor.

min_dynamic_shared_memory (integer) #

Especifica a quantidade de memória que deve ser alocada na ativação do servidor para uso por instruções paralelas. Quando esta região de memória é insuficiente, ou está esgotada por instruções simultâneas, as novas instruções paralelas tentam alocar memória compartilhada extra do sistema operacional usando temporariamente o método configurado com dynamic_shared_memory_type, que pode ser mais lento devido à sobrecarga de gerenciamento de memória. A memória alocada na ativação com min_dynamic_shared_memory é afetada pela configuração do parâmetro huge_pages em sistemas operacionais onde páginas enormes têm suporte, podendo ser provável que se beneficie mais de páginas enormes em sistemas operacionais onde estas são gerenciadas automaticamente. O padrão é 0 (nenhuma). Este parâmetro só pode ser definido na ativação do servidor.

19.4.2. Disco #

temp_file_limit (integer) #

Especifica a quantidade máxima de espaço em disco que um processo pode usar para arquivos temporários, como classificação e hash, ou o arquivo de armazenamento para um cursor mantido. Uma transação que tente exceder este limite será cancelada. Se o valor for especificado sem unidade, será considerado sendo kilobytes. O valor -1 (o padrão) significa sem limite. Apenas superusuários e usuários com o privilégio SET apropriado podem alterar esta configuração.

Esta configuração restringe o espaço total usado em qualquer instante por todos os arquivos temporários usados por um determinado processo do PostgreSQL. Deve-se observar que o espaço em disco usado para tabelas temporárias explícitas, em oposição aos arquivos temporários usados às escondidas na execução da consulta, não conta neste limite.

file_copy_method (enum) #

Especifica o método usado para copiar arquivos. Os valores possíveis são COPY (o padrão) e CLONE (se houver suporte do sistema operacional).

Este parâmetro afeta:

  • CREATE DATABASE ... STRATEGY=FILE_COPY

  • ALTER DATABASE ... SET TABLESPACE ...

CLONE usa as chamadas de sistema copy_file_range() (Linux, FreeBSD), ou copyfile (macOS), dando ao núcleo a oportunidade de compartilhar blocos de disco ou delegar tarefas a camadas inferiores em alguns sistemas de arquivos.

file_extend_method (enum) #

Especifica o método usado para expandir arquivos de dados durante operações em massa, como COPY. A primeira opção disponível é usada como padrão, dependendo do sistema operacional:

  • posix_fallocate (Unix) usa a interface POSIX padrão para alocar espaço em disco, mas está ausente em alguns sistemas operacionais. Se estiver presente, mas o sistema de arquivos subjacente não oferecer suporte, esta opção recorre silenciosamente a write_zeros. Sabe-se que as versões atuais do Btrfs desativam a compressão quando esta opção é usada. Este é o padrão em sistemas que possuem esta função.

  • write_zeros estende arquivos escrevendo blocos de bytes zero. Este é o padrão em sistemas que não possuem a função posix_fallocate.

O método write_zeros é sempre utilizado quando arquivos de dados são estendidos em 8 blocos ou menos.

max_notify_queue_pages (integer) #

Especifica a quantidade máxima de páginas alocadas para a fila de NOTIFY / LISTEN. O padrão é 1048576. Para páginas de 8 KB, permite consumir até 8 GB de espaço em disco. Este parâmetro só pode ser definido na ativação do servidor.

19.4.3. Uso de recursos do núcleo #

max_files_per_process (integer) #

Define o número máximo de arquivos que cada subprocesso do servidor tem permissão para manter abertos simultaneamente; arquivos já abertos no postmaster não são contados para este limite. O padrão é mil arquivos.

Se o núcleo estiver aplicando um limite seguro por processo, não será necessário se preocupar com esta configuração. Entretanto, em algumas plataformas (notadamente na maioria dos sistemas BSD), o núcleo permite que processos individuais abram muito mais arquivos do que o sistema realmente aguentaria caso muitos processos tentassem abrir esta mesma quantidade de arquivos simultaneamente. Se forem encontradas falhas do tipo muitos arquivos abertos, deve-se tentar reduzir esta configuração. Este parâmetro só pode ser definido na ativação do servidor.

19.4.4. Processo de escrita em segundo-plano #

Existe um processo servidor separado chamado processo de escrita em segundo plano (background writer), cuja função é efetuar escritas de buffers compartilhados sujos (novos ou modificados). Quando o número de buffers compartilhados limpos parece insuficiente, o processo de escrita em segundo plano escreve alguns buffers sujos no sistema de arquivos, e os marca como limpos. Isto reduz a probabilidade de que os processos servidores que lidam com as instruções de usuário não consigam encontrar buffers limpos, e tenham que escrever eles mesmos os buffers sujos. Entretanto, o processo de escrita em segundo plano causa um aumento líquido geral na carga de E/S, porque, embora uma página que é suja várias vezes possa ser escrita apenas uma vez por intervalo de ponto de verificação (checkpoint), o processo de escrita em segundo plano poderá escrevê-la várias vezes, porque se torna suja durante este intervalo de ponto de verificação. Os parâmetros discutidos nesta subseção podem ser usados para ajustar o comportamento às necessidades locais.

bgwriter_delay (integer) #

Especifica o atraso entre os retornos de atividade para o processo de escrita em segundo plano. A cada retorno, o processo de escrita em segundo plano causa escritas para um certo número de buffers sujos (controlável pelos parâmetros que se seguem). Em seguida, dorme pelo tempo de bgwriter_delay, e volta novamente. Entretanto, quando não há buffers sujos no pool de buffers, o processo entra em uma suspensão mais longa, independente de bgwriter_delay. Se este valor for especificado sem unidade, será considerado sendo milissegundos. O padrão é 200 milissegundos (200ms). Note-se que, em muitos sistemas, a resolução efetiva dos atrasos de inatividade é 10 milissegundos; configurar bgwriter_delay para um valor que não seja múltiplo de 10 pode ter os mesmos resultados que configurá-lo para o próximo múltiplo maior de 10. Este parâmetro só pode ser definido no arquivo postgresql.conf ou na linha de comando do servidor.

bgwriter_lru_maxpages (integer) #

A cada volta, não mais do que esta quantidade de buffers será escrita pelo processo de escrita em segundo plano. Definir como zero desativa o processo de escrita em segundo plano. (Note-se que os pontos de verificação gerenciados por um processo auxiliar separado e dedicado, não são afetados.) O padrão é 100 buffers. Este parâmetro só pode ser definido no arquivo postgresql.conf ou na linha de comando do servidor.

bgwriter_lru_multiplier (floating point) #

O número de buffers sujos escritos a cada volta é baseado no número de novos buffers necessários para os processos servidores durante as voltas recentes. A necessidade recente média é multiplicada por bgwriter_lru_multiplier para chegar a uma estimativa do número de buffers que serão necessários durante a próxima volta. Os buffers sujos são escritos até chegar a este número de buffers limpos e reutilizáveis disponíveis. (Entretanto, não mais do que bgwriter_lru_maxpages buffers serão escritos por volta.) Assim, uma configuração de 1.0 representa uma política de escrever na hora certa (just in time) exatamente o número de buffers previstos para serem necessários. Valores maiores fornecem alguma proteção contra picos de demanda, enquanto valores menores deixam intencionalmente as escritas para serem feitas pelos processos servidores. O padrão é 2.0. Este parâmetro só pode ser definido no arquivo postgresql.conf ou na linha de comando do servidor.

bgwriter_flush_after (integer) #

Sempre que mais do que esta quantidade de dados for escrita pelo processo de escrita em segundo plano, tenta forçar o sistema operacional a efetuar estas escritas no armazenamento subjacente. Fazer isto limita a quantidade de dados sujos no cache de páginas do núcleo, reduzindo a probabilidade de travamentos quando a função fsync for chamada no final do ponto de verificação, ou quando o sistema operacional escrever os dados em lotes maiores em segundo plano. Muitas vezes, isto resulta em latência de transação bastante reduzida, mas também há alguns casos, especialmente com cargas de trabalho maiores que shared_buffers, mas menores que o cache de páginas do sistema operacional, em que o desempenho pode diminuir. Esta configuração pode não ter efeito em algumas plataformas. Se o valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, normalmente 8kB. O intervalo válido está entre 0, que desativa a funcionalidade de escrita forçada, e 2MB. O padrão é 512kB no Linux, e 0 em outros sistemas operacionais. (Se BLCKSZ não for 8kB, os valores padrão e máximo serão dimensionados proporcionalmente ao mesmo.) Este parâmetro só pode ser definido no arquivo postgresql.conf ou na linha de comando do servidor.

Valores menores de bgwriter_lru_maxpages e bgwriter_lru_multiplier reduzem a carga extra de E/S causada pelo processo de escrita em segundo plano, mas torna mais provável que os processos servidores tenham que efetuar escritas por si mesmos, atrasando as instruções interativas.

19.4.5. E/S #

backend_flush_after (integer) #

Sempre que uma quantidade de dados maior do que esta for escrita por um único processo servidor, tenta forçar o sistema operacional a efetuar estas escritas no armazenamento subjacente. Fazer isto limita a quantidade de dados sujos no cache de páginas do núcleo, reduzindo a probabilidade de interrupções quando a função fsync for chamada no final do ponto de verificação, ou quando o sistema operacional escrever dados em lotes maiores em segundo plano. Muitas vezes, isto resulta em latência de transação bastante reduzida, mas também há alguns casos, especialmente com cargas de trabalho maiores que shared_buffers, mas menores que o cache de páginas do sistema operacional, em que o desempenho pode diminuir. Esta configuração pode não ter efeito em algumas plataformas. Se o valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, normalmente 8kB. O intervalo válido está entre 0, que desativa a funcionalidade de escrita forçada, e 2MB. O padrão é 0, ou seja, nenhuma escrita forçada. (Se BLCKSZ não for 8kB, o valor máximo será dimensionado proporcionalmente ao mesmo.)

effective_io_concurrency (integer) #

Define o número de operações de E/S de armazenamento simultâneas que o PostgreSQL espera que possam ser executadas ao mesmo tempo. Aumentar este valor eleva o número de operações de E/S que qualquer sessão individual do PostgreSQL tenta iniciar em paralelo. O intervalo permitido é de 1 a 1000, ou 0 para desativar a emissão de solicitações de E/S assíncrona. O padrão é 16.

Valores mais altos terão maior impacto em armazenamento com latência mais elevada — onde, de outra forma, as consultas sofreriam interrupções de E/S perceptíveis — e em dispositivos com alto número de IOPS. Valores excessivamente altos podem aumentar a latência de E/S para todas as consultas no sistema.

Em sistemas com suporte a orientações de pré-busca (prefetch advice), effective_io_concurrency também controla a alcance da pré-busca.

Este valor pode ser sobreposto para tabelas em um espaço de tabelas específico, definindo o parâmetro do espaço de tabelas de mesmo nome (veja ALTER TABLESPACE).

maintenance_io_concurrency (integer) #

Semelhante a effective_io_concurrency, mas usado para trabalho de manutenção feito em nome de muitas sessões cliente.

O padrão é 16. Este valor pode ser sobreposto para tabelas em um espaço de tabelas específico, definindo o parâmetro do espaço de tabelas de mesmo nome (veja ALTER TABLESPACE).

io_max_combine_limit (integer) #

Controla o maior tamanho de E/S em operações que combinam E/S, e limita silenciosamente o parâmetro io_combine_limit configurável pelo usuário. Este parâmetro só pode ser definido na ativação do servidor. Se o valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, normalmente 8kB. O tamanho máximo possível depende do sistema operacional e do tamanho do bloco, mas é tipicamente 1 MB no Unix e 128 KB no Windows. O padrão é 128kB.

io_combine_limit (integer) #

Controla o maior tamanho de E/S em operações que combinam E/S. Se definido com um valor superior ao do parâmetro io_max_combine_limit, será usado o valor mais baixo silenciosamente em seu lugar; portanto, pode ser necessário aumentar ambos para ampliar o tamanho de E/S. Se o valor for especificado sem unidade, será considerado sendo blocos, ou seja, BLCKSZ bytes, normalmente 8kB. O tamanho máximo possível depende do sistema operacional e do tamanho do bloco, mas é tipicamente 1 MB no Unix e 128 KB no Windows. O padrão é 128kB.

io_max_concurrency (integer) #

Controla o número máximo de operações de E/S que um processo pode executar simultaneamente.

A configuração padrão de -1 seleciona um número com base em shared_buffers e no número máximo de processos (max_connections, autovacuum_worker_slots, max_worker_processes e max_wal_senders), mas não mais que 64.

Este parâmetro só pode ser definido na ativação do servidor.

io_method (enum) #

Seleciona o método para a execução de E/S assíncrona. Os valores possíveis são:

  • worker (executa E/S assíncrona usando processos trabalhadores)

  • io_uring (executa E/S assíncrona usando io_uring, requer uma construção com --with-liburing / -Dliburing)

  • sync (executa de forma síncrona operações de E/S elegíveis para execução assíncrona)

O padrão é worker.

Este parâmetro só pode ser definido na ativação do servidor.

io_workers (integer) #

Seleciona o número de processos trabalhadores de E/S a serem usados. O padrão é 3. Este parâmetro só pode ser definido no arquivo postgresql.conf ou na linha de comando do servidor.

Só tem efeito se io_method estiver definido como worker.

19.4.6. Processos trabalhadores #

max_worker_processes (integer) #

Define o número máximo de processos em segundo plano que o sistema pode permitir. Este parâmetro só pode ser definido na ativação do servidor. O padrão é 8.

Ao executar um servidor em-espera, deve-se definir este parâmetro com o mesmo valor, ou um valor superior, ao do servidor primário. Caso contrário, não serão permitidas consultas no servidor em-espera.

Ao alterar este valor, deve-se considerar também ajustar max_parallel_workers, max_parallel_maintenance_workers e max_parallel_workers_per_gather.

max_parallel_workers_per_gather (integer) #

Define o número máximo de processos trabalhadores que podem ser iniciados por um único nó Gather ou Gather Merge. Os processos trabalhadores paralelos são retirados do pool de processos estabelecido por max_worker_processes, e limitados por max_parallel_workers. Note-se que o número solicitado de processos trabalhadores pode não estar realmente disponível em tempo de execução. Se isto ocorrer, o plano será executado com menos processos trabalhadores do que o esperado, o que pode ser ineficiente. O padrão é 2. Definir este valor como 0 desativa a execução de consulta paralela.

Note-se que as consultas paralelas podem consumir muito mais recursos do que as consultas não paralelas, porque cada processo trabalhador é um processo inteiramente separado que tem aproximadamente o mesmo impacto no sistema que uma sessão de usuário adicional. Isto deve ser levado em consideração ao escolher um valor para esta configuração, bem como ao definir outras configurações que controlam a utilização de recursos, como work_mem. Limites de recursos como work_mem são aplicados individualmente a cada processo trabalhador, significando que a utilização total pode ser muito maior em todos os processos do que seria normalmente para qualquer processo único. Por exemplo, uma consulta paralela usando 4 processos trabalhadores pode usar até 5 vezes mais tempo de CPU, memória, largura de banda de E/S, e assim por diante, do que uma consulta que não usa nenhum processo trabalhador.

Para obter mais informações sobre consulta paralela, veja Consultas paralelizadas.

max_parallel_maintenance_workers (integer) #

Define o número máximo de processos trabalhadores paralelos que um comando utilitário pode iniciar. No momento, os comandos utilitários com suporte ao uso de processos trabalhadores paralelos são CREATE INDEX ao construir índices de Árvore-B, GIN ou BRIN, e VACUUM sem a opção FULL. Os processos trabalhadores paralelos são retirados do pool de processos estabelecido por max_worker_processes, e limitados por max_parallel_workers. Note-se que o número solicitado de processos trabalhadores pode não estar realmente disponível em tempo de execução. Se isto ocorrer, a operação do utilitário será executada com menos processos trabalhadores do que o esperado. O padrão é 2. Definir este valor como 0 desativa o uso de processos trabalhadores paralelos em comandos utilitários.

Note-se que os comandos utilitários paralelos não devem consumir substancialmente mais memória do que as operações não paralelas equivalentes. Esta estratégia difere da consulta paralela, em que os limites de recursos geralmente se aplicam por processo trabalhador. Os comandos utilitários paralelos tratam o limite de recurso maintenance_work_mem como um limite a ser aplicado a todo o comando utilitário, independentemente do número de processos trabalhadores paralelos. Entretanto, os comandos utilitários paralelos ainda podem consumir substancialmente mais recursos de CPU e largura de banda de E/S.

max_parallel_workers (integer) #

Define o número máximo de processos trabalhadores que a instância pode permitir para operações paralelas. O padrão é 8. Ao aumentar ou diminuir este valor, deve-se considerar também ajustar max_parallel_maintenance_workers e max_parallel_workers_per_gather. Além disso, note que uma configuração para este valor maior que max_worker_processes não terá efeito, porque os processos trabalhadores paralelos são retirados do pool de processos trabalhadores estabelecidos por esta configuração.

parallel_leader_participation (boolean) #

Permite que o processo líder execute o plano de consulta em nós Gather e Gather Merge, em vez de esperar por processos trabalhadores. O padrão é on. Definir este valor como off reduz a probabilidade de que os processos trabalhadores sejam bloqueados porque o processo líder não está lendo as tuplas rápido o suficiente, mas exige que o processo líder aguarde a ativação dos processos trabalhadores antes que as primeiras tuplas possam ser produzidas. O grau em que o processo líder pode ajudar ou atrapalhar o desempenho depende do tipo de plano, número de processos trabalhadores, e duração da consulta.