Início topics ebpf O que é eBPF?
Conheça o IBM Instana Observability
Design abstrato representando a atividade do sistema operacional
O que é eBPF?

O Extended Berkeley Packet Filter (eBPF) é uma tecnologia de programação que permite aos desenvolvedores escrever programas eficientes, seguros e não intrusivos executados diretamente no espaço do núcleo do sistema operacional Linux (SO).

Como podem executar programas em áreas restritas (sandbox) em contextos privilegiados, como um kernel de sistema operacional, os eBPFs podem expandir os recursos existentes do software em tempo de execução sem modificar o código-fonte do kernel, carregar módulos do kernel nem interromper a execução geral do programa. As tecnologias eBPF representam uma evolução do Berkeley Packet Filter (BPF) original, que proporcionou uma maneira simples de selecionar e analisar pacotes de rede em um programa no espaço do usuário. Porém, além da filtragem de pacotes, os programas BPF não tinham a flexibilidade necessária para lidar com tarefas mais complexas dentro do kernel.

Reconhecendo a necessidade de uma tecnologia mais versátil, a comunidade Linux desenvolveu o eBPF, baseada nos recursos de back-end do BPF, mas ampliou sua capacidade de programação no kernel. A funcionalidade avançada dos programas eBPF possibilita que os desenvolvedores implementem processos aprimorados de filtragem de pacotes, realizem análises de desempenho de alta qualidade e instalem firewalls e protocolos de depuração em data centers no local e em ambientes nativos da nuvem.

Os avanços da tecnologia eBPF obrigaram os desenvolvedores de software a expandir suas aplicações para todos os sistemas operacionais, para que plataformas não baseadas em Linux pudessem utilizar os sofisticados recursos de rastreamento, rede e monitoramento do eBPF.1 Na verdade, a Fundação eBPF — uma extensão da Linux Foundation cujos membros incluem Google, Meta, Netflix, Microsoft, Intel e Isovalent, entre outros — investiu fortemente na expansão da compatibilidade de sistemas operacionais para programas eBPF, com a finalidade final de ampliar a utilidade da programação eBPF.2

Solicite uma demonstração do Instana

Obtenha uma demonstração do IBM Instana Observability para ver como é possível obter Full Stack Observability e monitoramento em minutos.

Conteúdo relacionado

Assine a newsletter da IBM

Componentes de programas eBPF

Os principais componentes de um programa eBPF são:

Bytecode eBPF

Os programas eBPF são inicialmente escritos em um subconjunto C restrito e depois compilados em bytecode eBPF com ferramentas como LLVM, que serve como arquitetura back-end do eBPF para linguagens de programação front-end como Clang. O bytecode é essencialmente um conjunto restrito de instruções que aderem à arquitetura do conjunto de instruções eBPF e evitam erros de tempo de execução.

Interpretador eBPF/compilador JIT

A tecnologia do kernel Linux é capaz de traduzir bytecode eBPF em ações executáveis, mas os compiladores just-in-time (JIT) proporcionam desempenho superior. Os compiladores JIT podem traduzir bytecode em código de máquina nativo para plataformas de hardware específicas instantaneamente. 

Carregador de espaço do usuário

Os carregadores de espaço de usuário são programas no espaço de usuário que carregam o bytecode eBPF no kernel, anexando-o aos ganchos apropriados e gerenciando quaisquer mapas eBPF associados. Exemplos de carregadores de espaço de usuário são ferramentas como BPF Compiler Collection (BCC) e bpftrace.   

Mapas eBPF

Os mapas eBPF são estruturas de dados com pares de valores-chave e acesso de leitura que oferecem espaço de armazenamento compartilhado e facilitam a interação entre programas de kernel eBPF e aplicativos de espaço de usuário. Criado e gerenciado por meio de chamadas de sistema, os mapas eBPF também podem ser usados para manter o estado entre diferentes iterações dos programas eBPF.

