...

Ferramenta Linux Perf – Analisar e resolver gargalos da CPU

Com a ferramenta «linux perf», consigo identificar rapidamente os estrangulamentos da CPU, classificá-los de forma clara e definir medidas específicas para os resolver. Utilizo dados de medição provenientes de Kernel– e no espaço do utilizador, para identificar pontos de congestionamento, reduzir custos e diminuir significativamente os tempos de resposta.

Pontos centrais

As seguintes ideias centrais orientam a minha abordagem e estruturam o trabalho prático com perfeito:

  • Integrado Ferramenta do kernel para a análise fiável do desempenho da CPU sem agentes pesados
  • Limpo Sequência de comandos: list → stat → record → report → top
  • Mais baixo Overhead, o que garante a sua utilização segura em sistemas de produção
  • Mensuráveis Resultados: otimizar, voltar a avaliar, manter apenas as alterações eficazes
  • Orientado para a prática Padrões: falhas de cache, falhas de ramificação, bloqueios, chamadas ao sistema

O que é o Linux Perf – e por que é importante

Eu fixo perfeito porque está diretamente integrado no kernel do Linux e fornece uma interface comum para contadores de hardware, contadores de software e pontos de rastreio. Esta proximidade reduz o Despesas gerais e fornece dados fiáveis mesmo sob carga elevada. A arquitetura separa a lógica de recolha do kernel da ferramenta do utilizador, permitindo-me recolher dados de forma eficiente e analisá-los com flexibilidade. Desta forma, acedo a contadores reais da CPU e monitorizo eventos como ciclos, instruções ou acertos na cache. Desta forma, não tomo decisões técnicas com base em intuições, mas sim com base em valores de medição sólidos.

Detetar atempadamente os pontos de estrangulamento da CPU

Reajo rapidamente, porque respostas lentas, elevada latência e uma carga de trabalho prolongada do núcleo constituem sinais de alerta claros e Escalonamento abrandar. Atrasos percetíveis no acesso às bases de dados e nas tarefas indicam frequentemente algoritmos ineficientes ou uma paralelização incorreta. Os processos em lote dispendiosos também se revelam quando os relatórios demoram mais tempo a ser executados do que o previsto. Através de uma análise minuciosa do desempenho da CPU, identifico essas causas, em vez de aumentar precipitadamente a capacidade de processamento. Isto reduz o consumo de recursos e estabiliza o Desempenho sustentável.

O fluxo de trabalho com o perf: da visão geral ao ponto crítico

Sigo uma ordem definida para passar de uma visão geral para o obstáculo específico e Causas delimitar com segurança. Primeiro, obtenho os indicadores-chave; depois, recolho perfis com pilhas de chamadas e concluo com uma análise focada. Para começar, basta uma medição geral; depois, procuro obter um registo representativo sob carga. Por fim, verifico o comportamento em tempo real, por exemplo, durante uma implementação. A tabela seguinte resume de forma concisa os comandos, o objetivo e exemplos de chamadas, para que os passos e Conclusões manter-se claro.

Subcomando Objetivo Exemplo Conclusão típica
lista de perf Ver eventos disponíveis lista de perf Quais são os contadores relevantes para esta questão
estatística perfeita Visão geral rápida dos indicadores-chave perf stat -a sleep 10 IPC, ciclos e comportamento da cache num relance
registo de desempenho Registar dados de perfilagem sudo perf record -g -F 99 ./myapp Onde é que o tempo de CPU é realmente desperdiçado
relatório de desempenho Analisar os dados registados relatório de desempenho Pontos críticos por funções e gráfico de chamadas
perf top Monitorizar pontos críticos em tempo real sudo perf top Ver imediatamente as alterações sob carga

Selecionar eventos de forma específica: lista perfeita

Começo por lista de perf, para verificar a seleção de eventos relevantes para a CPU e focar as medições. No caso de problemas que exigem muito processamento, observo os ciclos e as instruções; para questões relacionadas com a memória, analiso as referências à cache e as falhas de cache. Nas ramificações, as falhas de ramificação ajudam a identificar previsões erradas. O comando lista de perf mostra os contadores disponíveis, dependendo da CPU e do kernel, o que me permite fazer uma seleção específica. Assim, não meço tudo, mas apenas o que a minha Pergunta respondido.

Verificação rápida do estado: como interpretar corretamente o «perf stat»

Com estatística perfeita faço uma análise geral antes de aprofundar o assunto. Uma chamada como perf stat fornece ciclos, instruções, referências à cache, falhas na cache e o valor do IPC. Um IPC muito baixo pode indicar tempos de espera devido a acessos à memória, enquanto um IPC elevado aponta mais para uma execução ligada ao processamento. A opção -a Tenho isso em conta quando pretendo efetuar medições a nível do sistema, por exemplo, durante picos de tráfego. Assim, consigo perceber rapidamente se um programa está a sobrecarregar a CPU ou se Memória limitado.

Análise detalhada: registo «perf» sem suposições

Para obter informações detalhadas, utilizo registo de desempenho e registe as pilhas de chamadas com -g, para poder ver os percursos de chamada completos. Controlo a frequência de amostragem com -F, cerca de 99 amostras por segundo para intervalos de tempo curtos e significativos. Escolho a análise de desempenho a nível do sistema quando a carga está distribuída por muitos processos e, em seguida, restrinjo a análise a serviços específicos. Exemplo: sudo perf record -F 99 -a -g -- sleep 30 cria um perfil representativo dos picos típicos. Estes dados tornam visíveis os pontos críticos invisíveis e criam Clareza para os próximos passos.

Identificar pontos críticos: perf report e perf top

Com relatório de desempenho analisar o ficheiro perf.data e vejo, por função, a percentagem do tempo de CPU. A visualização do gráfico de chamadas revela quais as cadeias de chamadas que contribuem para a carga. Assinalo as percentagens elevadas como pontos críticos e faço uma distinção cuidadosa entre o meu próprio código, as bibliotecas e as partes do kernel. Para visualizações em tempo real, utilizo perf top, para detetar imediatamente alterações nas implementações ou nas configurações. Desta forma, tomo decisões com base nos dados e reduzo o Risco de otimizações erradas.

Identificar padrões de verdadeiros estrangulamentos

Na prática, vejo padrões recorrentes que associo a perfeito confirmo e resolvo rapidamente. Considero os pontos críticos com elevada carga computacional como candidatos a uma mudança de algoritmo, à utilização de cache ou a bibliotecas mais eficientes. As falhas frequentes no cache indicam acessos aos dados subótimos; abordo este tema com mais pormenor na minha nota sobre Compreender os erros de cache. Muitas falhas de ramificação indicam uma lógica demasiado ramificada, enquanto o tempo excessivo gasto em funções de bloqueio sugere conflitos na paralelização. Se as chamadas de sistema ou as funções do kernel forem predominantes, reduzo a frequência das chamadas, agrupo as operações de E/S e reforço Armazenamento em cache.

A partir de perfis sobre medidas de afinação

Identifico otimizações específicas, em vez de reservar mais núcleos de forma genérica, e garanto que cada alteração seja Métricas . Após a primeira análise de desempenho, ajusto o código, as estruturas de dados ou as configurações e volto a medir imediatamente. Se não houver resultados, descarto a abordagem e testo a hipótese seguinte. Utilizo profiler específicos de linguagem como complemento, quando preciso de uma visão mais aprofundada do tempo de execução ou da recolha de lixo. Este ciclo fechado de medição, intervenção e verificação poupa tempo, reduz os custos em euros e reforça a Estabilidade.

Perf em funcionamento: amostragem, segurança e contentores

Em funcionamento contínuo, escolho uma taxa de amostragem moderada para Carga adicional manter o impacto ao mínimo e, ainda assim, obter perfis significativos. Limito as análises a nível do sistema a intervalos de tempo relevantes, por exemplo, aos picos de tráfego, para não sobrecarregar desnecessariamente o sistema. Defino claramente os direitos de acesso, uma vez que os dados de desempenho permitem obter informações sobre os processos internos. Em ambientes com contentores ou KVM, separo a perspetiva do anfitrião da do convidado e avalio ambas as perspetivas. Para questões relacionadas com a programação, remeto para Alternativas ao SFC, se o planeamento padrão não se adequar à carga e eu quiser testar outras estratégias antes de passar para Código intervenha.

Agendador, mudança de contexto e latência

Para além dos pontos de acesso, presto atenção às mudanças de contexto, porque as mudanças frequentes de contexto abrandam os threads e Latência aumentar. Acompanho a afinidade da CPU, atribuo processos a processos específicos quando necessário e reduzo a criação desnecessária de threads. Planeio os trabalhos em lote de forma a que não agravem os picos de carga. Esta visão geral ajuda-me a fazer uma avaliação fundamentada dos custos de comutação Avaliar a mudança de contexto. Desta forma, mantenho o número de substituições dentro dos limites e garanto uma distribuição uniforme Utilização.

Escolher com cuidado a infraestrutura e a configuração de alojamento

Mesmo um código bem escrito fica prejudicado quando o Hardware se a configuração for insuficiente ou se a configuração não for adequada à carga. Verifico as gerações da CPU, a frequência, as caches e a topologia NUMA antes de proceder ao dimensionamento. Criar reservas no lado do anfitrião proporciona margem para picos de carga e reduz os tempos de espera em percursos críticos. Clases de máquinas uniformes facilitam a comparação de medições e evitam interpretações erradas. Assim, associo a análise ativa de desempenho a um ambiente adequado e poupo mensalmente montantes significativos em euros, em vez de alocar capacidades de forma irrefletida para Comprar.

Garantir a resolução de símbolos e as pilhas de chamadas

Detalhadas Pilhas de chamadas são a base de boas decisões. Asseguro-me de que os ficheiros binários e as bibliotecas incluem informações de depuração (-g) e, sempre que for razoável, os ponteiros de quadro não sejam removidos (-fno-omit-frame-pointer). Para pilhas estáveis, utilizo --call-graph fp, se existirem ponteiros de quadro, ou --call-graph dwarf, se eu preferir o DWARF-Unwinding: perf record -g --call-graph fp -F 99 -- ./myapp. Nas distribuições, instalo os ficheiros adequados informação de depuração-pacotes, para que relatório de desempenho Atribui corretamente os símbolos. Em ambientes de contentores, mantenho os símbolos de depuração acessíveis (por exemplo, através de um volume); caso contrário, os relatórios mostram apenas endereços. Onde as bibliotecas despojado , mantenho um processo de compilação que armazena as informações de depuração separadamente, mas as torna acessíveis. Desta forma, os nomes das funções e as linhas de código-fonte permanecem visíveis e evito ter de adivinhar.

Conceção da medição e reprodutibilidade

Para obter medições fiáveis, é necessário um ambiente limpo Plano experimental. Repito as corridas com perf stat -r 5 -e cycles,instructions,cache-misses --, para verificar a variância, e mantenho as janelas de teste consistentes (mesmos volumes de dados, mesmos perfis de carga). O escalonamento da frequência da CPU influencia os indicadores; por isso, documento o estado do Governor/Turbo e fixo a carga com taskset -c em núcleos fixos. Para comparações isoladas, utilizo núcleos dedicados sem carga de interferência (por exemplo, CPUs isoladas). Separo claramente as fases de aquecimento da janela de medição, para que Caches e os JITs sejam estáveis. Nas medições a nível do sistema, defino -a e define a duração com --timeout ou um que o envolva sleep. Evito intervenções destrutivas (como a limpeza agressiva da cache) em sistemas de produção e documento cada etapa do teste, para que os resultados continuem a ser reproduzíveis.

