AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 295140
Accepted
Brandon
Brandon
Asked: 2021-07-02 15:02:20 +0800 CST2021-07-02 15:02:20 +0800 CST 2021-07-02 15:02:20 +0800 CST

AWS Aurora PostgreSQL Serverless: como você pré-aquece o buffer compartilhado após o dimensionamento?

  • 772

Estou usando AWS Aurora PostgreSQL Serverlesscom escalonamento automático. Parece que o dimensionamento limpa o buffer compartilhado, então, quando queremos aumentar o desempenho, somos forçados a enfrentar um gargalo de E/S. Após o aquecimento, vemos uma grande melhora no desempenho. No entanto, se executarmos consecutivamente uma vez dimensionados, a segunda execução será muito mais rápida. Embora eu não tenha visto nada específico sobre se o buffer compartilhado é limpo no dimensionamento, tenho quase certeza de que é.

O Aurora Serverless está usando atualmente PostgreSQL 10.14e oferece suporte à pg_prewarmextensão. Parece que a documentação mais recente sugere que o pré-aquecimento suporta o pré-aquecimento automático após a reinicialização do servidor, mas isso é sem servidor e uma versão que não parece mencionar o pré-aquecimento automático na documentação .

Encontrei este post que funciona muito bem para o PostgreSQL ao reiniciar o servidor ou se recuperar de uma falha.

  1. Se pudéssemos pelo menos reter o conteúdo do buffer compartilhado do nó ACU inferior após o dimensionamento, tudo bem.
  2. Se pudéssemos pré-aquecer exatamente o que precisa estar na memória antes do tempo, seria incrível!
  3. Existem certas mesas que são bastante grandes e gostaríamos de pré-aquecer seletivamente as peças que queremos. pg_prewarmsuporta first_blocke last_blockbloqueia números para uma tabela/índice, mas como saber quais valores colocar lá?

Sabemos com antecedência quando é nosso pico e dizemos ao RDS para dimensionar logo antes, então temos uma janela de tempo em que podemos nos preparar.

Quais são minhas opções?

postgresql postgresql-10
  • 2 2 respostas
  • 1198 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2021-07-02T16:41:59+08:002021-07-02T16:41:59+08:00

    Minha resposta não é específica para AWS Aurora PostgreSQL Serverless, mas para Postgres em geral.

    Alternativa simples

    Em seu comentário relacionado, você sugeriu que só precisa de linhas das últimas 24 horas. Então você poderia (sem envolver pg_prewarm) simplesmente:

    SELECT * FROM public.tbl WHERE created_at > now() - interval '24h';
    

    Se created_atestiver indexado e o predicado for seletivo o suficiente, os blocos relevantes de tabela e índice serão pré-aquecidos.

    Como você realmente não deseja recuperar nenhum dado durante o pré-aquecimento, você pode usar PERFORMem uma DOinstrução:

    DO
    $$BEGIN
       PERFORM * FROM public.tbl WHERE created_at > now() - interval '24h';
    END$$;
    

    Mesmo efeito.
    Você pode verificar o sucesso com EXPLAIN (ANALYZE, BUFFERS):

    EXPLAIN (ANALYZE, BUFFERS)
    SELECT * FROM public.tbl WHERE created_at > now() - interval '24h';
    

    Se houver memória cache suficiente disponível, agora você verá apenas buffers de "acertos compartilhados". Curti:

    Buffers: shared hit=123456

    .. onde você veria principalmente "ler" com principalmente cache frio. Curti:

    Buffers: shared hit=143 read=153689

    Basicamente, basta executar as consultas esperadas e o cache será preenchido de acordo.

    pg_prewarm()

    Se você ainda quiser usar pg_prewarm()com números de bloco, também poderá fazer isso. Permite mais opções, como escolher qual cache preencher (sistema operacional ou cache de buffer de banco de dados) ou alguma outra sutileza. O módulo adicional deve ser instalado primeiro, uma vez por banco de dados:

    CREATE EXTENSION pg_prewarm;
    

    Trabalhar com números de bloco só faz sentido se sua tabela estiver (principalmente) fisicamente agrupada na coluna assumida created_at. Esse seria o caso de uma tabela somente leitura (principalmente leitura) em que novas linhas com o carimbo de data/hora atual são anexadas ao final da tabela.

    Você pode obter o número do bloco de uma linha de seu arquivo ctid. Ver:

    • Como decomponho o ctid em números de página e linha?

    Para obter o número do bloco da primeira linha com menos de 24 horas:

    SELECT ctid
    FROM   public.tbl
    WHERE  created_at > now() - interval '24h'
    ORDER  BY created_at
    LIMIT  1;
    

    Você consegue algo como (5759,1). 5759é o número do bloco. Então você pode:

    SELECT pg_prewarm('public.tbl'::regclass, first_block => 5759)
    

    Como deixamos last_blocko padrão NULL, tudo "através do último bloco da relação" será pré-aquecido. (Não o índice, no entanto. Você pode pré-aquecer isso também.)

    A chamada da função é feita com "notação mista" (mistura de "notação posicional" e "notação nomeada"). Ver:

    • Funções com número variável de parâmetros de entrada
    • 6
  2. AdamKG
    2021-07-02T16:36:00+08:002021-07-02T16:36:00+08:00

    Eu acho que você está sem sorte em #1. As notas de lançamento do PG 11 observam a adição desse recurso. E eu não estou familiarizado com Aurora, não tenho nenhuma idéia sobre o número 2.

    Para o número 3, tudo depende de quais são as "peças que queremos". Nos comentários da postagem vinculada, você menciona que, para uma tabela, deseja as últimas 24 horas de dados. Se esta for uma tabela somente de acréscimo, a maneira de obter o número do bloco seria consultar o ctidde uma linha com 24 horas de idade e, em seguida, usar (ctid::text::point)[0]::bigintpara obter o número do bloco inicial - supondo que você tenha um índice no carimbo de data / hora. Em seguida, basta pré-buscar desse bloco para pg_relation_size('schema.table')/current_setting('block_size').

    Se não for uma tabela somente de acréscimo, se você pode pré-buscar apenas as partes que deseja depende inteiramente dos detalhes; sinta-se à vontade para atualizar a pergunta em caso afirmativo.

    • 3

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve