...

Utilizar o MySQL Performance Schema de forma eficaz para obter um melhor desempenho

Para melhor Desempenho do MySQL Utilizo o Performance Schema para analisar dados de tempo de execução relativos a consultas, esperas, bloqueios, memória e E/S diretamente através de SQL. Desta forma, consigo identificar mais rapidamente as causas por trás das instruções lentas e tomar medidas específicas para Afinação e monitorização a partir de [2][3][15].

Pontos centrais

Os pontos-chave que se seguem ajudam-me a utilizar o Performance Schema de forma eficaz.

  • Ativação e uma configuração simplificada com instrumentos e consumidores adequados
  • Resumos de declarações utilizar para identificar padrões dispendiosos e pontos críticos
  • Eventos de espera, analisar em conjunto os bloqueios e as entradas/saídas para identificar os verdadeiros pontos de estrangulamento
  • Esquema do Sys como abreviatura de perspetivas rápidas e úteis para a tomada de decisões
  • Iterativo Fluxo de trabalho: medir, isolar, alterar, medir novamente

Ativar o Performance Schema e configurá-lo de forma adequada

Primeiro verifico se performance_schema está ativado, uma vez que as versões atuais do MySQL normalmente vêm com esta opção ativada [1][12]. Se não estiver presente, defino no [mysqld]-Bloco do my.cnf a variável performance_schema=ON e reinicio o servidor. Depois, configuro os instrumentos e os consumidores de forma específica, em vez de deixar tudo no máximo permanentemente. Concentro-me em declaração/%, wait/% e os percursos de E/S relevantes, para que eu possa recolher dados significativos sem sobrecarga desnecessária [6]. Para uma nova série de medições, esvazio as tabelas de histórico em questão e começo com uma Base.

Resultados rápidos com o Sys-Schema

Para ter uma visão geral rápida, recorro frequentemente ao sys-Schema, porque agrupa de forma útil os dados brutos do Performance Schema [13]. Assim, consigo identificar em poucos minutos as consultas que representam a maior parte do tempo de execução. Começo pelas instruções mais importantes, verifico as vistas de E/S de ficheiros e analiso os resumos de espera dos threads. Assim que identifico um ponto crítico, volto às tabelas de dados brutos e aprofundo a análise. Quem analisar os planos de consulta pode, com as medidas adequadas, Dicas do Optimizer frequentemente percetíveis já num curto espaço de tempo Ganhos alcançar.

Escolher os instrumentos e os consumidores adequados

Começo de forma abrangente, mas mantenho a observação sob controlo: em primeiro lugar, ativo os mais importantes Instrumentos para instruções, tempos de espera e E/S; depois, desativo tudo o que não forneça informações úteis [6]. Elementos como o histórico de eventos e as tabelas de resumo têm de apoiar as questões a que pretendo responder. Se se tratar, por exemplo, de picos de latência, consulto resumo_de_esperas_de_eventos_globais_por_nome_de_evento e compara isso com resumo_das_declarações_sobre_eventos_por_resumo. Se ocorrerem tempos de espera de E/S, verifico resumo_do_ficheiro_por_nome_do_evento e resumo_das_esperas_de_E/S_por_tabela. Esta seleção específica mantém os custos gerais baixos e, mesmo assim, proporciona resultados fiáveis Dados.

Resumos de instruções: Detetar padrões, reduzir a carga

Com os resumos de instruções, consigo ver quais os padrões que são consistentemente dispendiosos, mesmo que as consultas individuais contenham literais variáveis [17]. Ordeno os resultados por tempo total, número de execuções e latência média, para definir prioridades. Para tal, recorro também ao Analisar o registo de consultas lentas volto atrás para não deixar escapar valores atípicos raros. Quando os resumos revelam picos, verifico os índices, as estratégias de JOIN e a ordem dos filtros com EXPLICAR. Em seguida, confirmo o efeito através de novas medições no Performance Schema, para que as otimizações continuem a ser mensuráveis.

Interpretar eventos de espera, bloqueios e E/S

