Todos os produtos
Search
Central de documentação

PolarDB:Cache global de metadados (Global Cache)

Última atualização: Jun 28, 2026

O Global Cache transfere os caches de metadados por processo do PostgreSQL para a memória compartilhada. Assim, todos os processos leem as mesmas entradas de cache em vez de manter cópias privadas. Essa abordagem reduz o consumo total de memória e diminui o risco de erros de falta de memória (OOM) em clusters com muitas conexões ou grande volume de objetos de banco de dados.

Pré-requisitos

Este recurso exige o PolarDB for PostgreSQL executando o PostgreSQL 14 com versão secundária do mecanismo 2.0.14.8.11.0 ou posterior.

Verifique a versão atual no console ou execute:

SHOW polardb_version;

Se a versão não atender ao requisito, atualize a versão secundária do mecanismo. Para obter instruções, consulte Gerenciamento de versões.

Funcionamento do Global Cache

O PostgreSQL aloca caches de metadados separados para cada processo de backend:

  • RelCache (Relation Descriptor Cache): armazena descritores de relações, incluindo metadados de tabelas, visualizações, índices e tabelas TOAST. O acesso ao RelCache ocorre em todas as etapas do processamento SQL, como leitura de definições de colunas, estruturas de índice e layouts de tabelas particionadas. Uma falha de cache aciona uma varredura nos catálogos do sistema para carregar os dados na memória. No PostgreSQL nativo, o RelCache não possui mecanismo de evicção: após o primeiro acesso, as entradas permanecem até o encerramento do processo. Se uma operação DDL modificar os metadados de uma tabela, ela transmitirá uma mensagem de invalidação de cache e o RelCache removerá a entrada invalidada da memória.

  • CatCache/SysCache (System Catalog Cache): armazena tuplas dos catálogos do sistema. O SysCache, construído sobre o CatCache, expõe uma interface chave-valor (KV) para consultas rápidas, como resolver um nome a partir de um identificador de objeto (OID) ou encontrar a contagem de parâmetros de uma função. Uma falha de cache carrega os dados dos catálogos do sistema. Os processos de carregamento e invalidação do CatCache são quase idênticos aos do RelCache.

Como o RelCache e o CatCache são privados para cada processo, o consumo de memória aumenta conforme o número de conexões e objetos de banco de dados. Cada nova conexão aloca sua própria cópia de todas as entradas de cache acessadas. Com alto volume de conexões ou esquemas com muitas tabelas, visualizações e índices, essa sobrecarga por processo pode esgotar a memória disponível e gerar erros OOM.

O Global Cache resolve esse problema ao colocar ambos os caches na memória compartilhada, onde todos os processos leem e gravam as mesmas entradas. O Global Cache inclui:

  • Global RelCache: cache compartilhado de descritores de relações que substitui o RelCache por processo.

  • Global CatCache: cache compartilhado de catálogo do sistema que substitui o CatCache/SysCache por processo.

Configure o Global Cache

O Global Cache vem ativado por padrão. Os parâmetros a seguir controlam seu comportamento.

Ative ou desative o Global Cache

Parâmetro

Nível

Padrão

Descrição

polar_enable_global_catcache

PGC_USERSET

on

Ativa ou desativa o Global CatCache. Defina como off para desativar.

polar_enable_global_relcache

PGC_USERSET

on

Ativa ou desativa o Global RelCache. Defina como off para desativar.

Dimensionar o Global Cache

Parâmetro

Nível

Padrão

Intervalo

Descrição

polar_sgc_max_size

PGC_POSTMASTER

72 MB

0 a INT_MAX

Memória total alocada para o Global Cache. A alteração deste parâmetro exige reinicialização.

polar_global_catcache_size

PGC_SIGHUP

32 MB

0 a polar_sgc_max_size

Memória alocada para o Global CatCache.

polar_global_relcache_size

PGC_SIGHUP

32 MB

0 a polar_sgc_max_size

Memória alocada para o Global RelCache.

