...

bcc tools em ação: guia prático para a engenharia de desempenho em Linux com eBPF

Vou mostrar, passo a passo, como eu ferramentas bcc utilizo o eBPF para identificar e resolver rapidamente os pontos de estrangulamento nos servidores Linux. Para tal, recorro a fluxos de trabalho práticos, meço as latências reais no kernel e relaciono eventos da CPU, das E/S e da rede para formar uma claro Análise das causas.

Pontos centrais

  • eBPF proporciona um rastreio aprofundado com uma sobrecarga reduzida.
  • ferramentas bcc abrangem a CPU, as E/S, a rede e os processos.
  • Próximo da produção Pode ser utilizado sem alterações na aplicação.
  • Lista de controlo com dez ferramentas para começar.
  • Segurança através do Verifier e de políticas claras.

Por que razão o eBPF é importante para a engenharia de desempenho do Linux

Eu pego no eBPF, porque pretendo medir os eventos do kernel de forma segura, seletiva e com muito pouca sobrecarga. As ferramentas clássicas apresentam valores totais, mas raramente explicam por que razão os threads ficam em espera, os pacotes são reenviados ou a E/S fica bloqueada; o eBPF preenche esta lacuna com concretos Eventos. Os programas são executados no kernel, o Verifier verifica-os previamente e posso iniciá-los sem reiniciar o sistema. Desta forma, correlaciono as chamadas do espaço do utilizador com os percursos do kernel e obtenho uma visão geral que permite otimizações imediatas. Quem quiser aprofundar o tema encontrará uma visão geral na minha breve introdução à Análise de desempenho do eBPF, que descreve a interação entre o rastreamento e a observabilidade.

O que são as ferramentas BCC e onde as posso encontrar?

O cco As ferramentas são programas de diagnóstico prontos a usar, baseados em eBPF, e encontram-se normalmente em /usr/share/bcc/tools. Executo-as diretamente no shell, obtenho saídas padrão claras e não preciso de alterar as minhas aplicações. A coleção abrange processos, chamadas de sistema, sistemas de ficheiros, E/S em bloco, rede, agendador e análise de desempenho, sendo assim adequada para produtivo Análises. Como ativo o rastreio de forma seletiva, o impacto é reduzido e os erros de medição decorrentes da monitorização são mínimos. Para casos mais complexos, complemento as ferramentas com o meu próprio eBPF ou utilizo adicionalmente perfis de amostragem.

Instalação e requisitos

Vou instalar o cco Ferramentas disponíveis através do gestor de pacotes (bcc-tools ou bpfcc-tools) nas distribuições mais comuns. São necessários um kernel com suporte a eBPF (a partir da versão 4.x, de preferência 4.9+), funções BPF ativadas e direitos suficientes para carregar os programas. Em servidores de produção, verifico previamente as capacidades eBPF do kernel e da distribuição num ambiente de teste, para que as medições posteriores fiável funcionam. Evito perfis de segurança que bloqueiem completamente o eBPF através de políticas adequadas. As instruções concisas sobre a configuração e a utilização fornecem uma visão geral prática sobre Ferramentas de análise eBPF.

Antes do arranque: verificações do sistema e de segurança

Antes de efetuar medições na produção, verifico as capacidades básicas do anfitrião. Desta forma, evito erros iniciais e obtenho resultados reproduzíveis.

  • Verificar as funcionalidades do kernel: uname -r e funções BPF disponíveis (por exemplo, através do Feature-Check). São importantes os kprobes/tracepoints, o BTF (para informações de tipo estáveis) e os eventos perf.
  • Direitos e políticas: Asseguro-me de que apenas os utilizadores autorizados possam carregar o eBPF (CAP_BPF/CAP_SYS_ADMIN ou política equivalente) e de que os perfis LSM não bloqueiem o carregamento.
  • Parâmetros do sistema: kernel.unprivileged_bpf_disabled está normalmente ativo em ambientes produtivos. Por isso, trabalho deliberadamente a partir de sessões seguras e com um registo de auditoria claro.
  • Caminhos transparentes: Considero que diretórios como /sys/kernel/debug/tracing e /sys/fs/bpf em vista, para eliminar artefactos após as medições.

Esta rigorosa higiene garante que eu realize medições de forma precisa e reproduzível – sem efeitos colaterais.

Guia prático: As primeiras dez ferramentas

