As filas de recursos permitem controlar como o AnalyticDB for PostgreSQL aloca CPU e memória entre cargas de trabalho concorrentes. Ao agrupar consultas em filas com limites e prioridades definidos, você evita que a contenção de recursos degrade a latência de tarefas sensíveis quando o sistema está sob carga.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma instância do AnalyticDB for PostgreSQL
Uma conta inicial ou uma conta privilegiada com a função
RDS_SUPERUSER
Sem as permissões necessárias, as operações de fila falham com o erroERROR: must be superuser to alter resource queues. Para conceder a funçãoRDS_SUPERUSERa uma função existente, execute:ALTER ROLE role_name WITH RDS_SUPERUSER;
Como funciona
Cada fila de recursos define dois tipos de controle:
Controles de admissão:
ACTIVE_STATEMENTSeMEMORY_LIMITdeterminam se uma consulta entra na fila ou permanece em espera.Controles de execução:
PRIORITYdetermina como a CPU é compartilhada entre as consultas ativas durante a execução. Esse parâmetro não influencia a admissão da consulta na fila.
Ao receber uma consulta, o AnalyticDB for PostgreSQL verifica primeiro os controles de admissão. Se a fila estiver com capacidade máxima, a consulta aguarda. Após a admissão, o compartilhamento de CPU em tempo de execução segue o parâmetro PRIORITY em relação às outras filas ativas.
O parâmetro ACTIVE_STATEMENTS limita o número de consultas executadas simultaneamente em uma fila. Esse limite é independente do número de conexões de banco de dados, gerenciado separadamente.
Crie uma fila de recursos
CREATE RESOURCE QUEUE name WITH (queue_attribute=value [, ...])
Especifique pelo menos um dos parâmetros ACTIVE_STATEMENTS ou MAX_COST. A omissão de ambos retorna:
ERROR: at least one threshold ("ACTIVE_STATEMENTS", "MAX_COST") must be specified
Não crie filas de recursos dentro de um bloco de transação:
ERROR: CREATE RESOURCE QUEUE cannot run inside a transaction block
Parâmetros
|
Parâmetro |
Descrição |
Padrão |
|
|
Número máximo de consultas executadas simultaneamente. Consultas adicionais aguardam até que um slot fique disponível. |
— |
|
|
Memória máxima para todas as consultas ativas combinadas em um único nó de computação. Unidades: KB, MB ou GB. |
|
|
|
Custo máximo da consulta estimado pelo otimizador. |
|
|
|
Válido apenas com |
— |
|
|
Consultas abaixo deste limiar de custo ignoram a fila e são executadas imediatamente. |
— |
|
|
Compartilhamento de CPU em tempo de execução relativo a outras filas. Opções: |
|
Exemplos
Limite consultas concorrentes:
CREATE RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=3);
Adicione um limite de memória:
CREATE RESOURCE QUEUE myqueue WITH (ACTIVE_STATEMENTS=20, MEMORY_LIMIT='2000MB');
Defina alta prioridade:
CREATE RESOURCE QUEUE executive WITH (ACTIVE_STATEMENTS=3, PRIORITY=MAX);
Como funciona a prioridade de CPU
Quando filas com prioridades diferentes têm consultas ativas, o AnalyticDB for PostgreSQL distribui a CPU dinamicamente:
Consultas em filas com a mesma prioridade recebem partes iguais de CPU.
Se filas de alta, média e baixa prioridade estiverem ativas simultaneamente, a fila de alta prioridade recebe 90% da CPU. Os 10% restantes são divididos de modo que a média receba 90% e a baixa, 10%.
Por exemplo, se consultas de relatórios (MEDIUM) estiverem em execução e uma consulta executiva (MAX) for ativada, o AnalyticDB for PostgreSQL transfere imediatamente mais CPU para a fila executiva e reduz o compartilhamento da fila de relatórios.
Substitua a memória para uma única consulta
Use statement_mem para alocar mais memória a uma consulta específica. O valor deve ser menor que MEMORY_LIMIT e max_statement_mem.
SET statement_mem = '1GB';
SELECT * FROM test_adbpg WHERE col = 'adb4pg' ORDER BY id;
RESET statement_mem;
Quais instruções SQL estão sujeitas a filas de recursos
Por padrão, o parâmetro resource_select_only está definido como off no AnalyticDB for PostgreSQL. Portanto, as seguintes instruções estão sujeitas a filas de recursos:
SELECT,SELECT INTO,CREATE TABLE AS SELECT,DECLARE CURSORINSERT,UPDATE,DELETE
Defina resource_select_only como on para restringir o gerenciamento de filas apenas a instruções da família SELECT.
Atribua usuários a uma fila de recursos
Após criar uma fila, atribua usuários a ela. Cada usuário pertence exatamente a uma fila de recursos.
-- Assign a queue when creating a role
CREATE ROLE analyst WITH LOGIN RESOURCE QUEUE reporting;
-- Reassign an existing role
ALTER ROLE analyst RESOURCE QUEUE executive;
Usuários não atribuídos a nenhuma fila são colocados em pg_default , que permite 500 consultas ativas simultâneas sem limites de custo e com prioridade MEDIUM.
Para remover um usuário de uma fila de recursos e devolvê-lo a pg_default:
ALTER ROLE role_name RESOURCE QUEUE none;
Modifique uma fila de recursos
-- Change the active statement limit
ALTER RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=5);
-- Change memory and cost limits
ALTER RESOURCE QUEUE adhoc WITH (MAX_COST=-1.0, MEMORY_LIMIT='2GB');
-- Change priority
ALTER RESOURCE QUEUE adhoc WITH (PRIORITY=LOW);
ALTER RESOURCE QUEUE reporting WITH (PRIORITY=HIGH);
Monitore a atividade da fila
Verifique a configuração de uma fila específica:
SELECT * FROM pg_resqueue WHERE rsqname = 'adhoc';
Exclua uma fila de recursos
DROP RESOURCE QUEUE name;
Não exclua uma fila se ela tiver usuários atribuídos ou consultas em estado de espera. Remova todos os usuários da fila e limpe quaisquer consultas pendentes antes de prosseguir.
Solução de problemas
ERROR: must be superuser to alter resource queues
Causa: A conta atual não tem permissões suficientes.
Solução: Use uma conta inicial ou uma conta privilegiada com a função RDS_SUPERUSER. Alternativamente, conceda RDS_SUPERUSER à conta atual:
ALTER ROLE role_name WITH RDS_SUPERUSER;