Quando há consultas em espera, consulto as tabelas «Wait» e «Lock» para identificar a verdadeira Causa pode ser encontrado [3]. Se houver muitos threads a executarem-se nas mesmas tabelas, isso indica table_lock-Aguardo a ocorrência de concorrência. Se os eventos de E/S de ficheiros apresentarem latências elevadas, verifico o armazenamento e o cache, bem como os padrões de consulta com varreduras de grande escala. Se detetar bloqueios de linha do InnoDB, analiso os registos mais acedidos, a duração das transações e a cobertura dos índices. Só quando estas peças do puzzle se encaixarem é que intervenho nos parâmetros do servidor, no esquema ou no código.

Monitorização da memória: Memória e pool de buffer

Para resolver problemas de memória, analiso em conjunto as tabelas de memória e a utilização do buffer do InnoDB. Se a necessidade de memória de componentes específicos aumentar, ajusto os limites e verifico se os caches estão a reter dados incorretos. Se o cache do InnoDB não for suficiente, aumentei a sua proporção ou melhorei a localização das consultas. Quem quiser aprofundar o assunto pode consultar Otimizar o buffer pool obter ganhos significativos em termos de latência. Confirmo o efeito com os Resumo- Analisar as tabelas e verificar se os acertos LRU e os tempos de espera de E/S estão a evoluir na direção certa.

Fluxo de trabalho de diagnóstico iterativo para o dia-a-dia

Trabalho sempre em ciclos bem definidos, para não perder tempo e para que as alterações continuem a ser mensuráveis [3]. Primeiro, reproduzo o problema sob uma carga controlada. Depois, recolho os valores medidos em algumas tabelas específicas e isolo os candidatos mais evidentes. Em seguida, alterei aquilo que promete maior benefício: índice, consulta, parâmetro ou código. Por fim, voltei a medir e documentei brevemente Antes/depois-Tabelas, para que a equipa veja imediatamente o impacto.

Exemplos de consultas: dos dados brutos às decisões

Para as questões mais comuns, anotei alguns trechos concisos de SQL que utilizo diretamente no meu dia-a-dia. A tabela apresenta exemplos que utilizo frequentemente e o que cada um deles significa. Ajusto filtros como LIMITE ou ORDER BY consoante o caso em questão. O importante é: primeiro a hipótese, depois uma avaliação específica e uma decisão clara. É assim que mantenho a análise focada e evito o supérfluo Carga.

Tabela(s) do esquema de desempenho Objetivo Colunas importantes Exemplo de consulta
resumo_das_declarações_sobre_eventos_por_resumo Encontrar amostras caras digest_text, count_star, sum_timer_wait SELECT digest_text, count_star, sum_timer_wait/1e12 AS sec_total FROM performance_schema.events_statements_summary_by_digest ORDER BY sec_total DESC LIMIT 10;
resumo_de_esperas_de_eventos_globais_por_nome_de_evento Pontos críticos de espera nome_do_evento, sum_timer_wait SELECT event_name, sum_timer_wait/1e12 AS sec_total FROM performance_schema.events_waits_summary_global_by_event_name ORDER BY sec_total DESC LIMIT 10;
resumo_das_esperas_de_E/S_por_tabela Verificar a E/S das tabelas esquema_do_objeto, nome_do_objeto, read_timer_wait SELECT object_schema, object_name, (read_timer_wait+write_timer_wait)/1e12 AS sec_total FROM performance_schema.table_io_waits_summary_by_table ORDER BY sec_total DESC LIMIT 10;
resumo_da_memória_global_por_nome_do_evento Identificar aplicações que consomem muita memória nome_do_evento, current_alloc SELECT event_name, current_alloc/1024/1024 AS mb FROM performance_schema.memory_summary_global_by_event_name ORDER BY mb DESC LIMIT 10;

Operações de produção: minimizar os custos gerais, maximizar o impacto

Em sessões ao vivo, não ativo instrumentos às cegas, mas seleciono apenas aquilo que responde à minha pergunta [6]. Trato os eventos de alta frequência com cuidado e mantenho as janelas de histórico curtas. Para observações mais longas, prefiro resumos condensados e guardo instantâneos externamente. Presto atenção à entrada em performance_schema_setup_consumers, para que eu possa controlar as coleções em vez de as deixar a funcionar por si só. Este enfoque mantém a análise eficaz e protege o servidor.

Ajuste fino: instrumentos e consumidores de configuração na prática

Para obter rapidamente resultados fiáveis, configuro os instrumentos e os consumidores de forma específica. São particularmente importantes declaração/%, wait/%, wait/io/% e – se necessário – selecionados memory/%-caminhos. Começo por ativar apenas o estritamente necessário e, depois, vou ampliando à medida que surgem questões concretas que ainda não foram respondidas. Os temporizadores no esquema de desempenho medem em picossegundos; para obter valores em segundos, divido as colunas de latência por 1e12.

Ponto de partida típico durante a execução:

-- Ativar instrumentos-chave
UPDATE performance_schema.setup_instruments
  SET ENABLED='YES', TIMED='YES'
  WHERE NAME LIKE 'statement/%'
 OR NAME LIKE 'wait/io/%'
 OR NAME LIKE 'wait/lock/%';

-- Selecionar consumidores importantes
UPDATE performance_schema.setup_consumers
  SET ENABLED='YES'
  WHERE NAME IN ('global_instrumentation',
 'thread_instrumentation',
 'statements_digest',
 'events_statements_current',
                 'events_statements_history',
 'events_waits_current',
 'events_waits_history');

-- Esvaziar os resumos para uma nova série de medições
TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
TRUNCATE TABLE performance_schema.events_waits_summary_global_by_event_name;
TRUNCATE TABLE performance_schema.table_io_waits_summary_by_table;

Quando preciso de análises de memória, ativo-as seletivamente memory/%-Instrumentos. Isso implica mais custos gerais, mas compensa em caso de fugas de memória ou de forte pressão sobre o alocador.

Dimensões: Compreender o utilizador, o host e o esquema

Os picos de potência nem sempre são globais, mas sim limitados a determinados Utilizador, Anfitriões ou um Esquema limitado. Para tal, o Performance Schema fornece resumos por conta e por host. Além disso, incluí no resumo a coluna nome_do_esquema, para delimitar os pontos críticos por base de dados.

Exemplos que utilizo frequentemente:

  • Esquemas principais por duração total: SELECT schema_name, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_statements_summary_by_digest GROUP BY schema_name ORDER BY sec_total DESC LIMIT 10;
  • Utilizadores/anfitriões que causam maior latência (por contas): SELECT user, host, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_statements_summary_by_account_by_event_name GROUP BY user, host ORDER BY sec_total DESC LIMIT 10;
  • Threads com maior tempo de espera: SELECT thread_id, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_waits_summary_by_thread_by_event_name GROUP BY thread_id ORDER BY sec_total DESC LIMIT 10;

Com estas visualizações, separo segmentos de tráfego de forma específica e posso limitar o tráfego, armazenar em cache ou implementar variantes de consultas por cliente.

Tornar visíveis as transações longas e os bloqueios de metadados

As transações de longa duração ou inativas bloqueiam os pontos de verificação, a purga e as operações DML concorrentes. Por isso, verifico regularmente a vista das transações e as esperas MDL:

  • Transações ativas: SELECT thread_id, timer_wait/1e12 AS sec_running, state FROM performance_schema.events_transactions_current ORDER BY sec_running DESC LIMIT 10;
  • Detetar bloqueios de metadados (concorrência DDL/DML): SELECT event_name, SUM(sum_timer_wait)/1e12 AS sec_total FROM performance_schema.events_waits_summary_global_by_event_name WHERE event_name LIKE 'wait/lock/metadata/sql/mdl%' GROUP BY event_name ORDER BY sec_total DESC;

Se o MDL for predominante, replaneio as janelas DDL, minimizo os tempos de retenção de bloqueios no código (transações mais curtas) e verifico se há AUTOCOMMIT=0- Manter as sessões abertas por um período desnecessariamente longo.

Replicação, cópias de segurança e efeitos colaterais em destaque

Os processos de replicação e cópia de segurança aparecem nas vistas «Waits» e «I/O». É possível identificar os atrasos através do estado dos workers e das esperas de ficheiros. Analiso os eventos dos workers do Applier, do thread SQL e de E/S de ficheiros:

  • Applier-Worker com elevada latência: SELECT worker_id, THREAD_ID, APPLYING_TRANSACTION, APPLYING_STATE FROM performance_schema.replication_applier_status_by_worker;
  • Pontos críticos de E/S de ficheiros durante as cópias de segurança: SELECT event_name, (sum_timer_read+sum_timer_write)/1e12 AS sec_total FROM performance_schema.file_summary_by_event_name ORDER BY sec_total DESC LIMIT 10;

Se detetar pontos de estrangulamento aqui, separo as fases de E/S (por exemplo, windowing, agendador de E/S, limitação de cópias de segurança) ou aumente o número de trabalhadores do aplicador em paralelo, desde que a carga de trabalho seja escalável.

Intervalos de tempo, instantâneos e estratégias de reinicialização

As medições requerem intervalos de tempo bem definidos. Para comparar o „antes“ e o «depois», recorro a reinicializações e instantâneos específicos:

  • Reiniciar os resumos para obter intervalos atualizados: TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
  • Fazer uma cópia de segurança externa do instantâneo: CREATE TABLE IF NOT EXISTS perf_snapshot_digest AS SELECT NOW() AS captured_at, * FROM performance_schema.events_statements_summary_by_digest;
  • Manter janelas de histórico curtas (consumidor), recolher tendências de longo prazo externamente.

Desta forma, posso comparar e documentar com segurança as otimizações ao longo de implementações, alterações de parâmetros ou alterações de esquema.

Gerir a sobrecarga e os requisitos de memória

Um preconceito comum é que o Performance Schema é „demasiado caro“. Na prática, mantenho a sobrecarga baixa através de três medidas: ativar apenas os instrumentos relevantes, manter curtos os consumidores de histórico com elevado tráfego e selecionar os parâmetros de memória adequados. Em caso de elevada variância do digest, aumentei de forma seletiva performance_schema_digests_size bem como – se necessário – performance_schema_max_sql_text_length, para que as identidades se mantenham estáveis. Caso sejam necessários instrumentos de memória, limito-os aos subsistemas problemáticos.

Ajustes típicos em my.cnf:

[mysqld]
performance_schema=ON
performance-schema-instrument='statement/%=ON'
performance-schema-instrument='wait/io/%=ON'
performance-schema-instrument='wait/lock/%=ON'
performance-schema-consumer-events-statements-history=ON
performance-schema-consumer-events-waits-history=ON
# Opcional, se houver muitos padrões:
performance_schema_digests_size=10000
performance_schema_max_sql_text_length=4096

Sempre que faço uma alteração, verifico se a CPU, a latência e a utilização da memória se mantêm estáveis. Assim que o diagnóstico estiver concluído, volto a definir a configuração para o „mínimo operacional“.

Padrões frequentes e soluções rápidas

  • Montante elevado em resumo_das_declarações_sobre_eventos_por_resumo, muitas digitalizações: Verifica os índices, a ordem dos filtros e a capacidade de armazenamento; confirma com EXPLICAR e repito a medição (o tempo de digestão deve diminuir visivelmente).
  • Dominante table_io_waits em poucas tabelas: Melhorar a localização de E/S (acessos a índices agrupados, índices abrangentes), reduzir o volume de dados por instrução e, se necessário, utilizar o processamento em lotes em vez do processamento de tabelas completas.
  • Tempos de espera para wait/lock/innodb/%: Identificar «hot records» e mitigar conflitos de gravação através de transações mais pequenas, índices adequados ou enfileiramento.
  • Muitos wait/lock/metadata/sql/mdl: Planear a janela DDL, ONLINE- dar preferência a operações compatíveis, desacoplar o leitor/gravador através de transações mais curtas.
  • Aumento das reservas em resumo_da_memória_global_por_nome_do_evento: Reajustar limites, restringir de forma seletiva as caches de consultas, identificar componentes problemáticos com memory/% desagregar em pormenor.
  • „Latência “spiky» com valores médios, de resto, normais: Utilizar as visualizações do Sys com percentis e, se necessário, medir separadamente os picos de carga (janela mais restrita, histórico curto, instrumentos específicos).

