18.4. Gerenciamento dos recursos do núcleo #

18.4.1. Memória compartilhada e semáforos
18.4.2. systemd RemoveIPC
18.4.3. Limites de recursos
18.4.4. Sobrecarga de memória do Linux
18.4.5. Páginas de memória enormes (huge pages) no Linux

O PostgreSQL pode, às vezes, esgotar os limites de recursos do sistema operacional, especialmente quando várias cópias do servidor estão em execução no mesmo sistema ou em instalações muito grandes. Esta seção explica os recursos do núcleo usados ​​pelo PostgreSQL, e as etapas que se pode seguir para resolver problemas relacionados ao consumo de recursos do núcleo.

18.4.1. Memória compartilhada e semáforos #

O PostgreSQL requer que o sistema operacional forneça recursos de comunicação entre processos (IPC), especificamente memória compartilhada e semáforos. Os sistemas operacionais derivados do Unix fornecem normalmente o IPC do System V, do POSIX, ou ambos. O Windows possui sua própria implementação dessa funcionalidade, que não é discutida aqui.

Por padrão, o PostgreSQL aloca uma quantidade muito pequena de memória compartilhada do System V, bem como uma quantidade muito maior de memória compartilhada anônima mmap. Como alternativa, pode ser usada uma única região grande de memória compartilhada do System V (veja shared_memory_type). Além disso, um número significativo de semáforos, que podem ser do estilo System V ou POSIX, são criados na ativação do servidor. No momento são usados semáforos POSIX em sistemas Linux e FreeBSD, enquanto as outras plataformas usam semáforos System V.

Os recursos de IPC do System V são normalmente restritos por limites de alocação de todo o sistema. Quando o PostgreSQL excede um desses limites, o servidor se recusa a iniciar, devendo deixar uma mensagem de erro instrutiva descrevendo o problema, e o que se de deve fazer a respeito. (Veja também Falhas na ativação do servidor.) Os parâmetros relevantes do núcleo têm nomes consistentes em diferentes sistemas; Parâmetros de IPC do System V dá uma visão geral. Os métodos para defini-los, no entanto, variam, sendo dadas abaixo sugestões para algumas plataformas.

Tabela 18.1. Parâmetros de IPC do System V

NomeDescriçãoValores necessários para executar uma instância do PostgreSQL
SHMMAXTamanho máximo do segmento de memória compartilhada (bytes)pelo menos 1kB, mas geralmente o padrão é bem maior
SHMMINTamanho mínimo do segmento de memória compartilhada (bytes)1
SHMALLQuantidade total de memória compartilhada disponível (bytes ou páginas)igual a SHMMAX se for em bytes, ou ceil(SHMMAX/PAGE_SIZE) se for em páginas, mais o necessário para as outras aplicações
SHMSEGNúmero máximo de segmentos de memória compartilhada por processoé necessário apenas 1 segmento, mas o padrão é bem maior
SHMMNINúmero máximo de segmentos de memória compartilhada para todo o sistemacomo SHMSEG, mais o necessário para as outras aplicações
SEMMNINúmero máximo de identificadores de semáforo (ou seja, conjuntos)pelo menos ceil(num_os_semaphores / 16) mais espaço para outras aplicações
SEMMNSNúmero máximo de semáforos em todo o sistemaceil(num_os_semaphores / 16) * 17 mais espaço para outras aplicações
SEMMSLNúmero máximo de semáforos por conjuntopelo menos 17
SEMMAPNúmero de entradas no mapa de semáforosveja o texto
SEMVMXValor máximo do semáforopelo menos 1000 (Geralmente o padrão é 32767; não devendo ser mudado, a menos que seja necessário)

O PostgreSQL requer uns poucos bytes de memória compartilhada do System V (normalmente 48 bytes, nas plataformas de 64 bits) para cada instância do servidor. Na maioria dos sistemas operacionais modernos, este valor pode ser facilmente alocado. Entretanto, se estiverem sendo executadas muitas instâncias do servidor, ou o servidor tiver sido configurado explicitamente para usar uma grande quantidade de memória compartilhada do System V (veja shared_memory_type e dynamic_shared_memory_type), pode ser necessário aumentar SHMALL, que é a quantidade total de memória compartilhada do System V para todo o sistema. Deve-se observar que SHMALL é medido em páginas, ao invés de bytes, em muitos sistemas.

Menos provável de causar problemas é o tamanho mínimo para segmentos de memória compartilhada (SHMMIN), que deve ser no máximo aproximadamente 32 bytes para o PostgreSQL (é geralmente apenas 1). É improvável que o número máximo de segmentos para todo o sistema (SHMMNI), ou por processo (SHMSEG), cause um problema, a menos que estejam definidos como zero.

Ao usar semáforos System V, o PostgreSQL usa um semáforo por conexão permitida. (max_connections), processo de trabalho de auto-limpeza autorizado (autovacuum_worker_slots), processo de envio de WAL permitido (max_wal_senders), processo em segundo plano permitido (max_worker_processes), etc., em conjuntos de 16. O parâmetro calculado em tempo de execução num_os_semaphores relata o número de semáforos necessários. Este parâmetro pode ser visto antes de iniciar o servidor com um comando postgres, como:

$ postgres -D $PGDATA -C num_os_semaphores

Cada conjunto de 16 semáforos também irá conter um 17º semáforo contendo um número mágico, para detectar colisões com conjuntos de semáforos usados ​​por outras aplicações. O número máximo de semáforos no sistema é definido por SEMMNS, que, consequentemente, deve ser pelo menos igual a num_os_semaphores mais um extra para cada conjunto de 16 semáforos necessários. (veja a fórmula em Parâmetros de IPC do System V). O parâmetro SEMMNI determina o limite do número de conjuntos de semáforos que podem existir no sistema simultaneamente. Portanto, este parâmetro deve ser pelo menos ceil(num_os_semaphores / 16). Reduzir o número de conexões permitidas é uma solução temporária para falhas, que geralmente são mostradas de maneira confusa como Não há espaço disponível no dispositivo pela função semget.

Em alguns casos, também pode ser necessário aumentar SEMMAP, para pelo menos na ordem de SEMMNS. Se o sistema possui este parâmetro (muitos não possuem), ele define o tamanho do mapa de recursos do semáforo, no qual cada bloco contíguo de semáforos disponíveis precisa de uma entrada. Quando um conjunto de semáforos é liberado, ele é adicionado a uma entrada existente adjacente ao bloco liberado, ou é registrado em uma nova entrada de mapa. Se o mapa estiver cheio, os semáforos liberados serão perdidos (até o reinício do sistema operacional). A fragmentação do espaço do semáforo pode, com o tempo, levar a menos semáforos disponíveis do que deveria existir.

Várias outras configurações relacionadas a desfazer semáforo (semaphore undo), tais como SEMMNU e SEMUME, não afetam o PostgreSQL.

Ao usar semáforos POSIX, o número de semáforos necessários é o mesmo do System V, ou seja, um semáforo por conexão permitida (max_connections), processo trabalhador de auto-limpeza permitido (autovacuum_worker_slots), processo de envio de WAL permitido (max_wal_senders), processo em segundo plano permitido (max_worker_processes), etc. Nas plataformas em que esta opção é preferida, não há limite específico do núcleo para o número de semáforos POSIX.

FreeBSD

As configurações padrão para memória compartilhada são geralmente suficientemente boas, a menos que se tenha definido shared_memory_type como sysv. Os semáforos System V não são usados nesta plataforma.

As configurações de IPC padrão podem ser mudadas usando as interfaces sysctl [110] ou loader. Os seguintes parâmetros podem ser definidos usando sysctl:

# sysctl kern.ipc.shmall=32768
# sysctl kern.ipc.shmmax=134217728

Para fazer com que estas configurações persistam após o reinício do sistema operacional, deve ser modificado o arquivo /etc/sysctl.conf.

Se shared_memory_type tiver sido definida como sysv, também pode-se desejar configurar o núcleo bloqueando a memória compartilhada do System V na RAM, evitando que seja paginada para a área de troca (swap). Isto pode ser feito definindo o parâmetro kern.ipc.shm_use_phys do sysctl.

Se estiver executando em uma FreeBSD jail, deverá ser definido o parâmetro sysvshm como new, para que tenha seu próprio espaço de nomes de memória compartilhada do System V. (Antes do FreeBSD 11.0, era necessário ativar o acesso compartilhado ao espaço de nomes IPC do hospedeiro a partir das jaulas, e tomar medidas para evitar colisões.)

NetBSD

As configurações padrão de memória compartilhada são geralmente suficientemente boas, a menos que se tenha definido shared_memory_type como sysv. Entretanto, será necessário aumentar kern.ipc.semmni e kern.ipc.semmns, porque as configurações padrão do NetBSD para os mesmos são inviáveis ​​devido ao tamanho reduzido.

