Este tópico descreve o recurso de cache de tamanho de tabela do PolarDB for PostgreSQL e do .
Informações básicas
Durante a execução de uma instrução SQL, o banco de dados consulta tabelas de sistema, tabelas de usuário e seus índices diversas vezes. Nesse processo, o PolarDB for PostgreSQL e o utilizam frequentemente a interface smgrnblocks da camada de gerenciamento de armazenamento (smgr) para obter o número de blocos em um arquivo de tabela. A interface smgrnblocks recupera o tamanho do arquivo por meio da interface lseek do sistema de arquivos e calcula a quantidade de blocos com base no tamanho do bloco. Como a interface smgrnblocks está no caminho crítico do processamento de SQL, chamadas frequentes à interface do sistema de arquivos podem afetar severamente o desempenho do banco de dados. No PolarDB for PostgreSQL e no que utilizam o sistema de arquivos distribuído PolarFileSystem (PolarFS), a latência na chamada da interface lseek é muito superior à de um sistema de arquivos local, o que aumenta o tempo de execução das instruções SQL.
Para reduzir as chamadas ao sistema de arquivos, o PolarDB for PostgreSQL e o implementam um cache na camada de gerenciamento de armazenamento para o número de blocos de um arquivo de tabela. Esse cache, denominado Relation Size Cache (RSC), armazena o número de blocos de uma tabela na memória compartilhada. Quando a quantidade de blocos de uma tabela muda, o valor na memória compartilhada é atualizado. As consultas sobre o número de blocos em um arquivo de tabela verificam primeiro o cache, o que diminui as solicitações ao sistema de arquivos e acelera a execução de SQL.
Aplicabilidade
Este recurso é compatível com as seguintes versões do PolarDB for PostgreSQL:
PostgreSQL 18 (versão secundária do mecanismo 2.0.18.0.1.0 ou posterior)
PostgreSQL 17 (versão secundária do mecanismo 2.0.17.2.1.0 ou posterior)
PostgreSQL 16 (versão secundária do mecanismo 2.0.16.3.1.1 ou posterior)
PostgreSQL 15 (versão secundária do mecanismo 2.0.15.7.1.1 ou posterior)
PostgreSQL 14 (versão secundária do mecanismo 2.0.14.12.23.1 ou posterior)
Você pode visualizar o número da versão secundária do mecanismo no console ou executar a instrução SHOW polardb_version;. Caso a versão secundária do mecanismo não atenda ao requisito, atualize a versão secundária do mecanismo.
Introdução ao recurso
Consulta RSC
O RSC consiste em um array unidimensional e uma tabela hash na memória compartilhada:
Cada entrada de cache no array armazena o número de blocos de uma relação (tabela ou índice).
A tabela hash registra o mapeamento entre o identificador exclusivo da camada de armazenamento de uma relação (RelFileNode) e sua entrada correspondente no array.
Todos os processos consultam o RSC utilizando dois níveis de índices:
Índice de nível 1: Armazena em cache o ponteiro e a geração (número da versão) da última entrada de cache do RSC acessada. Se a tabela atual for igual à anterior e a geração da entrada não tiver mudado, o processo obtém diretamente a contagem de blocos da tabela a partir do ponteiro. Em cenários com muitas leituras para uma tabela específica, o índice de nível 1 apresenta alta taxa de acerto. Quando um mapeamento na tabela hash do RSC é modificado, a geração da entrada de cache correspondente é incrementada, invalidando o índice de nível 1.
Índice de nível 2: Quando ocorre uma falha no índice de nível 1, o processo consulta a tabela hash na memória compartilhada para localizar a entrada de cache do RSC da tabela atual. Em seguida, recupera a contagem de blocos e atualiza o índice de nível 1.
Se ambos os níveis de índice não encontrarem a tabela e sua contagem de blocos no RSC, uma evicção de cache é acionada. Um algoritmo Segmented Least Recently Used (SLRU) seleciona uma entrada de cache do RSC menos recentemente utilizada para ser limpa. Depois disso, o sistema chama a interface lseek do sistema de arquivos. A contagem de blocos resultante atualiza a entrada de cache do RSC limpa, e ambos os níveis de índice também são atualizados.
Atualizações do RSC em nós primários e standby
Ao ativar o recurso RSC, as interfaces da camada de gerenciamento de armazenamento que alteram o tamanho de um arquivo de tabela devem também atualizar a entrada de cache correspondente no RSC dentro da memória compartilhada. Isso garante que a contagem de blocos em cache corresponda à contagem real de blocos no sistema de arquivos.
A interface de extensão de arquivo de tabela atualiza a contagem de blocos do arquivo estendido no RSC.
A interface de truncamento de arquivo de tabela atualiza a contagem de blocos do arquivo truncado no RSC.
Os nós standby utilizam replicação física para sincronização com o nó primário. Durante a reprodução do Write-Ahead Log (WAL), eles chamam as mesmas interfaces da camada de gerenciamento de armazenamento para modificar o tamanho dos arquivos de tabela. Consequentemente, o RSC é atualizado da mesma forma que no nó primário.
Atualizações do RSC em nós réplica
Os nós réplica compartilham o armazenamento físico com o nó primário e usam o mecanismo LogIndex para sincronização. Como os nós réplica não gravam no armazenamento, eles não conseguem atualizar os valores de cache do RSC na memória por meio das interfaces da camada de gerenciamento de armazenamento.
Os nós réplica analisam os números de blocos de dados referenciados nos registros WAL e os comparam com a contagem atual de blocos no RSC. Esse processo determina se o tamanho do arquivo no armazenamento compartilhado mudou. Se um número de bloco de um registro WAL for maior que a contagem de blocos atual em cache, o valor do cache RSC é atualizado para a nova contagem. Caso seja analisado um registro WAL indicando truncamento de arquivo, a contagem de blocos em cache no RSC é descartada. O cache é então repovoado na próxima chamada ao sistema de arquivos.
Guia de uso
Parâmetros GUC
Os seguintes parâmetros Grand Unified Configuration (GUC) estão disponíveis para o RSC:
Parameter | Description |
polar_enable_rel_size_cache | Define se o recurso RSC deve ser ativado. Valores válidos:
|
polar_enable_replica_rel_size_cache | Define se o recurso RSC deve ser ativado nos nós réplica. Valores válidos:
|
polar_enable_standby_rel_size_cache | Define se o recurso RSC deve ser ativado nos nós standby. Valores válidos:
|
Teste de desempenho
-
Com o RSC desativado, a latência para solicitar a contagem de blocos de uma tabela de 32 GB é de aproximadamente 55 us:
SHOW polar_enable_rel_size_cache; polar_enable_rel_size_cache ----------------------------- off (1 row) SELECT polar_smgrperf_nblocks(32, true, false); NOTICE: testing logical file length with 32 GB INFO: iops=18341.1/s, lat=54.52us INFO: iops=17504.0/s, lat=57.13us INFO: iops=17960.8/s, lat=55.68us INFO: iops=17973.0/s, lat=55.64us INFO: iops=17603.5/s, lat=56.81us INFO: iops=17403.8/s, lat=57.46us INFO: iops=17506.2/s, lat=57.12us INFO: iops=18061.7/s, lat=55.37us -
Com o RSC ativado, a latência para solicitar a contagem de blocos de uma tabela de 32 GB cai para cerca de 0,07 us:
SHOW polar_enable_rel_size_cache; polar_enable_rel_size_cache ----------------------------- on (1 row) SELECT polar_smgrperf_nblocks(32, true, false); NOTICE: testing logical file length with 32 GB INFO: iops=14155515.6/s, lat=0.07us INFO: iops=13897273.6/s, lat=0.07us INFO: iops=13869926.3/s, lat=0.07us INFO: iops=13779602.7/s, lat=0.07us INFO: iops=14159120.5/s, lat=0.07us INFO: iops=14147065.6/s, lat=0.07us INFO: iops=14124141.9/s, lat=0.07us INFO: iops=14162773.3/s, lat=0.07us