Para uma verificação rápida do desempenho, sigo uma sequência fixa. Desta forma, consigo identificar com clareza as causas relacionadas com a CPU, as E/S ou a rede e decidir se devo analisar mais detalhadamente as pilhas ou os tempos de resposta. A tabela apresenta a função principal das ferramentas e a questão que procuro esclarecer com elas. Inicialmente, mantenho o tempo de execução curto e repito as medições assim que tenho uma suspeita confirmar quero. Assim, evito pontos cegos e não perco tempo em situações urgentes Incidentes.

Ferramenta Observado Pergunta típica
execsnoop Novos processos Quem cria empregos de curta duração que geram encargos?
opensnoop Abertura de ficheiros Que caminhos são constantemente abertos ou registados?
ext4 mais lento (xfs*, btrfs*, zfs*) Operações FS lentas Quais são as chamadas que apresentam latências elevadas por volume?
biolaticência Distribuição de E/S em bloco Existem picos de latência esporádicos ou persistentes?
biosnoop Pedidos de E/S individuais Que processo é que deixa certos dispositivos fora de serviço?
cachestat Comportamento da cache de páginas Vale a pena aumentar a memória RAM ou a aplicação apresenta falhas?
tcpconnect Novas ligações TCP Quem recorre a que serviço e com que frequência?
tcpaccept Ligações aceites Quais são os sockets do servidor que estão sob carga elevada?
tcpretrans Retransmissões A perda de pacotes indica que os percursos são instáveis?
runqlat Latências do agendador Os threads estão a esperar demasiado tempo pelo tempo de CPU?

Também utilizo perfis para detetar pontos críticos no espaço do utilizador ou do kernel e agregar pilhas de chamadas. Desta forma, identifico expressões regulares dispendiosas, controladores ineficientes ou spinlocks, que corrijo no código ou na configuração. Utilizo intervalos de amostragem curtos e comparo várias execuções, para que os valores atípicos visível . Esta combinação de visão geral e aprofundamento poupa-me muito tempo de análise. Em seguida, testo novamente a otimização com a mesma carga.

Extensão: tornar visíveis as operações fora da CPU, os bloqueios e os tempos de espera

Nem toda a latência elevada está relacionada com a CPU. Muitas vezes, os threads „fora da CPU“ ficam à espera de operações de E/S, bloqueios ou ativações. Nesses casos, as ferramentas e perfis bcc complementares podem ajudar:

  • Análise fora da CPU: Mido durante quanto tempo os threads não estão na CPU e quais as pilhas que conduzem até lá. Isto permite distinguir o tempo de cálculo do tempo de espera e identifica os bloqueios.
  • Contendência de bloqueios: analiso especificamente os bloqueios críticos do kernel e do espaço do utilizador. Tempos de espera prolongados ou elevados níveis de contendência indicam pontos de serialização que procuro eliminar (por exemplo, através de sharding, maior granularidade ou outras estruturas de dados).
  • Caminhos de ativação: as latências entre „foi ativado“ e „está novamente em execução“ revelam problemas de agendamento e de prioridade ou conjuntos de trabalhadores demasiado grandes.

Estabeleço uma correlação entre estes sinais e runqlat e biolaticência, para distinguir entre causas relacionadas com a memória, com as E/S e com o agendador.

Higiene das medições: filtros, duração, limiares

Para que as medições eBPF continuem a ser reprodutíveis, sigo três regras básicas:

  • De forma sucinta e direta: inicialmente, deixo as ferramentas a funcionar apenas por um curto período de tempo (por exemplo, 10 a 30 segundos) e concentro-me nos PIDs, contentores ou sockets suspeitos.
  • Definir limiares: Nas ferramentas „*slower“, filtro as pequenas latências para reduzir o ruído e ver apenas as chamadas problemáticas.
  • Limitar a taxa: Utilizo filtros seletivos (por exemplo, nome do processo, TIDs, portas) para manter baixas as taxas de eventos. Desta forma, a sobrecarga permanece mínima e evito a perda de eventos.

Só quando vejo um padrão é que prolongo o período de vigência ou alargo o âmbito. Desta forma, consigo limpo e amostras fiáveis.

Cenário prático 1: Carga da CPU inexplicavelmente elevada