Os parâmetros do IPC podem ser ajustados usando sysctl. Por exemplo:

# sysctl -w kern.ipc.semmni=100

Para fazer com que estas configurações persistam após o reinício do sistema operacional, deve ser modificado o arquivo /etc/sysctl.conf.

Se shared_memory_type tiver sido definida como sysv, também pode-se desejar configurar o núcleo bloqueando a memória compartilhada do System V na RAM, evitando que seja paginada para a área de troca (swap). Isto pode ser feito definindo o parâmetro kern.ipc.shm_use_phys do sysctl.

OpenBSD

As configurações padrão de memória compartilhada são geralmente suficientemente boas, a menos que se tenha definido shared_memory_type como sysv. Entretanto, será necessário aumentar kern.ipc.semmni e kern.ipc.semmns como configurações padrão do OpenBSD, porque são impraticavelmente pequenos.

Os parâmetros do IPC podem ser ajustados usando sysctl. Por exemplo:

# sysctl kern.seminfo.semmni=100

Para fazer com que estas configurações persistam após o reinício do sistema operacional, deve ser modificado o arquivo /etc/sysctl.conf.

Linux

As configurações padrão de memória compartilhada são geralmente suficientemente boas, a menos que se tenha definido shared_memory_type como sysv e, mesmo assim, apenas em versões mais antigas do núcleo que foram distribuídas com padrões baixos. Os semáforos System V não são usados nesta plataforma.

As configurações de tamanho de memória compartilhada podem ser mudadas através da interface sysctl. Por exemplo, para permitir 16 GB:

$ sysctl -w kernel.shmmax=17179869184
$ sysctl -w kernel.shmall=4194304

Para fazer com que estas configurações persistam após o reinício do sistema operacional, veja o arquivo /etc/sysctl.conf.

macOS

As configurações padrão de memória compartilhada são geralmente suficientemente boas, a menos que se tenha definido shared_memory_type como sysv.

O método recomendado para configurar a memória compartilhada no macOS é criar um arquivo chamado /etc/sysctl.conf, contendo atribuições de variáveis como:

kern.sysv.shmmax=4194304
kern.sysv.shmmin=1
kern.sysv.shmmni=32
kern.sysv.shmseg=8
kern.sysv.shmall=1024

Note que em algumas versões do macOS, todos os cinco parâmetros de memória compartilhada devem ser definidos no arquivo /etc/sysctl.conf, caso contrário os valores são ignorados.

SHMMAX só pode ser definido como um múltiplo de 4096.

SHMALL é medido em páginas de 4 kB nesta plataforma.

É possível alterar tudo, exceto SHMMNI, em tempo de execução, usando sysctl. Mas ainda é melhor configurar os valores preferidos por meio do arquivo /etc/sysctl.conf, para que os valores sejam mantidos nos reinícios do sistema operacional.

Solaris
illumos

As configurações padrão de memória compartilhada e semáforo são geralmente suficientemente boas para a maioria das aplicações do PostgreSQL. O padrão do Solaris é SHMMAX valendo um quarto da RAM do sistema operacional. Para ajustar ainda mais esta configuração, deve ser usada uma configuração de projeto associada ao usuário postgres. Por exemplo, execute o seguinte comando como usuário root:

projadd -c "PostgreSQL DB User" \
        -K "project.max-shm-memory=(privileged,8GB,deny)" \
        -U postgres \
        -G postgres user.postgres

Este comando adiciona o projeto user.postgres, e define o máximo de memória compartilhada para o usuário postgres como 8 GB, entrando em vigor na próxima vez que o usuário se autenticar, ou quando o PostgreSQL for reiniciado (e não recarregado). O que foi mostrado anteriormente assume que o PostgreSQL está sendo executado pelo usuário postgres no grupo postgres. O reinício do sistema operacional não é necessário.

Outras alterações de configuração do núcleo, recomendadas para servidores de banco de dados com previsão de muitas conexões, são:

project.max-shm-ids=(priv,32768,deny)
project.max-sem-ids=(priv,4096,deny)
project.max-msg-ids=(priv,4096,deny)

Além disso, se estiver executando o PostgreSQL dentro de uma zona, talvez seja necessário aumentar também os limites de uso de recursos dessa zona. Veja Chapter2: Projects and Tasks em System Administrator's Guide, para obter mais informações sobre projects e prctl.

