Documentação do PostgreSQL 8.0.0 | ||||
---|---|---|---|---|
Anterior | Início | Capítulo 23. Monitoramento das atividades do banco de dados | Fim | Próxima |
O coletor de estatísticas do PostgreSQL é um subsistema de apoio a coleta e relatório de informações sobre as atividades do servidor. Atualmente, o coletor pode contar acessos a tabelas e índices em termos de blocos de disco e linhas individuais. Também apóia a determinação exata do comando sendo executado no momento pelos outros processos servidor.
Uma vez que a coleta de estatísticas adiciona alguma sobrecarga à execução do comando, o sistema pode ser configurado para coletar informações, ou não. Isto é controlado por parâmetros de configuração, normalmente definidos no arquivo postgresql.conf (para obter detalhes sobre como definir os parâmetros de configuração deve ser consultada a Seção 16.4 ).
O parâmetro stats_start_collector deve ser definido como true para que o coletor de estatísticas seja ativado. Esta é a definição padrão e recomendada, mas pode ser desativada se não houver interesse nas estatísticas e for desejado eliminar até a última gota de sobrecarga (Entretanto, provavelmente o ganho será pequeno). Deve ser observado que esta opção não pode ser mudada enquanto o servidor está executando.
Os parâmetros stats_command_string, stats_block_level e stats_row_level controlam a quantidade de informação que é enviada para o coletor e, portanto, determinam quanta sobrecarga ocorre em tempo de execução. Determinam se o processo servidor envia para o coletor a cadeia de caracteres do comando corrente, as estatísticas de acesso no nível de bloco de disco, e as estatísticas de acesso no nível de linha, respectivamente. Normalmente estes parâmetros são definidos no arquivo postgresql.conf e, portanto, se aplicam a todos os processos servidor, mas é possível ativá-los ou desativá-los para sessões individuais utilizando o comando SET (Para evitar que os usuários comuns escondam suas atividades do administrador, somente os superusuários podem alterar estes parâmetros através do comando SET).
Nota: Uma vez que o valor dos parâmetros stats_command_string, stats_block_level e stats_row_level são false por padrão, muito poucas estatísticas são coletadas na configuração padrão. Ativar uma ou mais destas variáveis de configuração aumenta, significativamente, a quantidade de dados úteis produzidos pelo coletor de estatísticas, ao custo de uma sobrecarga adicional em tempo de execução.
Estão disponíveis diversas visões pré-definidas para mostrar os resultados das estatísticas coletadas, conforme listado na Tabela 23-1. Como alternativa, podem ser construídas visões personalizadas utilizando as funções de estatísticas subjacentes.
Ao se utilizar as estatísticas para monitorar a atividade corrente, é importante ter em mente que as informações não são atualizadas instantaneamente. Cada processo servidor individual transmite os novos contadores de acesso a bloco e a linha para o coletor logo antes de ficar ocioso; portanto, um comando ou transação ainda em progresso não afeta os totais exibidos. Também, o próprio coletor emite um novo relatório no máximo uma vez a cada pgstat_stat_interval milissegundos (500 por padrão). Portanto, as informações mostradas são anteriores à atividade corrente. A informação do comando corrente é enviada para o coletor imediatamente, mas ainda está sujeita ao retardo de pgstat_stat_interval antes de se tornar visível.
Outro ponto importante é que, quando se solicita a um processo servidor para mostrar uma destas estatísticas, primeiro este busca os relatórios mais recentes emitidos pelo processo coletor, e depois continua utilizando este instantâneo para todas as visões e funções de estatística até o término da transação corrente. Portanto, as estatísticas parecem não mudar enquanto se permanece na transação corrente. Isto é uma característica, e não um erro, porque permite realizar várias consultas às estatísticas e correlacionar os resultados sem se preocupar com números variando por baixo. Se desejar ver novos resultados a cada consulta, certifique-se que as consultas estão fora de qualquer bloco de transação.
Tabela 23-1. Visões de estatísticas padrão
Nome da visão | Descrição |
---|---|
pg_stat_activity | Uma linha por processo servidor, mostrando o ID do processo, o banco de dados, o usuário, o comando corrente e a hora em que o comando corrente começou a executar. As colunas que mostram os dados do comando corrente somente estão disponíveis quando o parâmetro stats_command_string está ativado. Além disso, estas colunas mostram o valor nulo a menos que o usuário consultando a visão seja um superusuário, ou o mesmo usuário dono do processo sendo mostrado (Deve ser observado que devido ao retardo do que é informado pelo coletor, o comando corrente somente será mostrado no caso dos comandos com longo tempo de execução). |
pg_stat_database | Uma linha por banco de dados, mostrando o número de processos servidor ativos, total de transações efetivadas e total de transações canceladas neste banco de dados, total de blocos de disco lidos e total de acertos no buffer (ou seja, solicitações de leitura de bloco evitadas por encontrar o bloco no cache do buffer). |
pg_stat_all_tables | Para cada tabela do banco de dados corrente, o número total de: varreduras seqüenciais e de índice; linhas retornadas por cada tipo de varredura; linhas inseridas, atualizadas e excluídas. |
pg_stat_sys_tables | O mesmo que pg_stat_all_tables, exceto que somente são mostradas as tabelas do sistema. |
pg_stat_user_tables | O mesmo que pg_stat_all_tables, exceto que somente são mostradas as tabelas de usuário. |
pg_stat_all_indexes | Para cada índice do banco de dados corrente, o total de varreduras de índice que utilizaram este índice, o número de linhas do índice lidas, e o número de linhas da tabela buscadas com sucesso (Pode ser menor quando existem entradas do índice apontando para linhas da tabela expiradas) |
pg_stat_sys_indexes | O mesmo que pg_stat_all_indexes, exceto que somente são mostrados os índices das tabelas do sistema. |
pg_stat_user_indexes | O mesmo que pg_stat_all_indexes, exceto que somente são mostrados os índices das tabelas de usuário. |
pg_statio_all_tables | Para cada tabela do banco de dados corrente, o número total de blocos de disco da tabela lidos, o número de acertos no buffer, o número de blocos de disco lidos e acertos no buffer para todos os índices da tabela, o número de blocos de disco lidos e acertos no buffer para a tabela auxiliar TOAST da tabela (se houver), e o número de blocos de disco lidos e acertos no buffer para o índice da tabela TOAST. |
pg_statio_sys_tables | O mesmo que pg_statio_all_tables, exceto que somente são mostradas as tabelas do sistema. |
pg_statio_user_tables | O mesmo que pg_statio_all_tables, exceto que somente são mostradas as tabelas de usuário. |
pg_statio_all_indexes | Para cada índice do banco de dados corrente, o número de blocos de disco lidos e de acertos no buffer para o índice. |
pg_statio_sys_indexes | O mesmo que pg_statio_all_indexes, exceto que somente são mostrados os índices das tabelas do sistema. |
pg_statio_user_indexes | O mesmo que pg_statio_all_indexes, exceto que somente são mostrados os índices das tabelas de usuário. |
pg_statio_all_sequences | Para cada objeto de seqüência do banco de dados corrente, o número de blocos de disco lidos e de acertos no buffer para a seqüência. |
pg_statio_sys_sequences | O mesmo que pg_statio_all_sequences, exceto que somente são mostradas as seqüências do sistema (Atualmente não está definida nenhuma seqüência do sistema e, portanto, esta visão está sempre vazia). |
pg_statio_user_sequences | O mesmo que pg_statio_all_sequences, exceto que somente são mostradas as seqüências de usuário. |
As estatísticas por índice são particularmente úteis para determinar quais índices estão sendo utilizados e quão efetivos são.
As visões pg_statio_ são úteis, principalmente, para determinar a efetividade do cache do buffer. Quando o número de leituras físicas no disco é muito menor do que o número de acertos no buffer, então o cache está respondendo à maioria das solicitações de leitura, evitando chamadas ao núcleo. Entretanto, estas estatísticas não fornecem toda a história: devido à forma como o PostgreSQL trata a E/S em disco, dados que não estão no cache do buffer do PostgreSQL podem estar no cache de E/S do núcleo e, portanto, podem ser lidos sem que haja necessidade de uma leitura física. Os usuários interessados em obter informações mais detalhadas sobre o comportamento de E/S do PostgreSQL, são aconselhados a utilizar o coletor de estatísticas do PostgreSQL em combinação com os utilitários do sistema operacional que permitem analisar o tratamento da E/S pelo núcleo.
Podem ser criadas outras formas de ver as estatísticas, escrevendo consultas que utilizam as mesmas funções subjacentes de acesso às estatísticas utilizadas pelas visões padrão. Esta funções estão listadas na Tabela 23-2. As funções de acesso por banco de dados, recebem como argumento o OID do banco de dados que identifica para qual banco de dados é o relatório. As funções por tabela e por índice recebem o OID da tabela ou do índice, respectivamente (Deve ser observado que somente podem ser vistos por estas funções as tabelas e índices presentes no banco de dados corrente). As funções de acesso por processo servidor recebem o número de ID do processo servidor, que varia de um ao número de processos servidor ativos no momento.
Tabela 23-2. Funções de acesso às estatísticas
Função | Tipo retornado | Descrição |
---|---|---|
pg_stat_get_db_numbackends(oid) | integer | Número de processos servidor ativos conectados ao banco de dados |
pg_stat_get_db_xact_commit(oid) | bigint | Transações efetivadas no banco de dados |
pg_stat_get_db_xact_rollback(oid) | bigint | Transações canceladas no banco de dados |
pg_stat_get_db_blocks_fetched(oid) | bigint | Número de solicitações de busca de blocos de disco para o banco de dados |
pg_stat_get_db_blocks_hit(oid) | bigint | Número de solicitações de busca de blocos de disco para o banco de dados encontradas no cache |
pg_stat_get_numscans(oid) | bigint | Número de varreduras seqüenciais realizadas quando o argumento é uma tabela, ou o número de varreduras de índice quando o argumento é um índice |
pg_stat_get_tuples_returned(oid) | bigint | Número de linhas lidas por varreduras seqüenciais quando o argumento é uma tabela, ou o número de linhas do índice lidas quando o argumento é um índice |
pg_stat_get_tuples_fetched(oid) | bigint | Número de linhas válidas (não expiradas) da tabela buscadas por varreduras seqüenciais quando o argumento é uma tabela, ou buscadas por varreduras de índice, utilizando este índice, quando o argumento é um índice |
pg_stat_get_tuples_inserted(oid) | bigint | Número de linhas inseridas na tabela |
pg_stat_get_tuples_updated(oid) | bigint | Número de linhas atualizadas na tabela |
pg_stat_get_tuples_deleted(oid) | bigint | Número de linhas excluídas da tabela |
pg_stat_get_blocks_fetched(oid) | bigint | Número de solicitações de busca de bloco de disco para a tabela ou índice |
pg_stat_get_blocks_hit(oid) | bigint | Número de solicitações de busca de bloco de disco encontradas no cache para a tabela ou o índice |
pg_stat_get_backend_idset() | conjunto de integer | Conjunto de IDs de processos servidor ativos no momento (de 1 ao número de processos servidor ativos). Veja o exemplo de utilização no texto. |
pg_backend_pid() | integer | ID de processo do processo servidor conectado à sessão corrente |
pg_stat_get_backend_pid(integer) | integer | ID de processo do processo servidor especificado |
pg_stat_get_backend_dbid(integer) | oid | ID de banco de dados do processo servidor especificado |
pg_stat_get_backend_userid(integer) | oid | ID de usuário do processo servidor especificado |
pg_stat_get_backend_activity(integer) | text | Comando ativo do processo servidor especificado (nulo se o usuário corrente não for um superusuário nem o mesmo usuário da sessão sendo consultada, ou se stats_command_string não estiver ativo) |
pg_stat_get_backend_activity_start(integer) | timestamp with time zone | A hora em que o comando executando no momento, no processo servidor especificado, começou (nulo se o usuário corrente não for um superusuário nem o mesmo usuário da sessão sendo consultada, ou se stats_command_string não estiver ativo) |
pg_stat_reset() | boolean | Reinicia todas as estatísticas atualmente coletadas |
Nota: pg_stat_get_db_blocks_fetched menos pg_stat_get_db_blocks_hit fornece o número de chamadas à função read() do núcleo feitas para a tabela, índice ou banco de dados; mas o número verdadeiro de leituras físicas é geralmente menor por causa da "buferização" no nível do núcleo.
A função pg_stat_get_backend_idset fornece uma maneira conveniente de gerar uma linha para cada processo servidor ativo. Por exemplo, para mostrar o PID e o comando corrente de todos os processos servidor:
SELECT pg_stat_get_backend_pid(s.backendid) AS procpid, pg_stat_get_backend_activity(s.backendid) AS current_query FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;