Se o indicador da CPU apresentar valores elevados de forma constante, começo por execsnoop, para detetar processos de curta duração. Em seguida, utilizo o `runqlat` para medir quanto tempo os threads esperam pelo tempo de CPU e verifico se as filas de execução estão sobrecarregadas ou se as prioridades estão mal definidas. Se os tempos de espera se tornarem evidentes, reduzo o número de trabalhadores, alterei os conjuntos de threads ou distribuo as tarefas Cron de forma a que o agendador agarrar pode. Com o profile, recolho stacks e identifico os verdadeiros pontos críticos nas bibliotecas e no meu próprio código. Só depois de reunir estas informações é que tomo decisões sobre limites, recolha de lixo, afinidades ou opções do compilador.

Cenário prático 2: Latências de E/S e aplicações lentas

Se os utilizadores se queixarem de travamentos com baixa utilização da CPU, verifico com ext4 mais lento Chamadas lentas ao sistema de ficheiros por processo. Em seguida, utilizo o biolatency para analisar a distribuição dos tempos de E/S de blocos por dispositivo, com o objetivo de identificar picos esporádicos ou estrangulamentos persistentes. O `biosnoop` mostra-me se um único serviço está a gerar um número excessivo de pequenas gravações, provocando assim um acúmulo na fila que atrasa outros processos. Com o `cachestat`, verifico se o cache de páginas está a acertar ou se há falhas dominar e se mais RAM ajudaria. No final, sou eu que decido se as gravações em lote, os buffers maiores ou a mudança para um armazenamento mais rápido valem a pena.

Cenário prático 3: Caminhos de rede e microsserviços

Em ambientes distribuídos, começo por tcpconnect, para medir o estabelecimento de ligações entre serviços. Depois, verifico com o `tcpaccept` quais são os sockets do servidor que recebem um número particularmente elevado de entradas e se os limites do lado do listener estão a ser aplicados. O `tcpretrans` deteta reenvios e distingue problemas de transporte de erros de aplicação, antes de ajustar os tempos de espera e as tentativas de reenvio. Com estes três indicadores, consigo perceber se a rede, a aplicação ou um serviço a montante é o responsável pela Latência executa. Em seguida, ajusto as estratégias de backoff, os valores de keepalive, as definições do balanceador de carga e os tamanhos dos buffers.

Segurança operacional e fiabilidade do eBPF

Só estou a carregar confiável Utilizo ferramentas e testo os meus próprios programas eBPF primeiro no ambiente de teste. O Kernel-Verifier bloqueia programas com erros, mas eu defino ainda limites adicionais para maps e buffers, para que a memória permaneça devidamente limitada. Guardo os registos para acompanhar o comportamento e os efeitos secundários e para poder intervir rapidamente, se necessário. As políticas definem quem pode carregar eBPF, para que o controlo permaneça com a equipa da plataforma e os requisitos de segurança sejam cumpridos. Estas regras garantem que o rastreio em ambientes de produção Fiável mantém-se e não traz surpresas.

Ambientes de contentores e Kubernetes

Nos contentores, separo os problemas sistemáticos dos efeitos específicos dos pods. Para isso, filtro as medições por cgroup, namespace ou intervalo de PID. Muitas ferramentas bcc permitem filtrar por nome ou ID de processo; em alternativa, faço as medições no anfitrião e atribuo os eventos às cargas de trabalho por meio do cgroup. Importante:

  • Espaço de nomes PID: os PIDs diferem entre o anfitrião e o contentor. Eu mapeio os IDs ou filtro por nomes de processos/portas.
  • Quotas de recursos: a limitação da CPU através das quotas do CFS manifesta-se em longos tempos de espera, mesmo sem a utilização total do sistema. Percebo isso através de runqlat em combinação com métricas de quotas.
  • Espaços de nomes de rede: Nas análises de sockets, presto atenção ao espaço de nomes correto. Faço as medições na interface do anfitrião e estabeleço a correlação com os IPs e as portas dos pods.

Desta forma, os resultados das medições mantêm a sua validade, mesmo quando muitas cargas de trabalho estão a ser executadas em simultâneo.

Integração em pilhas de observabilidade

Não vou substituir o meu sistema de monitorização, vou complementá-lo com eBPF. As ferramentas da bcc proporcionam-me a profundidade, enquanto os sistemas de métricas, os registos e o APM mostram a amplitude; em conjunto, criam uma imagem coerente. Quando necessário, encaminho os traços da bcc para pipelines de registos, aciono instantâneos em caso de incidentes e documento as conclusões com a equipa. Para perfis pontuais, utilizo a amostragem em complemento às linhas temporais das métricas, para que as anomalias tangível será. Quem preferir utilizar scripts como complemento, encontrará em bpftrace no alojamento uma forma simples de responder a perguntas pontuais com miniscripts.