Correlacionar: Do thread à instrução e à espera

Para estabelecer rapidamente uma correlação entre as causas, associo performance_schema.threads com as tabelas «Current» e «History» para instruções e esperas. Assim, consigo ver o que um thread em questão fez por último e o que está a aguardar. Um resumo conciso:

  1. Pessoas afetadas PROCESSLIST_ID respectivamente THREAD_ID de performance_schema.threads ir buscar.
  2. Última declaração através de histórico_de_declarações_sobre_eventos determinar (de acordo com THREAD_ID e ordenar por hora).
  3. Exclusões de espera paralelas histórico_de_esperas_de_eventos verificar para ver os motivos de bloqueio ou de espera de E/S.

Este padrão „Drilldown & Join“ é o que utilizo habitualmente quando sessões individuais ou pedidos Web ficam desincronizados.

Portas de Qualidade e Desempenho Contínuo

Para garantir que as otimizações não sejam em vão, estabeleço «Quality Gates» simplificados: consultas definidas do Performance Schema são executadas antes e depois de cada lançamento. Guardo instantâneos, comparo indicadores (Top-Digests, Top-Waits, E/S por tabela) e documento os desvios. No CI/CD, adiciono perfis de carga representativos e valores-limite para o 95.º percentil. Se uma métrica sair dos limites, existe um canal de retorno claro: verificar a hipótese, focar as ferramentas, implementar a correção e medir novamente.

Evitar fontes de erro

  • Demasiados instrumentos a longo prazo: O diagnóstico é temporário; em funcionamento normal, mantenha ativo apenas o conjunto mínimo.
  • Períodos de medição mistos: Esvazie os resumos antes de realizar novos testes; caso contrário, os dados antigos comprometem a validade dos resultados.
  • Unidade de tempo incorreta: Os temporizadores estão em picossegundos; de forma coerente ao longo de todo o texto 1e12 partilhar.
  • Enchente de resumos: Os literais variáveis podem quebrar os padrões; normalizar o SQL e performance_schema_max_sql_text_length verificar.
  • Histórico demasiado longo: A elevada frequência de eventos + um histórico extenso geram pressão; manter a janela do histórico curta, instantâneos externos.

Lista de verificação prática

  • Definir a questão, formular a hipótese.
  • Ativar os instrumentos adequados/consumidores, manter os custos gerais baixos.
  • Esvaziar os resumos, selecionar uma janela de medição curta.
  • Verificar os Top-Digests, tempos de espera e E/S; confirmar os pontos críticos.
  • Ajustar de forma específica o índice, a consulta, o código e os parâmetros.
  • Medir novamente, guardar instantâneos, documentar a decisão.
  • Reduzir a configuração ao mínimo operacional.

Em resumo: a minha abordagem na prática

Ativo o Performance Schema de forma direcionada, começo por uma abordagem abrangente e, em seguida, reduzo ao que for mais útil Instrumentos [1][2][12]. Para uma visão geral rápida, recorro ao esquema do sistema e, se necessário, analiso os dados brutos [13]. Abordo primeiro os pontos críticos nos «digests» e nos «wait-events», antes de ajustar os parâmetros [3][15][17]. Em seguida, confirmo cada alteração com novas medições, para que os progressos se mantenham visíveis e reproduzíveis. É assim que garanto resultados fiáveis a longo prazo Tempos de resposta e evito trabalho desnecessário.

Artigos actuais