Observações sobre dimensionamento:

  • Defina polar_sgc_max_size com um valor maior que a soma de polar_global_catcache_size e polar_global_relcache_size. Parte da memória alocada é reservada para estruturas internas de gerenciamento, como tabelas hash.

  • Ajuste polar_global_catcache_size e polar_global_relcache_size online sem reinicialização, desde que os novos valores não excedam polar_sgc_max_size.

  • Mantenha capacidade suficiente no cache. Quando o cache está cheio e a evicção é acionada, as entradas removidas precisam ser recarregadas do disco no próximo acesso, causando E/S extra e degradação de desempenho.

  • Reduza um cache ativo com cautela. Diminuir o tamanho do cache enquanto o banco de dados está em execução força a evicção das entradas existentes. Execute essa operação durante períodos de baixo tráfego.

Monitorar o Global Cache

A extensão polar_global_cache fornece todas as visualizações de monitoramento. Instale-a uma vez por banco de dados:

CREATE EXTENSION polar_global_cache;

Diagnosticar problemas de capacidade

O indicador mais importante é a ocorrência de evicção. Quando nevict, nevict_active ou nevict_fail apresentam valores diferentes de zero, o cache está subdimensionado. Nesse cenário, a política Least Recently Used (LRU) remove entradas e os acessos subsequentes exigem carregamento de dados do disco, o que aumenta a E/S e degrada o desempenho das consultas.

Para verificar se há evicção:

SELECT cache_name, nevict, nevict_active, nevict_fail
FROM polar_global_cache_stat;

Se qualquer métrica de evicção for diferente de zero, aumente o tamanho do cache ajustando polar_global_catcache_size ou polar_global_relcache_size.

Para avaliar a taxa de acerto do cache, use nlookup e nlookup_miss da mesma visualização:

SELECT cache_name,
       nlookup,
       nlookup_miss,
       round((1 - nlookup_miss::numeric / nullif(nlookup, 0)) * 100, 2) AS hit_rate_pct
FROM polar_global_cache_stat;

A taxa de acerto pode ficar baixa logo após a inicialização, enquanto o cache aquece. Depois que a carga de trabalho atingir o estado estacionário, uma taxa de acerto baixa combinada com métricas de evicção diferentes de zero indica que o cache está subdimensionado.

Estatísticas do Global Cache

Consulte polar_global_cache_stat para visualizar estatísticas agregadas do Global RelCache e do Global CatCache:

SELECT * FROM polar_global_cache_stat;

Exemplo de saída:

-[ RECORD 1 ]----+----------------
cache_name       | Global CatCache
elems            | 2805
nlookup          | 74233
nlookup_miss     | 43576
ninsert          | 9478
nmove            | 0
ndelete          | 0
ninvalidate      | 35843
nflush           | 1
nevict           | 0
nevict_active    | 0
nevict_fail      | 0
lru_active_len   | 402
lru_inactive_len | 2403
data_allocator   | 2
meta_allocator   | 1
component_id     | 1
-[ RECORD 2 ]----+----------------
cache_name       | Global RelCache
elems            | 95
nlookup          | 1203
nlookup_miss     | 1005
ninsert          | 265
nmove            | 0
ndelete          | 0
ninvalidate      | 4404
nflush           | 1
nevict           | 0
nevict_active    | 0
nevict_fail      | 0
lru_active_len   | 3
lru_inactive_len | 92
data_allocator   | 3
meta_allocator   | 1
component_id     | 2

Descrições das métricas:

Métrica

Descrição

elems

Número atual de entradas no cache.

nlookup

Total de consultas ao cache.

nlookup_miss

Total de consultas sem acerto no cache. Use este valor com nlookup para calcular a taxa de acerto.

ninsert

Quantidade de entradas inseridas no cache.

nmove, ndelete

Entradas movidas ou excluídas durante o dimensionamento online do cache.

ninvalidate

Entradas de cache invalidadas, por exemplo, por operações de Data Definition Language (DDL).

nflush

Vezes em que todo o cache foi limpo, acionado por uma mensagem especial de invalidação ou por um comando como DROP DATABASE.

nevict

Total de entradas removidas pela política LRU. Valores diferentes de zero indicam que o cache está subdimensionado.

nevict_active

Entradas removidas da lista LRU ativa.

nevict_fail

