Coleção de compiladores BPF (BCC)
BCC é um kit de ferramentas para criar programas eficientes de rastreamento e manipulação de kernel e inclui várias ferramentas e exemplos úteis. Ele faz uso de BPF estendido (Berkeley Packet Filters), formalmente conhecido como eBPF, um novo recurso que foi adicionado pela primeira vez ao Linux 3.15. Muito do que o BCC usa requer Linux 4.1 e superior.
eBPF foi descrito por Ingo Molnár como:
Um dos recursos mais interessantes neste ciclo é a capacidade de anexar programas eBPF (bytecode em sandbox definido pelo usuário e executado pelo kernel) aos kprobes. Isso permite instrumentação definida pelo usuário em uma imagem de kernel ativa que nunca pode travar, travar ou interferir negativamente no kernel.
O BCC torna os programas BPF mais fáceis de escrever, com instrumentação de kernel em C (e inclui um wrapper C em torno do LLVM) e front-ends em Python e lua. É adequado para muitas tarefas, incluindo análise de desempenho e controle de tráfego de rede.
Captura de tela
Este exemplo rastreia uma função de kernel de E/S de disco e preenche um histograma de potência de 2 no kernel do tamanho de E/S. Para maior eficiência, apenas o resumo do histograma é retornado ao nível do usuário.
# ./bitehist.py
Tracing... Hit Ctrl-C to end.
^C
kbytes : count distribution
0 - > 1 : 3 | |
2 - > 3 : 0 | |
4 - > 7 : 211 | ********** |
8 - > 15 : 0 | |
16 - > 31 : 0 | |
32 - > 63 : 0 | |
64 - > 127 : 1 | |
128 - > 255 : 800 | ************************************** |
A saída acima mostra uma distribuição bimodal, onde o maior modo de 800 E/S tinha entre 128 e 255 Kbytes de tamanho.
Veja a fonte: bithist.py. O que rastreia, o que armazena e como os dados são apresentados podem ser totalmente personalizados. Isso mostra apenas alguns dos muitos recursos possíveis.
Instalando
Consulte INSTALL.md para obter as etapas de instalação em sua plataforma.
Perguntas frequentes
Consulte FAQ.txt para obter as perguntas mais comuns sobre solução de problemas.
Guia de referência
Consulte docs/reference_guide.md para obter o guia de referência das APIs Cco e Cco/BPF.
Conteúdo
Alguns deles são arquivos únicos que contêm C e Python, outros possuem um par de arquivos .c e .py e alguns são diretórios de arquivos.
Rastreamento
Exemplos
- exemplos/tracing/bitehist.py: histograma de tamanho de E/S do bloco. Exemplos.
- exemplos/tracing/disksnoop.py: Latência de E/S do dispositivo de bloco de rastreamento. Exemplos.
- exemplos/hello_world.py: Imprime "Olá, mundo!" para novos processos.
- exemplos/tracing/mysqld_query.py: rastreie consultas do servidor MySQL usando testes USDT. Exemplos.
- exemplos/tracing/nodejs_http_server.py: rastreie solicitações do servidor HTTP Node.js usando testes USDT. Exemplos.
- exemplos/tracing/stacksnoop: rastreia uma função do kernel e imprime todos os rastreamentos de pilha do kernel. Exemplos.
- ferramentas/statsnoop: Rastreie syscalls stat(). Exemplos.
- exemplos/tracing/task_switch.py: conta as alternâncias de tarefas com PIDs de e para.
- exemplos/tracing/tcpv4connect.py: rastreia conexões ativas TCP IPv4. Exemplos.
- exemplos/tracing/trace_fields.py: Exemplo simples de impressão de campos de eventos rastreados.
- exemplos/tracing/undump.py: Despeja pacotes de soquete UNIX. Exemplos
- exemplos/tracing/urandomread.py: Um exemplo de ponto de rastreamento do kernel, que rastreia random:urandom_read. Exemplos.
- exemplos/tracing/vfsreadlat.py exemplos/tracing/vfsreadlat.c: distribuição de latência de leitura VFS. Exemplos.
- exemplos/tracing/kvm_hypercall.py: Pontos de rastreamento estáticos condicionais do kernel para exemplos de entrada, saída e hiperchamada KVM.
Ferramentas
- ferramentas/argdist: exibe valores de parâmetros de função como um histograma ou contagem de frequência. Exemplos.
- ferramentas/bashreadline: Imprime os comandos bash inseridos em todo o sistema. Exemplos.
- ferramentas/bpflist: Exibe processos com programas e mapas BPF ativos. Exemplos.
- ferramentas/capazes: verificações de capacidade de segurança de rastreamento. Exemplos.
- tools/compactsnoop: rastreie eventos de zona compacta com PID e latência. Exemplos.
- ferramentas/criticalstat: rastreia e relata longas seções críticas atômicas no kernel. Exemplos
- ferramentas/deadlock: detecta possíveis deadlocks em um processo em execução. Exemplos.
- ferramentas/drsnoop: rastreie eventos de recuperação direta com PID e latência. Exemplos.
- ferramentas/funccount: Conta chamadas de função do kernel. Exemplos.
- ferramentas/inject: injeção de erro direcionada com cadeia de chamadas e exemplos de predicados.
- ferramentas/klockstat: rastreia eventos de bloqueio mutex do kernel e exibe estatísticas de bloqueios. Exemplos.
- ferramentas/opensnoop: Rastreie syscalls open(). Exemplos.
- ferramentas/readahead: mostra o desempenho dos exemplos de cache de leitura antecipada.
- ferramentas/reset-trace: redefine o estado do rastreamento. Apenas ferramenta de manutenção. Exemplos.
- ferramentas/stackcount: Conta chamadas de função do kernel e seus rastreamentos de pilha. Exemplos.
- ferramentas/syncsnoop: Rastreamento de sincronização() syscall. Exemplos.
- tools/threadsnoop: Lista a criação de novos threads. Exemplos.
- ferramentas/tplist: exibe tracepoints do kernel ou testes USDT e seus formatos. Exemplos.
- ferramentas/trace: rastreia funções arbitrárias, com filtros. Exemplos.
- Tools/ttysnoop: Assista a saída ao vivo de um dispositivo tty ou pts. Exemplos.
- ferramentas/ucalls: Resuma chamadas de método ou syscalls do Linux em linguagens de alto nível. Exemplos.
- ferramentas/uflow: imprime um gráfico de fluxo de método em linguagens de alto nível. Exemplos.
- ferramentas/ugc: rastreia eventos de coleta de lixo em linguagens de alto nível. Exemplos.
- ferramentas/uobjnew: Resuma eventos de alocação de objetos por tipo de objeto e número de bytes alocados. Exemplos.
- ferramentas/ustat: Colete eventos como GCs, criações de threads, alocações de objetos, exceções e muito mais em linguagens de alto nível. Exemplos.
- ferramentas/uthreads: rastreia eventos de criação de thread em Java e pthreads brutos. Exemplos.
Ferramentas de memória e processo
- tools/execsnoop: rastreie novos processos por meio de syscalls exec(). Exemplos.
- ferramentas/exitsnoop: encerramento do processo de rastreamento (sinais de saída e fatais). Exemplos.
- ferramentas/killsnoop: Sinais de rastreamento emitidos pelo syscall kill(). Exemplos.
- ferramentas/kvmexit: exibe exit_reason e suas estatísticas de cada saída da VM. Exemplos.
- ferramentas/memleak: exibe alocações de memória pendentes para encontrar vazamentos de memória. Exemplos.
- ferramentas/oomkill: rastreie o assassino de falta de memória (OOM). Exemplos.
- ferramentas/pidpersec: Conta novos processos (via fork). Exemplos.
- ferramentas/rdmaucma: rastreia eventos de acesso do gerenciador de conexões do espaço do usuário RDMA. Exemplos.
- ferramentas/shmsnoop: Rastreia syscalls de memória compartilhada do System V. Exemplos.
- tools/slabratetop: Taxa de alocação de cache de memória SLAB/SLUB do kernel superior. Exemplos.
Ferramentas de desempenho e tempo
- ferramentas/dbslower: rastreia consultas MySQL/PostgreSQL mais lentas que um limite. Exemplos.
- ferramentas/dbstat: Resume a latência da consulta MySQL/PostgreSQL como um histograma. Exemplos.
- ferramentas/funcinterval: Intervalo de tempo entre a mesma função de um histograma. Exemplos.
- ferramentas/funclatência: Funções de tempo e mostram sua distribuição de latência. Exemplos.
- ferramentas/funcslower: rastreia chamadas lentas de kernel ou de função do usuário. Exemplos.
- ferramentas/hardirqs: mede o tempo do evento IRQ (interrupção brusca). Exemplos.
- tools/mysqld_qslower: rastreia consultas do servidor MySQL mais lentas que um limite. Exemplos.
- ferramentas/ppchcalls: Resuma contagens e latências de chamadas ppc. Exemplos.
- ferramentas/softirqs: mede o tempo do evento soft IRQ (interrupção suave). Exemplos.
- ferramentas/syscount: Resuma contagens e latências de syscall. Exemplos.
Ferramentas de CPU e Agendador
- ferramentas/cpudist: Resuma o tempo ligado e desligado da CPU por tarefa como um histograma. Exemplos
- ferramentas/cpuunclaimed: Amostra de filas de execução de CPU e calcula CPU ociosa não reivindicada. Exemplos
- ferramentas/llcstat: Resuma referências e falhas de cache da CPU por processo. Exemplos.
- ferramentas/offcputime: Resuma o tempo fora da CPU pelo rastreamento de pilha do kernel. Exemplos.
- ferramentas/offwaketime: Resuma o tempo bloqueado pela pilha fora da CPU do kernel e pela pilha waker. Exemplos.
- ferramentas/perfil: perfila o uso da CPU amostrando rastreamentos de pilha em um intervalo cronometrado. Exemplos.
- ferramentas/runqlat: latência da fila de execução (agendador) como um histograma. Exemplos.
- ferramentas/runqlen: executa o comprimento da fila como um histograma. Exemplos.
- ferramentas/runqslower: rastreie longos atrasos no agendamento de processos. Exemplos.
- ferramentas/wakeuptime: Resuma o tempo de sono até o despertar pela pilha do kernel waker. Exemplos.
- ferramentas/wqlat: Resuma a latência de espera do trabalho na fila de trabalho. Exemplos.
Ferramentas de rede e soquetes
- tools/gethostlatency: Mostra a latência para chamadas getaddrinfo/gethostbyname[2]. Exemplos.
- ferramentas/bindsnoop: rastreia chamadas de sistema bind() IPv4 e IPv6 (bind()). Exemplos.
- tools/netqtop tools/netqtop.c: Rastreia e exibe a distribuição de pacotes em filas NIC. Exemplos.
- ferramentas/sofdsnoop: Rastreia FDs passados por soquetes unix. Exemplos.
- ferramentas/solisten: Rastreamento de escuta do soquete TCP. Exemplos.
- ferramentas/sslsniff: fareja dados escritos e lidos do OpenSSL. Exemplos.
- ferramentas/tcpaccept: rastreia conexões passivas TCP (accept()). Exemplos.
- ferramentas/tcpconnect: rastreia conexões ativas TCP (connect()). Exemplos.
- ferramentas/tcpconnlat: Rastreia a latência da conexão ativa TCP (connect()). Exemplos.
- ferramentas/tcpdrop: Rastreia pacotes TCP baseados em kernel com detalhes. Exemplos.
- ferramentas/tcplife: rastreia sessões TCP e resume a vida útil. Exemplos.
- ferramentas/tcpretrans: rastreia retransmissões TCP e TLPs. Exemplos.
- ferramentas/tcprtt: Rastreia o tempo de ida e volta do TCP. Exemplos.
- ferramentas/tcpstates: rastreia alterações no estado da sessão TCP com durações. Exemplos.
- ferramentas/tcpsubnet: Resume e agrega envio TCP por sub-rede. Exemplos.
- ferramentas/tcpsynbl: Mostra o backlog do TCP SYN. Exemplos.
- ferramentas/tcptop: Resume a taxa de transferência de envio/recebimento de TCP por host. Superior para TCP. Exemplos.
- ferramentas/tcptracer: rastreia conexões TCP estabelecidas (connect(), accept(), close()). Exemplos.
- ferramentas/tcpcong: Rastreia a duração do status do controle de congestionamento do soquete TCP. Exemplos.
Ferramentas de armazenamento e sistemas de arquivos
- ferramentas/bitesize: Mostra o histograma de tamanho de E/S por processo. Exemplos.
- ferramentas/cachestat: proporção de acertos/erros do cache da página de rastreamento. Exemplos.
- ferramentas/cachetop: Rastrear a taxa de acertos/erros do cache da página por processos. Exemplos.
- Tools/dcsnoop: Pesquisas de cache de entrada de diretório de rastreamento (dcache). Exemplos.
- ferramentas/dcstat: estatísticas do cache de entrada de diretório (dcache). Exemplos.
- ferramentas/biolatência: Resuma a latência de E/S do dispositivo de bloco como um histograma. Exemplos.
- ferramentas/biotop: Parte superior para discos: Resume a E/S do dispositivo de bloco por processo. Exemplos.
- ferramentas/biopadrão: identifica padrões de acesso ao disco aleatórios/sequenciais. Exemplos.
- ferramentas/biosnoop: E/S de dispositivo de bloco de rastreamento com PID e latência. Exemplos.
- ferramentas/dirtop: leituras e gravações de arquivos por diretório. Topo para diretórios. Exemplos.
- ferramentas/filelife: Rastreie a vida útil de arquivos de curta duração. Exemplos.
- ferramentas/filegone: rastreia por que o arquivo desapareceu (excluído ou renomeado). Exemplos.
- ferramentas/fileslower: rastreia leituras e gravações lentas e síncronas de arquivos. Exemplos.
- ferramentas/filetop: leituras e gravações de arquivos por nome de arquivo e processo. Topo para arquivos. Exemplos.
- ferramentas/mdflush: rastreia eventos de md flush. Exemplos.
- ferramentas/mountsnoop: rastreia a montagem e desmontagem de syscalls em todo o sistema. Exemplos.
- ferramentas/virtiostat: Mostra estatísticas de IO do dispositivo VIRTIO. Exemplos.
Ferramentas de sistemas de arquivos
- ferramentas/btrfsdist: Resuma a distribuição de latência da operação btrfs como um histograma. Exemplos.
- ferramentas/btrfsslower: rastreia operações lentas de btrfs. Exemplos.
- ferramentas/ext4dist: Resuma a distribuição de latência da operação ext4 como um histograma. Exemplos.
- ferramentas/ext4slower: rastreia operações ext4 lentas. Exemplos.
- ferramentas/nfsslower: rastreia operações NFS lentas. Exemplos.
- ferramentas/nfsdist: Resuma a distribuição de latência da operação NFS como um histograma. Exemplos.
- ferramentas/vfscount: Conta chamadas VFS. Exemplos.
- ferramentas/vfsstat: conte algumas chamadas VFS, com saída de coluna. Exemplos.
- tools/xfsdist: Resuma a distribuição de latência da operação XFS como um histograma. Exemplos.
- tools/xfsslower: rastreia operações XFS lentas. Exemplos.
- tools/zfsdist: Resuma a distribuição de latência da operação ZFS como um histograma. Exemplos.
- tools/zfsslower: rastreia operações lentas do ZFS. Exemplos.
Rede
Exemplos:
- exemplos/networking/distributed_bridge/: exemplo de ponte distribuída.
- exemplos/networking/http_filter/: Exemplo de filtro HTTP simples.
- exemplos/networking/simple_tc.py: Exemplo simples de controle de tráfego.
- exemplos/networking/simulation.py: auxiliar de simulação.
- exemplos/networking/neighbor_sharing/tc_neighbor_sharing.py exemplos/networking/neighbor_sharing/tc_neighbor_sharing.c: Classificação por IP e limitação de taxa.
- exemplos/networking/tunnel_monitor/: Monitore fluxos de tráfego com eficiência.
- exemplos/networking/vlan_learning/vlan_learning.py exemplos/vlan_learning.c: Demuxar o tráfego Ethernet em namespaces de trabalho veth+.
Introspecção BPF
Ferramentas que ajudam a introspectar os programas BPF.
- introspection/bps.c: Lista todos os programas BPF carregados no kernel. 'ps' para programas BPF. Exemplos.
Motivação
O BPF garante que os programas carregados no kernel não podem travar e não podem ser executados para sempre, mas ainda assim o BPF é de uso geral o suficiente para executar muitos tipos arbitrários de computação. Atualmente, é possível escrever um programa em C que será compilado em um programa BPF válido, mas é muito mais fácil escrever um programa em C que será compilado em um BPF inválido (C é assim). O usuário não saberá até tentar executar o programa se ele era válido ou não.
Com um frontend específico do BPF, deve-se ser capaz de escrever em uma linguagem e receber feedback do compilador sobre a validade no que se refere a um backend do BPF. Este kit de ferramentas tem como objetivo fornecer um frontend que só pode criar programas BPF válidos, ao mesmo tempo que aproveita toda a sua flexibilidade.
Além disso, as integrações atuais com o BPF têm um fluxo de trabalho complicado, às vezes envolvendo a compilação diretamente em uma árvore de origem do kernel Linux. Esta cadeia de ferramentas visa minimizar o tempo que um desenvolvedor gasta para compilar o BPF e, em vez disso, focar nos aplicativos que podem ser escritos e nos problemas que podem ser resolvidos com o BPF.
Os recursos deste kit de ferramentas incluem:
- Fluxo de trabalho BPF completo em uma biblioteca compartilhada
- Uma linguagem C modificada para backends BPF
- Integração com back-end llvm-bpf para JIT
- (des)carregamento dinâmico de programas JITed
- Suporte para ganchos de kernel BPF: filtros de soquete, classificadores tc, ações tc e kprobes
- Ligações para Python
- Exemplos para filtros de soquete, classificadores tc e kprobes
- Ferramentas independentes para rastrear um sistema em execução
No futuro, mais ligações além do python provavelmente serão suportadas. Sinta-se à vontade para adicionar suporte para o idioma de sua escolha e enviar uma solicitação pull!
Tutoriais
- docs/tutorial.md: Usando ferramentas Cco para resolver problemas de desempenho, solução de problemas e rede.
- docs/tutorial_bcc_python_developer.md: Desenvolvendo novos programas Cco usando a interface Python.
Rede
No Red Hat Summit 2015, o BCC foi apresentado como parte de uma sessão sobre BPF. Um ambiente vxlan multi-host é simulado e um programa BPF usado para monitorar uma das interfaces físicas. O programa BPF mantém estatísticas sobre os endereços IP internos e externos que atravessam a interface, e o componente de espaço do usuário transforma essas estatísticas em um gráfico que mostra a distribuição do tráfego em múltiplas granularidades. Veja o código aqui.
Contribuindo
Já está animado para enviar algum código? Aqui estão alguns recursos para participar das discussões na comunidade IOVisor e ver no que você deseja trabalhar.
- Lista de discussão: https://lists.iovisor.org/mailman/listinfo/iovisor-dev
- IRC: #iovisor em irc.oftc.net
- Rastreador de problemas BCC: problemas do Github
- Um guia para contribuir com scripts: CONTRIBUTING-SCRIPTS.md
Links externos
Procurando mais informações sobre o BCC e como ele está sendo usado? Você pode encontrar links para outros conteúdos BCC na web em LINKS.md.