Aprofundar os conhecimentos sobre análises de memória e NUMA

Mostra IPC para baixo e falhas de cache acima, analiso de forma específica o comportamento da memória. Com registo de desempenho da memória e relatório de desempenho da memória Registo os acessos à memória e consigo associar percursos dispendiosos (por exemplo, falhas de LLC) a funções. Tenho em conta as topologias NUMA, reduzindo os acessos remotos (por exemplo, através do «thread pinning» e da alocação local). Os eventos relevantes incluem, entre outros:. Erros de carga da LLC, falhas de carregamento do dTLB, erros de página (menor/maior) e mem-loads, mem-stores dependendo da CPU. Verifico se as estruturas de dados favorecem o acesso sequencial e se Linhas de cache serem invalidados desnecessariamente. Conjuntos de trabalho excessivamente grandes e aleatórios indicam condições desfavoráveis estruturas de dados; neste caso, o empacotamento estruturado, a divisão quente/fria ou os algoritmos de streaming são úteis. No que diz respeito às bases de dados, tenho em conta os tamanhos dos buffers, THP-Comportamento e efeitos de pré-busca, para reduzir os custos decorrentes de erros.

Analisar com precisão os bloqueios, os agendadores e os tempos de espera

Quando os hotspots em pthread_mutex_lock, futex ou que resultem em spinlocks, separo o tempo de computação de tempo de espera. Com registo de bloqueio de desempenho e relatório de bloqueio de desempenho Identifico os «locks» disputados e os seus tempos de retenção. perf sched timehist fornece informações sobre os atrasos na fila de espera, preempção e cadeias de suspensão/ativação; é assim que detecto se os threads estão à espera de alocação de CPU em vez de estarem a processar. Um número elevado de mudanças de contexto com um tempo de execução curto por fatia indica uma paralelização excessivamente detalhada; aumentei o tamanho dos blocos de trabalho e reduzi a frequência de sincronização. Em cargas de trabalho com grande volume de E/S, regulo os tempos de bloqueio (por exemplo, E/S assíncrona, processamento em lotes) e separo os percursos de leitura/gravação em threads próprias, para que Núcleos de CPU não esperar por dispositivos lentos.

Tornar visíveis as chamadas de sistema e a sobrecarga de E/S

Dominar Chamadas ao sistema ou caminhos do kernel em relatório de desempenho, analiso a frequência de chamadas e a latência. Com rastreio de desempenho observo as chamadas do sistema e identifico padrões de «chatty» (por exemplo, leituras/gravações demasiado pequenas, frequentes stat-Visualizações, muitas epoll_wait-alteração). As medidas incluem o processamento em lotes, estratégias de «zero-copy» e ajustes nos buffers. Frequentes clock_gettime-visualizações ou gettimeofday No Hotloops, substituo por uma amostragem menos frequente. No que diz respeito aos percursos de rede, verifico se os custos de cópia ou de soma de verificação são predominantes e alivio a carga dos percursos mais intensos através de Armazenamento em cache dos parâmetros de ligação ou a agregação de pacotes pequenos. O objetivo é reduzir as transições dispendiosas entre o utilizador e o kernel e obter mais trabalho útil por cada chamada ao sistema.

Contentores, direitos e segurança em pormenor

Nos servidores partilhados, estão Direitos e a visibilidade são fundamentais. Eu defino através de kernel.perf_event_paranoid e kernel.kptr_restrict estabelece limites claros e é utilizado de forma preferencial nos kernels atuais CAP_PERFMON em vez de acesso total. Nos contentores, é necessário perfeito Configuração do anfitrião (por exemplo, através da transmissão dos dispositivos perf_event e das capacidades necessárias); caso contrário, apenas estarão disponíveis eventos limitados. Para medições centradas em contentores, aplico um filtro cgroup para garantir que apenas analiso os processos relevantes e o Despesas gerais reduzo. Os ambientes sensíveis beneficiam dos registos de auditoria e das autorizações obrigatórias, uma vez que os dados de desempenho podem, de facto, revelar processos internos.

