O projeto bpftime desenvolve uma implementação de eBPF no espaço do usuário

É apresentado o projeto bpftime, que desenvolve um runtime e uma máquina virtual para execução de manipuladores eBPF no espaço do usuário. O Bpftime permite que programas de rastreamento e intervenção de processo eBPF sejam executados inteiramente no espaço do usuário, usando recursos como uprobe e interceptação programática de chamadas do sistema. Observa-se que, ao eliminar trocas de contexto desnecessárias, o bpftime pode atingir uma redução de dez vezes na sobrecarga em comparação ao uso da funcionalidade uprobe e uretprobe fornecida pelo kernel Linux. Além disso, o bpftime simplifica bastante a depuração, pode ser potencialmente usado em sistemas sem kernel Linux e não requer os privilégios elevados necessários para carregar um aplicativo eBPF no kernel. O código do projeto é escrito em C/C++ e distribuído sob a licença do MIT.

A interceptação de chamadas de sistema e a integração de verificações uprobe são implementadas usando a técnica de reescrita de código executável (reescrita binária), na qual chamadas para chamadas de sistema, pontos de entrada e funções locais são substituídas por uma transição para manipuladores de depuração através da modificação do código de máquina de o aplicativo em execução, que é muito mais eficaz do que organizar a interceptação usando uprobe no nível do kernel Linux.

São suportadas operações de substituição ou alteração de funções, anexação de manipuladores (ganchos) e filtros, redirecionamento, bloqueio ou substituição de parâmetros de chamada do sistema, interceptação de pontos de entrada e saída de funções, bem como substituição de um manipulador em um deslocamento arbitrário no código. O Bpftime pode ser anexado a qualquer processo em execução no sistema sem a necessidade de reiniciá-lo ou reconstruí-lo. A substituição de bpftime em processos pode ser feita para execução de processos via ptrace e para carregamento via LD_PRELOAD.

Como parte do bpftime, está sendo desenvolvido um tempo de execução que permite anexar programas eBPF a chamadas do sistema e detectar pontos de rastreamento; Máquina virtual eBPF com JIT para execução isolada de programas eBPF no nível do processo do usuário (a compilação AOT é suportada adicionalmente); um processo em segundo plano para interagir com o kernel e organizar a compatibilidade com o subsistema uprobe do kernel (bpftime suporta o modo de carregar eBPF no espaço do usuário do kernel para organizar a colaboração com programas eBPF no kernel, usado, por exemplo, para processar kprobe ou configuração de filtros de rede).

A máquina virtual eBPF é projetada como uma biblioteca plug-in e fornece uma API semelhante ao ubpf, que permite que ela seja usada para integrar a funcionalidade eBPF em outros projetos. Para agregação sumária de dados de diversos processos, é suportada a criação de Mapas eBPF conjuntos localizados em memória compartilhada. Junto com o bpftime, manipuladores eBPF padrão escritos para uso no kernel podem ser usados, e ferramentas padrão baseadas em clang e libbpf podem ser usadas para montagem.

Com o bpftime, sistemas de rastreamento como BCC, bpftrace e Deepflow podem ser executados no espaço do usuário. Por exemplo, demonstramos o uso do script sslsniff da estrutura BCC para analisar e salvar tráfego criptografado no nginx. Nos testes realizados, o desempenho do nginx diminui em 58% ao executar sslsniff no lado do kernel e em 12.3% ao mover o manipulador para o espaço do usuário.

Arquitetura de rastreamento de processos usando o eBPF original no kernel:

O projeto bpftime desenvolve uma implementação de eBPF no espaço do usuário

Arquitetura de rastreamento de espaço do usuário usando bpftime:

O projeto bpftime desenvolve uma implementação de eBPF no espaço do usuário

Modo híbrido, no qual o bpftime trabalha em conjunto com o eBPF no kernel, por exemplo, para instalar filtros de rede ou mover manipuladores individuais para o espaço do usuário:

O projeto bpftime desenvolve uma implementação de eBPF no espaço do usuário

Os planos futuros incluem: a capacidade de substituir exceções (injeção de falhas); hot patching (Hot Patching) para alterar a lógica de operação ou corrigir erros em montagens binárias; criação de um módulo para Nginx que permite criar extensões usando programas eBPF (por exemplo, para seleção dinâmica de rotas, cache, aplicação de políticas de segurança e balanceamento de carga); expandindo as capacidades do subsistema FUSE (por exemplo, criando extensões para o FS para armazenamento em cache ou controle de acesso na forma de programas eBPF).

Fonte: opennet.ru

Adicionar um comentário