Obstáculos frequentes – e como os contornar

  • Vizinho ruidoso: tarefas individuais geram uma carga de curta duração, mas intensa. execsnoop mais perfis Estes padrões revelam-se de forma fiável; defino-lhes um intervalo de tempo ou isolo-os através de quotas.
  • NUMA e afinidades: as latências elevadas, apesar de haver núcleos livres, indicam acessos entre NUMA. Estou a verificar as afinidades da CPU, a atribuição de memória e a distribuição de IRQ.
  • Pontos críticos de IRQ/SoftIRQ: a carga da rede pode saturar os núcleos ksoftirqd. Estou a monitorizar as retransmissões, a distribuir os IRQs através de RSS/filas e a ajustar o RPS/XPS.
  • Efeitos da cache de páginas: os arranques a frio parecem mais lentos. Tenho em conta as fases de aquecimento e comparo cachestat-Valores antes e depois da carga.
  • Atualizações do kernel: os Kprobes podem sofrer alterações em saltos de versão. Prefiro pontos de rastreio estáveis, testo-os antecipadamente e mantenho um conjunto mínimo à disposição.

Processos de trabalho que deram bons resultados

  • Instantâneo do incidente: execução combinada de 60 a 120 segundos (execsnoop, runqlat, biolatency, tcpretrans, profile). Depois, concentro-me no subsistema que se destaca.
  • Rotina de referência: medições breves semanais em percursos-chave (por exemplo, perfil de armazenamento e de rede). Desta forma, consigo detetar desvios numa fase precoce.
  • Validação das alterações: Antes e depois das alterações de configuração, comparo os mesmos pontos de medição para quantificar o efeito.

Engenharia contínua do desempenho do Linux

Encaro a performance como um processo contínuo, e não como Ação pontual. No CI/CD, integro verificações curtas baseadas em eBPF para detetar regressões numa fase inicial e impedi-las antes da implementação. Durante as janelas de manutenção, avalio percursos típicos sob carga, estabeleço valores de referência e documento intervalos de latência aceitáveis. Desta forma, deteto rapidamente desvios e evito ter de adivinhar durante a resolução de incidentes, uma vez que dispongo de dados comparativos disponível. Esta rotina contribui diretamente para a disponibilidade, o controlo de custos e a experiência do utilizador.

Mini-estudo de caso: Do sintoma à causa em 12 minutos

Um cluster de API está a registar um aumento nas latências de 99p, mantendo-se o RPS inalterado. Inicio um instantâneo do incidente: tcpconnect não apresenta anomalias no estabelecimento da ligação, tcpretrans mantém-se baixo – mas a rede, ao que parece, não. runqlat indica tempos de espera curtos, mas frequentes; perfis mostra os pontos de acesso numa serialização JSON. Paralelamente, observo com cachestat uma queda nas taxas de acertos da cache durante os picos. A correlação sugere: muitas cargas pequenas, que são serializadas de forma sincronizada e gravadas imediatamente.

Verifico com ext4 mais lento, que mostra fsyncs com a duração de vários milissegundos no mesmo volume para o processo da API; biolaticência Confirma picos esporádicos na fila no dispositivo afetado. Medida corretiva: agrupamento das gravações, buffer maior e esvaziamento assíncrono em pontos menos sensíveis. Após a implementação, as latências de 99p diminuem em 35 %, a taxa de acertos na cache recupera-se e runqlat apresenta novamente distribuições estreitas.

Resumo para a prática

Com cco Com as ferramentas e o eBPF, consigo obter rapidamente uma visão clara sobre a CPU, as E/S e a rede, sem alterar as aplicações. A lista de verificação composta por execsnoop, opensnoop, ext4slower, biolatency, biosnoop, cachestat, tcpconnect, tcpaccept, tcpretrans e runqlat constitui um ponto de partida coerente. Como complemento, utilizo o `profile` para identificar pontos críticos e otimizar os percursos de código. Através de políticas, registos e limites bem definidos, a intervenção no kernel mantém-se seguro e compreensível. Quem aplicar este método de forma consistente resolve os problemas de desempenho mais rapidamente, planifica melhor as capacidades e reduz os custos por pedido.

Artigos actuais