Tentativas de evicção com falha devido à entrada estar em uso ou a um conflito de concorrência. Ignore esses valores.

lru_active_len

Entradas na lista LRU ativa.

lru_inactive_len

Entradas na lista LRU inativa. As entradas inativas são removidas primeiro.

Estatísticas de cache local (visualização por processo)

A visualização polar_cache_stat relata estatísticas dos caches privados por processo (RelCache e CatCache). Embora mostre dados de cache privado, os resultados agregam informações de todos os processos.

SELECT * FROM polar_cache_stat;

Exemplo de saída:

-[ RECORD 1 ]-+--------------
cache_name    | Proc CatCache
nlookup       | 779844
nlookup_miss  | 82390
ninsert       | 150876
ndelete       | 139690
ninvalidate   | 74231
nevict        | 126474
nevict_active | 1808
evict_fail    | 0
-[ RECORD 2 ]-+--------------
cache_name    | Proc RelCache
nlookup       | 295183
nlookup_miss  | 4632
ninsert       | 25968
ndelete       | 3277
ninvalidate   | 8856
nevict        | 0
nevict_active | 0
evict_fail    | 0

Essas métricas representam um subconjunto daquelas em polar_global_cache_stat. Consulte as descrições de métricas acima.

Estatísticas do Global CatCache

A visualização polar_global_catcache_stat fornece estatísticas por índice de cache para o Global CatCache, com campos _clist adicionais para objetos CatList. O CatCache contém dois tipos de objeto: CatTuple e CatList. As métricas _clist rastreiam operações específicas do CatList e geralmente podem ser ignoradas.

SELECT * FROM polar_global_catcache_stat;

Exemplo de saída:

-[ RECORD 1 ]-------+----
elems               | 34
nlookup             | 853
nlookup_miss        | 852
ninsert             | 34
nmove               | 0
ndelete             | 0
ninvalidate         | 0
nflush              | 0
nevict              | 0
nevict_active       | 0
nevict_fail         | 0
nlookup_clist       | 41
nlookup_miss_clist  | 41
ninsert_clist       | 0
nmove_clist         | 0
ndelete_clist       | 0
ninvalidate_clist   | 0
nevict_clist        | 0
neivct_active_clist | 0
rehash_fail         | 0
meta_alloc_fail     | 0
data_alloc_fail     | 0
lru_active_len      | 0
lru_inactive_len    | 34
component_id        | 1

Estatísticas do CatCache local

A visualização polar_catcache_stat mostra estatísticas privadas do CatCache para a sessão atual. As métricas são um subconjunto daquelas em polar_global_catcache_stat com os mesmos significados.

SELECT * FROM polar_catcache_stat;

Exemplo de saída:

-[ RECORD 1 ]------+-----
nlookup            | 2060
nlookup_miss       | 898
ninsert            | 883
ndelete            | 753
ninvalidate        | 0
nevict             | 753
nevict_active      | 2
evict_fail         | 0
nlookup_clist      | 41
nlookup_miss_clist | 41
ninsert_clist      | 41
ndelete_clist      | 41

Estatísticas do Global RelCache

A visualização polar_global_relcache_stat mostra estatísticas do Global RelCache.

SELECT * FROM polar_global_relcache_stat;

Exemplo de saída:

-[ RECORD 1 ]----+-----
elems            | 61
nlookup          | 930
nlookup_miss     | 836
ninsert          | 221
nmove            | 0
ndelete          | 0
ninvalidate      | 4344
nflush           | 1
nevict           | 0
nevict_active    | 0
nevict_fail      | 0
meta_alloc_fail  | 0
data_alloc_fail  | 0
lru_active_len   | 3
lru_inactive_len | 58
component_id     | 2

Estatísticas do RelCache local (sessão atual)

A visualização polar_relcache_stat mostra estatísticas do RelCache apenas para a sessão atual.

SELECT * FROM polar_relcache_stat;

Exemplo de saída:

-[ RECORD 1 ]-+-------
nlookup       | 293458
nlookup_miss  | 4535
ninsert       | 20239
ndelete       | 3277
ninvalidate   | 8856
nevict        | 0
nevict_active | 0
evict_fail    | 0