18.4.2. systemd RemoveIPC #

Se o systemd estiver em uso, devem ser tomados alguns cuidados para que os recursos do IPC (incluindo memória compartilhada), não sejam removidos prematuramente pelo sistema operacional. Esta situação é notadamente preocupante ao instalar o PostgreSQL a partir do código-fonte. Os usuários de pacotes distribuídos do PostgreSQL são menos propensos a serem afetados, porque o usuário postgres é normalmente criado como um usuário do sistema.

O parâmetro RemoveIPC no arquivo logind.conf controla se os objetos do IPC são removidos quando um usuário efetua uma desconexão completa. Não se aplica aos usuários do sistema. Este parâmetro está ativo (yes) por padrão na versão original do systemd, mas em algumas distribuições de sistema operacional o padrão é inativo (no).

Um efeito típico observado quando esta configuração está ativa, é que os objetos de memória compartilhada usados para execução de consultas paralelas são removidos em momentos aparentemente aleatórios, levando a erros e avisos ao tentar abri-los e removê-los, como

WARNING:  could not remove shared memory segment "/PostgreSQL.1450751626": ↵
          No such file or directory

Tipos diferentes de objetos do IPC (memória compartilhada versus semáforos, System V versus POSIX) são tratados de forma ligeiramente diferente pelo systemd, portanto, pode-se observar que alguns recursos do IPC não são removidos da mesma forma que outros. Mas não se aconselha a confiar nessas diferenças sutis.

Um logout de usuário pode acontecer como parte de um trabalho de manutenção, ou manualmente quando o administrador se conecta como o usuário postgres, ou algo semelhante, então é difícil evitar que isto aconteça em geral.

O que é um usuário do sistema é determinado no tempo de compilação do systemd, a partir da configuração SYS_UID_MAX no arquivo /etc/login.defs.

Os scripts de criação de pacotes e implantação devem ter o cuidado de criar o usuário postgres como um usuário do sistema, usando useradd -r, adduser --system, ou equivalente.

Como alternativa, se a conta de usuário foi criada incorretamente, ou não pode ser alterada, é recomendável definir

RemoveIPC=no

no arquivo /etc/systemd/logind.conf, ou em outro arquivo de configuração apropriado.

Cuidado

Pelo menos uma dessas duas coisas deve ser garantida, ou o servidor PostgreSQL não será confiável.

18.4.3. Limites de recursos #

Os sistemas operacionais do tipo Unix impõem vários tipos de limites de recursos que podem interferir na operação do servidor PostgreSQL. De particular importância são os limites do número de processos por usuário, o número de arquivos abertos por processo, e a quantidade de memória disponível para cada processo. Cada um deles possui um limite rígido e um limite flexível. O limite flexível é o que realmente conta, mas pode ser alterado pelo usuário até o limite rígido. O limite rígido só pode ser alterado pelo usuário root. A chamada de sistema setrlimit é responsável por definir estes parâmetros. O comando interno do interpretador de comandos ulimit (shells Bourne), ou limit (csh), é usado para controlar os limites de recursos a partir da linha de comando. Em sistemas derivados do BSD, o arquivo /etc/login.conf controla os vários limites de recursos definidos durante o login. Consulte a documentação do sistema operacional para obter detalhes. Os parâmetros relevantes são maxproc, openfiles e datasize. Por exemplo:

default:\
...
        :datasize-cur=256M:\
        :maxproc-cur=256:\
        :openfiles-cur=256:\
...

(-cur é o limite flexível. Deve ser anexado -max para definir o limite rígido.)

Os núcleos também podem ter limites para todo sistema para alguns recursos.

  • No Linux o parâmetro do núcleo fs.file-max determina o número máximo de arquivos abertos que o núcleo pode oferecer suporte. Pode ser alterado por sysctl -w fs.file-max=N. Para que a configuração persista após reinicializações, deve ser adicionada uma atribuição em /etc/sysctl.conf. O limite máximo de arquivos por processo é fixado no momento da compilação do núcleo; veja /usr/src/linux/Documentation/proc.txt para obter mais informações.

O servidor PostgreSQL usa um processo por conexão, então a configuração deve permitir pelo menos tantos processos quantas forem as conexões autorizadas, além do necessário para o resto do sistema. Geralmente este limite não é um problema, mas se forem executados vários servidores na mesma máquina, poderá ficar apertado.