Verificador ePPF

O verificador, componente crítico dos sistemas eBPF, verifica o bytecode antes de ser carregado no kernel para garantir que o programa não contenha operações prejudiciais, como loops infinitos, instruções ilegais ou acesso à memória fora dos limites. Também garante que todos os caminhos de dados do programa terminem com êxito.

Ganchos do ePPF

Ganchos são pontos no código do núcleo onde os programas eBPF podem ser anexados. Quando o kernel chega a um gancho, executa o programa eBPF anexado.

Diversos tipos de ganchos, como tracepoints, kprobes e filas de recebimento de pacotes de rede, dão aos programas eBPF amplo acesso a dados e permitem que executem várias operações. Os tracepoints, por exemplo, permitem que programas inspecionem e coletem dados sobre o kernel ou outros processos, enquanto os ganchos de controle de tráfego podem ser usados para inspecionar e modificar pacotes de rede.

Funções auxiliares

Como os eBPFs não podem gerar funções arbitrárias e devem manter a compatibilidade com todas as versões possíveis do kernel, às vezes os conjuntos de instruções eBPF básicos não têm nuances suficientes para realizar operações avançadas. As funções auxiliares preenchem essa lacuna.

As funções auxiliares, conjuntos de funções do kernel predefinidas e baseadas em API que os eBPFs podem chamar de dentro do sistema, oferecem uma maneira de os programas eBPF executarem operações mais complexas (como obter a hora e a data atuais ou gerar números aleatórios) não diretamente suportadas pelo conjunto de instruções.  

Como funciona o eBPF?

Em geral, os eBPFs operam como máquinas virtuais (VMs) dentro do kernel do Linux, trabalhando em uma arquitetura de conjunto de instruções de baixo nível e executando o bytecode do eBPF. No entanto, o complexo processo de execução de um programa eBPF tende a seguir algumas etapas principais.

Primeiro, os desenvolvedores escrevem o programa eBPF e compilam o bytecode. A finalidade do programa ditará o tipo apropriado de código. Por exemplo, se uma equipe quiser monitorar o uso da CPU, escreverá um código contendo funcionalidade para capturar métricas de uso.

Depois que o compilador eBPF converte o código C de alto nível em bytecode de nível inferior, um carregador de espaço do usuário gera uma chamada de sistema BPF para carregar o programa no kernel. O carregador também é responsável por solucionar erros e configurar qualquer mapa eBPF de que o programa precisar.

Com o bytecode e os mapas do programa prontos, o eBPF executará um processo de verificação para garantir que o programa seja seguro para execução no kernel. Se for considerado inseguro, a chamada do sistema para carregar o programa falhará e o programa carregador receberá uma mensagem de erro. Se o programa passar na verificação, poderá ser executado.

Usando um intérprete ou um compilador JIT, o eBPF traduzirá o bytecode em código de máquina executável. No entanto, o eBPF é uma tecnologia baseada em eventos, por isso só será executado em resposta a pontos de gancho ou eventos específicos dentro do kernel (como chamadas de sistema, eventos de rede, iniciação de processo, ociosidade da CPU etc.). Se ocorrer um evento, o eBPF executará o programa bytecode correspondente, permitindo que os desenvolvedores inspecionem e manipulem vários componentes do sistema.

Depois que o programa eBPF estiver em execução, os desenvolvedores poderão interagir com ele a partir do espaço do usuário com mapas eBPF. Por exemplo, o aplicativo pode verificar periodicamente um mapa para coletar dados do programa eBPF, ou pode atualizar um mapa para alterar o comportamento do programa.

Descarregar o programa é a etapa final da maioria dos processos de execução do eBPF. Quando o eBPF fez seu trabalho, o carregador pode usar a chamada do sistema BPF novamente para descarregá-lo do kernel, quando então o eBPF encerra a execução e libera seus recursos associados. O processo de descarregamento também pode incluir iterações sobre quaisquer mapas eBPF de que a equipe não precise mais liberar elementos individuais úteis e, em seguida, excluir o próprio mapa (com a chamada de sistema "excluir").

