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 |
|
|
PGC_USERSET |
|
Ativa ou desativa o Global CatCache. Defina como |
|
|
PGC_USERSET |
|
Ativa ou desativa o Global RelCache. Defina como |
Dimensionar o Global Cache
|
Parâmetro |
Nível |
Padrão |
Intervalo |
Descrição |
|
|
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. |
|
|
PGC_SIGHUP |
32 MB |
0 a |
Memória alocada para o Global CatCache. |
|
|
PGC_SIGHUP |
32 MB |
0 a |
Memória alocada para o Global RelCache. |
Observações sobre dimensionamento:
Defina
polar_sgc_max_sizecom um valor maior que a soma depolar_global_catcache_sizeepolar_global_relcache_size. Parte da memória alocada é reservada para estruturas internas de gerenciamento, como tabelas hash.Ajuste
polar_global_catcache_sizeepolar_global_relcache_sizeonline sem reinicialização, desde que os novos valores não excedampolar_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 |
|
|
Número atual de entradas no cache. |
|
|
Total de consultas ao cache. |
|
|
Total de consultas sem acerto no cache. Use este valor com |
|
|
Quantidade de entradas inseridas no cache. |
|
|
Entradas movidas ou excluídas durante o dimensionamento online do cache. |
|
|
Entradas de cache invalidadas, por exemplo, por operações de Data Definition Language (DDL). |
|
|
Vezes em que todo o cache foi limpo, acionado por uma mensagem especial de invalidação ou por um comando como |
|
|
Total de entradas removidas pela política LRU. Valores diferentes de zero indicam que o cache está subdimensionado. |
|
|
Entradas removidas da lista LRU ativa. |
|
|
Tentativas de evicção com falha devido à entrada estar em uso ou a um conflito de concorrência. Ignore esses valores. |
|
|
Entradas na lista LRU ativa. |
|
|
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