O limite padrão para arquivos abertos é geralmente definido como um valor socialmente amigável, permitindo que muitos usuários coexistam na mesma máquina, sem usar uma fração excessiva dos recursos do sistema. Se vários servidores estiverem sendo executados na mesma máquina, talvez este valor seja adequado, mas em servidores dedicados, este limite pode ser aumentado.

Do outro lado da moeda, alguns sistemas permitem que processos individuais abram muitos arquivos; se mais que uns poucos processos fizerem isto, o limite para todo o sistema poderá ser facilmente excedido. Se desconfiar que isto está acontecendo, e não quiser alterar o limite para todo o sistema, pode ser definido o parâmetro de configuração max_files_per_process do PostgreSQL, limitando o consumo de arquivos abertos.

Outro limite do núcleo que pode ser preocupante ao oferecer suporte para muitas conexões de clientes é o comprimento máximo da fila de conexões de soquete. Se chegar mais do que este número de solicitações de conexão em um período muito curto, algumas solicitações poderão ser rejeitadas antes que o servidor PostgreSQL possa atendê-las, com estes clientes recebendo erros de falha de conexão pouco úteis, como Recurso temporariamente indisponível ou Conexão recusada. O limite padrão para o tamanho da fila é 128 em muitas plataformas. Para aumentar, deve-se ajustar o parâmetro do núcleo apropriado através do sysctl, e depois reiniciar o servidor PostgreSQL. O parâmetro recebe vários nomes diferentes net.core.somaxconn no Linux, kern.ipc.soacceptqueue em versões mais recentes do FreeBSD, e kern.ipc.somaxconn no macOS e em outras variantes do BSD.

18.4.4. Sobrecarga de memória do Linux #

O comportamento padrão para memória virtual no Linux não é o ideal para o PostgreSQL. Devido à maneira como o núcleo implementa a sobrecarga (overcommit) de memória, o núcleo poderá fechar o processo postmaster do PostgreSQL (o processo supervisor do servidor), se a memória exigida pelo PostgreSQL, ou por outro processo, fizer com que o sistema fique sem memória virtual.

Se isto acontecer, será vista uma mensagem do núcleo parecida com a mostrada a seguir (consulte na documentação e configuração do sistema onde procurar por esta mensagem):

Out of Memory: Killed process 12345 (postgres).

Esta mensagem indica que o processo postgres foi encerrado devido à falta de memória. Embora as conexões de banco de dados existentes continuem a funcionar normalmente, nenhuma nova conexão será aceita. Para recuperar, o PostgreSQL precisa ser reiniciado.

Uma maneira de evitar este problema é executar o PostgreSQL em uma máquina onde se tenha certeza de que outros processos não deixarão a máquina sem memória. Se a memória for pouca, aumentar o espaço de troca (swap) do sistema operacional pode ajudar a evitar o problema, porque o terminador por falta de memória (out-of-memory killer, ou OOM killer) é chamado somente quando a memória física e o espaço de troca estão esgotados.

Se o próprio PostgreSQL for o causador da falta de memória do sistema, este problema poderá ser evitado mudando sua configuração. Em alguns casos, a diminuição dos valores dos parâmetros de configuração relacionados à memória pode ajudar, principalmente shared_buffers, work_mem e hash_mem_multiplier. Em outros casos, o problema pode ser causado por permitir muitas conexões com o servidor de banco de dados. Em muitos casos, pode ser melhor reduzir max_connections e, em vez conectar diretamente, usar um software de pool de conexões (connection-pooling) externo.

É possível modificar o comportamento do núcleo para que não sobrecarregue a memória. Embora a configuração a seguir não impeça completamente que o OOM killer seja chamado, diminui muito as chances, portanto, levando a um comportamento mais robusto do sistema. Isto é feito selecionando o modo de overcommit estrito via sysctl

sysctl -w vm.overcommit_memory=2

ou colocando uma entrada equivalente no arquivo /etc/sysctl.conf. Pode-se, também, querer modificar a configuração relacionada vm.overcommit_ratio. Para obter detalhes veja a documentação do núcleo em overcommit handling modes.

Outra abordagem, que pode ser usada com ou sem alterar vm.overcommit_memory, é definir o valor de Ajuste de pontuação do OOM (OOM score adjustment) específico do processo, para o processo postmaster, como -1000, garantindo assim que não será alvo do OOM killer. A maneira mais simples de fazer isto é executar