Casos de uso e benefícios do eBPF

As tecnologias eBPF já se tornaram uma pedra angular dos sistemas Linux modernos, permitindo o controle refinado do kernel do Linux e possibilitando às empresas construir soluções mais inovadoras dentro do ecossistema do Linux.

O eBPF facilitou os avanços em: 

Rede

O eBPF permite que os desenvolvedores instalem recursos de processamento de pacotes mais rápidos e personalizados, processos de balanceamento de carga, scripts de criação de perfil de aplicativos e práticas de monitoramento de rede. Plataformas de código aberto, como o Cilium, utilizam o eBPF para proporcionar redes seguras e expansíveis para clusters Kubernetes e cargas de trabalho e outros microsserviços em contêiner. Além disso, por meio do uso da lógica de encaminhamento de pacotes no nível do kernel, o eBPFS pode agilizar processos de roteamento e permitir uma resposta geral mais rápida da rede.

Observabilidade

Os eBPFs permitem que os desenvolvedores implementem os aplicativos de kernel e de espaço do usuário para reunir dados e métricas de desempenho detalhados sem afetar o desempenho do sistema de maneira significativa. Esses recursos ajudam as organizações a se manterem à frente, permitindo o monitoramento em tempo real e a observabilidade.

Segurança

Os eBPFs podem monitorar chamadas do sistema, tráfego de rede e comportamento do sistema para detectar e responder a possíveis ameaças à segurança em tempo real. Soluções de TI como a Falco, por exemplo, usam o eBPF para implementar auditoria de segurança em tempo de execução e resposta a incidentes, melhorando a segurança geral do sistema.

Ajuste de desempenho

Acompanhando chamadas do sistema, monitorando a utilização da CPU e rastreando a utilização de recursos (como E/S de disco), o eBPF ajuda os desenvolvedores a investigar com mais facilidade os gargalos no desempenho do sistema e identificar oportunidades de otimização.

Soluções relacionadas
IBM Instana Observability

O IBM Instana democratiza a observabilidade fornecendo uma solução que qualquer pessoa em DevOps, SRE, plataforma, ITOps e desenvolvimento pode usar para obter os dados desejados com o contexto necessário. Criada especificamente para ser nativa da nuvem, mas independente de tecnologia, a plataforma fornece de forma automática e contínua dados de alta fidelidade (granularidade de 1 segundo e rastreamentos de ponta a ponta) com o contexto de dependências lógicas e físicas em dispositivos móveis, web, aplicações e infraestrutura.

Conheça o Instana Solicite uma demonstração do Instana

IBM Turbonomic

A plataforma de otimização de custos de nuvem híbrida IBM Turbonomic permite que você automatize continuamente ações críticas em tempo real que oferecem de forma proativa o uso mais eficiente dos recursos de computação, armazenamento e rede para seus aplicativos em cada camada do stack. 

Explore o Turbonomic Conheça o Turbonomic sem custo
Dê o próximo passo

O IBM Instana fornece observabilidade em tempo real que todos e qualquer um podem usar. Ele proporciona um rápido time to value enquanto verifica se sua estratégia de observabilidade pode acompanhar a complexidade dinâmica dos ambientes atuais e futuros. Do celular ao mainframe, o Instana é compatível com mais de 250 tecnologias e está crescendo. 

Explore o IBM Instana Agende uma demonstração em tempo real
Notas de rodapé

Foundation Proposes Advancing eBPF Adoption Across Multiple OSes,(link fora do ibm.com)" DevOps.com, 21 de agosto de 2021

Os últimos avanços do eBPF são precursores de grandes mudanças na TI (link fora do ibm.com), DevOps.com, 13 de setembro de 2023