Código JIT e código interpretado: pilhas fiáveis

Em JIT-No que diz respeito às linguagens (por exemplo, JVM, .NET, JavaScript) e aos interpretadores, procuro garantir uma boa resolução de símbolos. No caso do Java, guardo os ponteiros de frame nos hotspots, ativo as informações JIT e utilizo mapas JIT, para que perfeito Identifica corretamente os métodos. Algumas instâncias de execução geram perf-PID.map-ficheiros ou jitdump-Artefactos; guardo-os durante a medição e analiso-os com relatório de desempenho respectivamente script perf . No caso do Python e do Ruby, as extensões em C otimizadas são frequentemente pontos críticos; neste contexto, os símbolos de depuração dos módulos nativos fornecem informações decisivas. Sem pilhas fiáveis, corre-se o risco de Falsos pontos de interesse (por exemplo, em trampolins), que podem induzir em erro as otimizações. Por isso, antes de cada campanha, verifico se os stacks para o idioma de destino estão completos e estáveis.

Controlar o Langläufer, o multiplexing e os buffers

Em janelas de gravação longas, evito a perda de dados através de Buffer circular (-m) e taxas de amostragem precisas. As medições de alta frequência podem registar eventos multiplexar, o que dificulta as comparações; medo os indicadores importantes em grupos ou separadamente, para obter conclusões concretas. Analiso os padrões temporais com perf stat -I 1000 -a visível, para ver os indicadores-chave por segundo e, assim, detetar picos de carga ou regressões por implementações. Para obter valores comparáveis, faço um ajuste -F/Períodos de amostragem e verifica se o PMU consegue suportar simultaneamente os eventos selecionados. Um conjunto específico de contadores por execução proporciona resultados mais robustos Tendências do que um cesto de medição a transbordar.

Visualização e colaboração

Apresento os resultados de forma a que as equipas possam aderir rapidamente. perf report --stdio Utilizo-o para instantâneos textuais nos tickets, enquanto as visualizações interativas tornam os percursos de navegação mais acessíveis. Com perf annotate Vou às funções suspeitas e vejo quais as linhas de código-fonte que criam ciclos. Para obter representações sintetizadas, gerio visualizações da pilha a partir de script perf- Dados que mostram a distribuição temporal por cadeia de chamadas e permitem comparar alternativas. diferença de desempenho ajuda-me a comparar objetivamente os perfis «antes» e «depois», para que eu Eficácia com base em dados concretos. Disponibilizo perfis de referência para cada classe de serviço, a fim de detetar regressões numa fase precoce e conduzir discussões com números concretos.

Brevemente resumido

Com linux No perf, trabalho de forma orientada para os objetivos: seleciono eventos, analiso indicadores, recolho perfis, avalio pontos críticos e avalio o impacto. Distingo entre causa e sintoma, classificando com precisão o comportamento da cache, as ramificações, os bloqueios e as chamadas de sistema. As visualizações em tempo real completam a análise, permitindo-me identificar alterações imediatamente e evitar caminhos errados. Mantenho-me atento ao hardware e à programação, para que os dados de análise de desempenho se mantenham fiáveis. É assim que resolvo gradualmente os estrangulamentos da CPU, reduzo os custos em euros e proporciono resultados consistentes Tempos de resposta.

Artigos actuais

O administrador de sistemas analisa os gargalos da CPU nos monitores com a ferramenta Linux Perf
Administração

Ferramenta Linux Perf – Analisar e resolver gargalos da CPU

Aprende a analisar os gargalos da CPU com a ferramenta Linux Perf. Passo a passo, vamos mostrar-te como fazer a análise de desempenho da CPU e o ajuste de desempenho em servidores Linux, com foco na palavra-chave «linux perf».