echo -1000 > /proc/self/oom_score_adj

no script de inicialização do PostgreSQL, logo antes de executar o postgres. Note que esta ação deve ser realizada como usuário root, caso contrário não terá efeito; portanto, um script de inicialização pertencente ao usuário root é o local mais fácil para fazer isto. se isto for feito, também deverão ser definidas as seguintes variáveis ​​de ambiente no script de inicialização antes de executar o postgres:

export PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
export PG_OOM_ADJUST_VALUE=0

Estas configurações farão com que os processos filhos do postmaster sejam executados com o ajuste de pontuação OOM normal de zero, para que o OOM killer ainda possa atingi-los quando for necessário. Pode ser usado algum outro valor para PG_OOM_ADJUST_VALUE se desejar que os processos filho sejam executados com algum outro ajuste de pontuação OOM. (PG_OOM_ADJUST_VALUE também pode ser omitido, caso em que o padrão é zero.) Se PG_OOM_ADJUST_FILE não for definida, os processos filho serão executados com o mesmo ajuste de pontuação OOM que o postmaster, o que não faz sentido, porque o objetivo principal é garantir que o postmaster tenha uma configuração preferencial.

18.4.5. Páginas de memória enormes (huge pages) no Linux #

O uso de páginas enormes reduz a sobrecarga ao usar grandes blocos contíguos de memória, o que PostgreSQL faz, principalmente quando são usados valores grandes para shared_buffers. Para usar este recurso no PostgreSQL, é necessário um núcleo com CONFIG_HUGETLBFS=y e CONFIG_HUGETLB_PAGE=y. Também é necessário configurar o sistema operacional para fornecer páginas enormes suficientes para o tamanho desejado. O parâmetro calculado em tempo de execução shared_memory_size_in_huge_pages indica o número de páginas enormes necessárias. Este parâmetro pode ser visto antes de iniciar o servidor com um comando postgres, como:

$ postgres -D $PGDATA -C shared_memory_size_in_huge_pages
3170
$ grep ^Hugepagesize /proc/meminfo
Hugepagesize:       2048 kB
$ ls /sys/kernel/mm/hugepages
hugepages-1048576kB  hugepages-2048kB

Neste exemplo, o padrão é 2 MB, mas também pode ser solicitado explicitamente 2 MB ou 1 GB configurando huge_page_size para adaptar o número de páginas calculado por shared_memory_size_in_huge_pages. Embora precisemos de pelo menos 3170 páginas enormes neste exemplo, uma configuração maior seria apropriada se outros programas na máquina também precisassem de páginas enormes. Pode-se configurar isto com:

# sysctl -w vm.nr_hugepages=3170

Não se deve esquecer de adicionar esta configuração ao arquivo /etc/sysctl.conf para que ela seja reaplicada após reinicializações. Para tamanhos de página muito grandes que não sejam o padrão, pode-se usar:

# echo 3170 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

Também é possível fornecer estas configurações durante a inicialização usando parâmetros do núcleo como hugepagesz=2M hugepages=3170.

Às vezes, o núcleo não consegue alocar o número desejado de páginas enormes imediatamente devido à fragmentação, portanto, pode ser necessário repetir o comando ou reiniciar o sistema operacional. (Imediatamente após o reinício, a maior parte da memória da máquina deve estar disponível para ser convertida em páginas enormes.) Para verificar a situação de alocação de páginas enorme para um determinado tamanho, deve-se usar:

$ cat /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

Também pode ser necessário dar permissão ao usuário do sistema operacional do servidor de banco de dados para usar páginas enormes definindo vm.hugetlb_shm_group via sysctl, e/ou dar permissão para bloquear a memória com ulimit -l.

O comportamento padrão para páginas enormes no PostgreSQL é usá-las quando possível, com o tamanho de página enorme padrão do sistema, e retornar às páginas normais em caso de falha. Para forçar o uso de páginas enormes, pode ser definido huge_pages como on no arquivo postgresql.conf. Deve-se observar que com esta configuração, o PostgreSQL falha ao iniciar quando não há páginas enormes suficientes disponíveis.

Para uma descrição detalhada do recurso de páginas enormes no Linux, veja hugetlbpage.txt.



[110] Sysctl é um meio de configurar certos aspectos do núcleo (kernel) em tempo de execução. Fonte: Documentation for /proc/sys. (N. T.)