A extensão pg_profile coleta snapshots de estatísticas de atividade do banco de dados em intervalos agendados e gera relatórios de desempenho em HTML. Use-a para identificar instruções SQL que consomem muitos recursos e otimizar o desempenho do banco de dados no ApsaraDB RDS for PostgreSQL.
Como funciona
O pg_profile utiliza uma arquitetura com dois bancos de dados:
Banco de dados servidor: banco de dados monitorado. Executa pg_stat_statements e pg_stat_kcache para expor estatísticas de consultas.
Banco de dados de perfil: gerencia o monitoramento. Conecta-se ao banco de dados servidor, obtém snapshots de estatísticas via dblink e os armazena localmente. Gere relatórios de desempenho a partir deste banco de dados.
O banco de dados de perfil e o banco de dados servidor podem ser executados na mesma instância RDS ou em instâncias separadas.
Pré-requisitos
Antes de começar, verifique se você tem:
-
Uma instância ApsaraDB RDS for PostgreSQL executando PostgreSQL 10 ou posterior
O PostgreSQL 17 não é suportado.
-
Versão secundária do mecanismo 20230830 ou posterior. Se a instância já tiver o pg_profile instalado de uma versão anterior, ele continuará funcionando. Para instalar o pg_profile pela primeira vez ou reinstalá-lo, atualize a versão secundária do mecanismo para a versão mais recente.
ImportantePara padronizar o gerenciamento de extensões e proteger dados relacionados, o RDS planeja restringir extensões vulneráveis nas iterações de versões secundárias do mecanismo. Para obter detalhes, consulte [[Alterações do produto/Alterações de recursos] Limites na criação de extensões para instâncias do ApsaraDB RDS for PostgreSQL](https://www.alibabacloud.com/help/en/rds/apsaradb-rds-for-postgresql/limits-on-the-creation-of-the-pg-cron-extension).
Uma conta privilegiada na instância
Observações de uso
O pg_profile requer o pg_stat_statements. Instale-o antes do pg_profile. Opcionalmente, instale também o pg_stat_kcache para coletar estatísticas de E/S no nível do kernel.
Snapshots consomem espaço em disco. O pg_profile inclui um mecanismo de limpeza automática; monitore o uso do disco e ajuste as configurações de retenção conforme necessário.
Cada snapshot leva tempo para ser concluído. Colete snapshots uma ou duas vezes por hora.
Instalar e desinstalar o pg_profile
Execute as seguintes instruções com uma conta privilegiada:
-- Install
CREATE EXTENSION pg_profile;
-- Uninstall
DROP EXTENSION pg_profile;
Configurar o monitoramento
Esta seção orienta a configuração de um banco de dados servidor chamado server e um banco de dados de perfil chamado profile na mesma instância RDS. Os mesmos passos se aplicam quando os bancos de dados estão em instâncias separadas — apenas os parâmetros de conexão diferem.
Configurar o banco de dados servidor
Execute as seguintes instruções com uma conta privilegiada.
-
Crie o banco de dados servidor.
CREATE DATABASE server; -
Conecte-se ao banco de dados servidor e instale as extensões necessárias.
Tanto o pg_stat_statements quanto o pg_stat_kcache devem ser carregados na inicialização do banco de dados. Adicione ambos ao parâmetro shared_preload_libraries antes de criar essas extensões. O pg_stat_kcache depende do pg_stat_statements, portanto, ambos devem estar presentes no shared_preload_libraries . Para obter instruções, consulte Definir parâmetros .
\c server CREATE EXTENSION pg_stat_statements; CREATE EXTENSION pg_stat_kcache; -
Verifique se as extensões foram instaladas.
\dxSaída esperada:
Name | Version | Schema | Description --------------------+---------+------------+------------------------------------------------------------------------ pg_stat_kcache | 2.2.1 | public | Kernel statistics gathering pg_stat_statements | 1.9 | public | track planning and execution statistics of all SQL statements executed ...
Configurar o banco de dados de perfil
Execute as seguintes instruções com uma conta privilegiada.
-
Crie o banco de dados de perfil.
CREATE DATABASE profile; -
Conecte-se ao banco de dados de perfil e instale as extensões necessárias.
\c profile CREATE EXTENSION plpgsql; CREATE EXTENSION dblink; CREATE EXTENSION pg_profile; -
Verifique se as extensões foram instaladas.
\dxSaída esperada:
Name | Version | Schema | Description ------------+---------+------------+-------------------------------------------------------------- dblink | 1.2 | public | connect to other PostgreSQL databases from within a database pg_profile | 4.0 | public | PostgreSQL load profile repository and report builder plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language ...
Registrar a conexão do banco de dados servidor
No banco de dados de perfil, registre o banco de dados servidor como alvo de monitoramento. Execute a seguinte instrução com uma conta privilegiada.
SELECT create_server('server', 'host=<host> dbname=server port=<port> user=<user> password=<password>');
|
Parâmetro |
Exemplo |
Descrição |
|
|
|
Endpoint da instância RDS onde o banco de dados servidor é executado. Consulte a tabela abaixo para valores por topologia de rede. |
|
|
|
Nome do banco de dados servidor. |
|
|
|
Porta da instância RDS onde o banco de dados servidor é executado. Execute |
|
|
|
Nome de usuário da conta privilegiada para a instância do banco de dados servidor. |
|
|
|
Senha da conta. |
Valores de host por topologia de rede:
|
Topologia |
**Valor para |
|
Mesma instância RDS |
|
|
Instâncias diferentes, mesma virtual private cloud (VPC) |
Endpoint interno da instância do banco de dados servidor |
|
Instâncias diferentes, VPCs diferentes |
Endpoint público da instância do banco de dados servidor. A instância do banco de dados de perfil deve ser configurada com um NAT gateway e um endereço IP público. |
Para obter os endpoints internos e públicos de uma instância, consulte Visualizar e modificar o endpoint e o número da porta de uma instância .
Saída esperada:
show_servers
---------------------------------------------------------------------------------------
(local,"dbname=profile port=3002",t,)
(server,"host=127.0.0.1 dbname=server port=3002 user=test_user password=****",t,)
(2 rows)
Criar uma conexão de servidor também cria uma conexão local que representa o próprio banco de dados de perfil. É possível visualizá-la na saída acima.
Configurar a conexão do banco de dados de perfil
Após a criação da conexão local, configure suas credenciais. Execute a seguinte instrução com uma conta privilegiada.
SELECT set_server_connstr('local','host=127.0.0.1 dbname=profile port=<port> user=<user> password=<password>');
|
Parâmetro |
Exemplo |
Descrição |
|
|
|
Defina como |
|
|
|
Nome do banco de dados de perfil. |
|
|
|
Porta da instância do banco de dados de perfil. Execute |
|
|
|
Nome de usuário da conta privilegiada para a instância do banco de dados de perfil. |
|
|
|
Senha da conta. |
Coletar snapshots e gerar relatórios
Coletar um snapshot
No banco de dados de perfil, execute take_sample() para coletar um snapshot de todos os servidores registrados. Use uma conta privilegiada.
SELECT take_sample();
Saída esperada:
take_sample
-------------------------
(server,OK,00:00:00.52)
(local,OK,00:00:00.51)
(2 rows)
Colete pelo menos dois snapshots antes de gerar um relatório — o relatório cobre a atividade entre dois pontos de snapshot.
Visualizar snapshots coletados
SELECT * FROM show_samples('server');
Exemplo de saída:
sample | sample_time | sizes_collected | dbstats_reset | bgwrstats_reset | archstats_reset
--------+------------------------+-----------------+---------------+-----------------+-----------------
1 | 2022-09-30 02:14:07+00 | t | | |
2 | 2022-09-30 02:16:59+00 | t | | |
3 | 2022-09-30 02:17:58+00 | t | | |
Gerar um relatório
Um relatório cobre a atividade entre dois snapshots — especifique os números de amostra inicial e final.
Opção 1: Via psql no banco de dados de perfil
\o report_2_3.html
SELECT get_report('server',2,3);
Opção 2: Via interface de linha de comando (CLI)
psql -Aqtc "SELECT profile.get_report('server',2,3)" \
-o report_server_2_3.html \
-d profile \
-h <endpoint of the profile database instance> \
-p 5432 \
-U <privileged account of the profile database instance>
Ambos os métodos exportam o relatório como um arquivo HTML para sua máquina local.
Automatizar a coleta de snapshots
Use o pg_cron para executar take_sample() conforme um agendamento. Colete snapshots uma ou duas vezes por hora para capturar intervalos significativos sem gerar excesso de dados.