Olá Habr! Trago a sua atenção a tradução de um artigo de Brendan Gregg no eBPF
Havia pelo menos 24 apresentações de eBPF na conferência Linux Plumbers. Rapidamente se tornou não apenas uma tecnologia inestimável, mas também uma habilidade procurada. Talvez você queira definir algumas metas para o novo ano - aprenda o eBPF!
O termo eBPF deve significar algo substancial, como o Conjunto de instruções do kernel virtual (VKIS), mas sua origem é um filtro de pacotes Berkeley estendido. É aplicável em muitas áreas, como desempenho de rede, firewalls, segurança, rastreamento e drivers de dispositivo. Para alguns deles, há muitas informações disponíveis gratuitamente na Internet - por exemplo, rastreamento, mas para outros ainda não. O termo rastreamento refere-se a ferramentas de análise e vigilância de desempenho que podem gerar informações para cada evento. Você já deve ter usado um rastreador - tcpdump e strace são rastreadores especializados.
Neste post, descreverei o processo de estudar o uso do eBPF para fins de rastreamento, agrupados em seções para iniciantes, usuários avançados e avançados. Em resumo:
- Iniciante: iniciando ferramentas Cco
- Experiente: desenvolvendo ferramentas bpftrace
- Avançado: desenvolvendo ferramentas cco, contribuindo para cco e bpftrace
Iniciantes
1. O que são eBPF, bcc, bpftrace e iovisor?
O eBPF faz o mesmo no Linux e o JavaScript no HTML, mais ou menos. Portanto, em vez de um site HTML estático, o JavaScript permite definir miniprogramas que são executados em eventos - como um clique do mouse - que são executados em uma máquina virtual segura em um navegador. E com o eBPF - em vez de editar o kernel, agora você pode escrever miniprogramas que são executados em eventos como E / S de disco em uma máquina virtual segura no kernel. De fato, o eBPF é mais como uma máquina virtual v8 que executa JavaScript do que o próprio JavaScript. O eBPF faz parte do kernel do Linux.
Programar diretamente no eBPF é incrivelmente difícil, assim como no bytecode da v8. Mas nenhum código na v8: todo mundo escreve em JavaScript, ou geralmente em uma estrutura sobre JavaScript (jQuery, Angular, React etc.). A mesma coisa com o eBPF. As pessoas vão usá-lo e escrever código através de estruturas. Os principais para o rastreamento são bcc e bpftrace . Eles não vivem na base de código do kernel, mas no projeto Linux Foundation em um github chamado iovisor .
2. É possível rastrear usando o eBPF?
Este utilitário baseado em eBPF demonstra sessões TCP totalmente estabelecidas com seu ID de processo (PID), nome de comando (COMM), bytes enviados e recebidos (TX_KB, RX_KB) e duração em milissegundos (MS):
# tcplife COMUN PID LADDR LPORT RADDR RPORT TX_KB RX_KB MS
Registo 127.0.0.1 46644 127.0.0.1 28527 0 0 0,23
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46644 0 0 0.28
22598 enrolamento 100.66.3.172 61620 52.205.89.26 80 0 1 91.79
22604 enrolamento 100.66.3.172 44400 52.204.43.121 80 0 1 121.38
Registo 127.0.0.1 46648 127.0.0.1 28527 0 0 0,22
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46648 0 0 0.27
Registro 12764.0.0 46650 127.0.0.1 28527 0 0 0,21
3277 redis-serv 127.0.0.1 28527 127.0.0.1 46650 0 0 0.26
[...]
Esse eBPF não torna isso possível - eu posso reescrever o tcplife para usar tecnologias mais antigas do kernel. Mas, se o fizesse, nunca executaríamos uma ferramenta desse tipo na produção devido ao desempenho reduzido, problemas de segurança ou ambos. O eBPF tornou essa ferramenta prática : é eficiente e segura. Por exemplo, ele não rastreia todos os pacotes, como foi feito nas abordagens anteriores, e isso pode levar a uma diminuição excessiva no desempenho. Em vez disso, ele rastreia apenas eventos de sessão TCP que ocorrem com muito menos frequência. Isso torna a sobrecarga tão baixa que podemos executar esta ferramenta no modo 24x7.
3. Como eu uso isso?
Os iniciantes devem começar a explorar o Cco. Consulte as instruções de instalação do cco para o seu sistema operacional. Para o Ubuntu, é algo parecido com isto:
# sudo apt-get update
# sudo apt-get install bpfcc-tools
# sudo / usr / share / cco / tools / opensnoop PID COMM FD ERR CAMINHO
25548 gnome-shell 33 0 / proc / self / stat
10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.x86_64-linux-gnu.so
10190 opensnoop -1 2 /usr/lib/python2.7/encodings/ascii.so
10190 opensnoop -1 2 /usr/lib/python2.7/encodings/asciimodule.so
10190 opensnoop 18 0 /usr/lib/python2.7/encodings/ascii.py
10190 opensnoop 19 0 /usr/lib/python2.7/encodings/ascii.pyc
25548 gnome-shell 33 0 / proc / self / stat
29588 pesquisa de dispositivo 4 0 / dev / bus / usb
^ C
Aqui acabei abrindo onoop para testar a funcionalidade das ferramentas. Se você chegou até aqui, definitivamente usou o eBPF!
Para empresas como Netflix e Facebook, o cco está instalado em todos os servidores por padrão. Talvez você queira fazer o mesmo.
4. Existe um guia para iniciantes?
Sim, escrevi um guia para o bcc, que é um bom ponto de partida para iniciantes no rastreamento com o eBPF:
Como iniciante, você não precisa escrever nenhum código para o eBPF. O cco já contém mais de 70 ferramentas que você pode usar imediatamente. Este guia o guiará pelas etapas seguintes: execsnoop, opensnoop, ext4slower (ou btrfs *, xfs *, zfs *), biolatency, biosnoop, cachestat, tcpconnect, tcpaccept, tcpretrans, runqlat e profile.
Depois de experimentá-los, você só precisa saber que existem muitos outros meios:

Eles também são totalmente documentados com ferramentas da página de manual e arquivos de amostra. Os arquivos de exemplo (* _example.txt em bcc / tools) contêm capturas de tela com explicações: por exemplo, biolatency_example.txt . Eu escrevi muitos deles (páginas de manual e ferramentas) que se parecem com mais 50 postagens no blog, você os encontrará no repositório cco.
O que está faltando são exemplos reais de produção. Eu escrevi essa documentação quando o eBPF era tão novo que estava disponível apenas em nossos ambientes de teste, portanto a maioria dos exemplos é artificial. Com o tempo, adicionaremos exemplos do mundo real. É aqui que os iniciantes podem ajudar: se você estiver resolvendo um problema, considere escrever um artigo e compartilhar capturas de tela ou adicioná-las como arquivos de exemplo.
Para experientes
Neste ponto, você já deve executar o bcc e experimentar essas ferramentas, além de estar interessado em modificá-las e escrever suas próprias ferramentas. A melhor maneira é atualizar para o bpftrace, que contém um idioma de alto nível que é muito mais fácil de aprender. A desvantagem é que ele não é tão flexível quanto o Cco, portanto, você pode ter restrições e querer voltar ao Cco.
Consulte as instruções de instalação do bpftrace . Este é um projeto mais recente, portanto, no momento da redação deste artigo, os pacotes ainda não foram compilados para todos os sistemas. No futuro, ele deve ser apenas apt-get install bpftrace ou algo semelhante.
1. tutorial do bpftrace
Eu desenvolvi um tutorial que ensina como usar o bpftrace através de uma série de linhas simples:
Existem 12 lições que o ensinarão a usar o bpftrace passo a passo. Aqui está um exemplo:
# bpftrace -e 'tracepoint: syscalls: sys_enter_open {printf ("% d% s \ n", pid, str (args-> nome do arquivo)); } ' Anexando 1 sonda ...
181 / proc / cpuinfo
181 / proc / stat
1461 / proc / net / dev
1461 / proc / net / if_inet6
^ C
Ele usa a chamada de sistema aberto como um ponto de rastreamento para rastrear o PID e abrir os caminhos de arquivo.
2. Guia de Referência do bpftrace
Para obter mais informações sobre o bpftrace, escrevi um guia contendo exemplos de sintaxe, testes e comandos internos:
Isso é por uma questão de concisão: tento colocar o título, o resumo e a captura de tela em uma página. Acho que isso é muito longo - se você estiver procurando por algo e precisar rolar a página várias vezes.
3. bpftrace em exemplos
Existem mais de 20 ferramentas no repositório bpftrace que você pode ver com exemplos:
Por exemplo:
# cat tools / biolatency.bt [...]
COMEÇAR
{
printf ("Rastreando E / S do dispositivo de bloco ... Pressione Ctrl-C para finalizar. \ n");
}
kprobe: blk_account_io_start
{
@start [arg0] = nsecs;
}
kprobe: blk_account_io_completion
/ @ start [arg0] /
{
@usecs = hist ((nsecs - @start [arg0]) / 1000);
delete (@start [arg0]);
}
Como o cco, esses utilitários têm páginas de manual e arquivos de amostra. Por exemplo, biolatency_example.txt .
Para avançados
1. Estudamos o desenvolvimento do Cco
Criei dois guias para ajudar:
Existem também muitos exemplos em bcc / tools / *. Py. As ferramentas cco consistem em duas partes: código BPF para um kernel escrito em C e uma ferramenta de espaço do usuário escrita em Python (ou lua ou C ++). O desenvolvimento de ferramentas cco é bastante avançado e pode incluir alguns pequenos componentes do kernel ou elementos de aplicativos internos.
2. Participação no desenvolvimento
A ajuda é bem-vinda com:
Para o bpftrace, criei o guia de desenvolvimento interno do bpftrace . Isso é difícil quando você programa no llvm IR, mas se você está pronto para aceitar o desafio ...
Há também o núcleo do eBPF (também conhecido como BPF): se você observar os problemas de bcc e bpftrace, verá vários pedidos de melhorias por lá. Por exemplo, a tag do kernel no bpftrace . Consulte também a lista de discussão netdev para obter os desenvolvimentos mais recentes do kernel BPF que são adicionados ao net-next antes de se fundirem com a linha principal do Linux.
Além de escrever código, você também pode participar de testes, criação de pacotes, blogs e discussões.
Conclusão
O eBPF faz muitas coisas diferentes. Neste post, analisei o domínio do eBPF para rastreamento e análise de desempenho. Em resumo:
- Iniciante: iniciando ferramentas Cco
- Experiente: desenvolvendo ferramentas bpftrace
- Avançado: desenvolvendo ferramentas cco, contribuindo para cco e bpftrace
Também tenho uma página separada sobre as ferramentas de rastreamento do eBPF , que abordam tudo isso com mais detalhes. Boa sorte