Uma coleção diversificada de ferramentas de análise de desempenho em desenvolvimento e sem suporte para Linux ftrace e perf_events (também conhecido como comando "perf"). Tanto o ftrace quanto o perf são ferramentas básicas de rastreamento do Linux, incluídas no código-fonte do kernel. Seu sistema provavelmente já possui o ftrace e perf geralmente é apenas um acréscimo de pacote (consulte Pré-requisitos).
Essas ferramentas são projetadas para serem fáceis de instalar (menos dependências), fornecer observabilidade avançada de desempenho e serem simples de usar: faça uma coisa e faça-a bem. Esta coleção foi criada por Brendan Gregg (autor do DTraceToolkit).
Muitas dessas ferramentas empregam soluções alternativas para que a funcionalidade seja possível nos kernels Linux existentes. Por causa disso, muitas ferramentas têm ressalvas (veja as páginas de manual), e sua implementação deve ser considerada um espaço reservado até que recursos futuros do kernel ou novos subsistemas de rastreamento sejam adicionados.
Eles são destinados ao Linux 3.2 e kernels mais recentes. Para Linux 2.6.x, consulte Avisos.
Essas ferramentas foram apresentadas na apresentação USENIX LISA 2014: Linux Performance Analysis: New Tools and Old Secrets
Usando ftrace:
Usando perf_events:
Usando eBPF:
Mostrando novos processos e argumentos:
# ./execsnoop Rastreando exec()s. Ctrl-C para finalizar. PID PPID ARGS 22898 22004 homem ls 22905 22898 pré-conv -e UTF-8 22908 22898 pager -s 22907 22898 nroff -mandoc -rLL=164n -rLT=164n -Tutf8 22906 22898 tbl 22911 22910 mapa de charme de localidade 22912 22907 groff -mtty-char -Tutf8 -mandoc -rLL=164n -rLT=164n 22913 22912 troff -mtty-char -mandoc -rLL=164n -rLT=164n -Tutf8 22914 22912 sujo
Medindo a latência de E/S do dispositivo de bloco desde a inserção da fila até a conclusão:
# ./iolatency -Q Rastreando E/S do bloco. Saída a cada 1 segundo. Ctrl-C para finalizar. >=(ms) .. <(ms) : E/S |Distribuição | 0 -> 1: 1913 |#####################################| 1 -> 2: 438 |#########| 2 -> 4: 100 |## | 4 -> 8: 145 |### | 8 -> 16 : 43 |# | 16 -> 32 : 43 |# | 32 -> 64 : 1 |# | [...]
Rastreando o tracepoint block:block_rq_insert, com rastreamentos de pilha do kernel e apenas para leituras:
# ./tpoint -s bloco:block_rq_insert 'rwbs ~ "*R*"' cksum-11908 [000] d... 7269839.919098: block_rq_insert: 202,1 R 0 () 736560 + 136 [cksum] cksum-11908 [000] d...7269839.919107: => __elv_add_request => blk_flush_plug_list => blk_finish_plug => __do_page_cache_readahead => ondemand_readahead => page_cache_async_readahead => arquivo_genérico_read_iter => new_sync_read => vfs_read => SyS_read => system_call_fastpath [...]
Conte as chamadas de função do kernel começando com "bio_", resuma a cada segundo:
# ./funccount -i 1 'bio_*' Rastreando "bio_*"... Ctrl-C para finalizar. CONTAGEM DE FUNÇÕES bio_attempt_back_merge 26 bio_get_nr_vecs361 bio_aloc 536 bio_alloc_bioset 536 bio_endio 536 bio_free 536 bio_fs_destructor 536 bio_init 536 bio_integridade_enabled 536 bio_put 729 bio_add_page 1004 [...]
Existem muitos mais exemplos no diretório de exemplos. Veja também as páginas de manual.
A intenção é a menor possível. Por exemplo, um servidor Linux 3.2 sem informações de depuração. Consulte a página de manual da ferramenta para obter detalhes.
FTRACE configurado no kernel. Você já deve ter configurado e disponível em sua versão do kernel, pois o FTRACE foi adicionado pela primeira vez em 2.6.27. Isso requer CONFIG_FTRACE e outras opções de FTRACE dependendo da ferramenta. Algumas ferramentas (por exemplo, funccount) requerem CONFIG_FUNCTION_PROFILER.
Requer a instalação do comando "perf". Isso está no pacote linux-tools-common. Depois de instalar isso, perf pode solicitar que você instale um pacote linux-tools adicional (linux-tools -kernel_version ). perf também pode ser compilado em tools/perf no código-fonte do kernel. Consulte Pré-requisitos de perf_events para obter mais detalhes sobre como fazer com que perf_events funcione totalmente.
Requer um kernel com a opção CONFIG_DEBUG_FS habilitada. Tal como acontece com o FTRACE, isso já pode estar habilitado (debugfs foi adicionado em 2.6.10-rc3). O debugfs também precisa ser montado:
# mount -t debugfs none /sys/kernel/debug
Muitos de seus scripts usam awk e tentarão usar mawk ou gawk dependendo do comportamento desejado: mawk para saída em buffer (por causa de sua velocidade) e gawk para saída síncrona (como fflush() funciona, permitindo um agrupamento mais eficiente de escreve).
Estes são apenas scripts. Ou pegue tudo:
git clone --depth 1 https://github.com/brendangregg/perf-tools
Ou use os links brutos no github para baixar scripts individuais. Por exemplo:
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
Isso preserva as guias (que copiar e colar pode atrapalhar).
Ftrace foi adicionado pela primeira vez ao Linux 2.6.27 e perf_events ao Linux 2.6.31. Essas versões anteriores tinham bugs no kernel, e travamentos e pânicos foram relatados nos kernels da série 2.6.32. Isso inclui CentOS 6.x. Se você precisar analisar kernels mais antigos, essas ferramentas poderão ser úteis apenas em um ambiente tolerante a falhas, como um laboratório com problemas simulados. Essas ferramentas foram desenvolvidas principalmente no Linux 3.2 e kernels posteriores.
Dependendo da ferramenta, também pode haver sobrecarga. Veja a próxima seção.
perf_events está evoluindo. Esta coleção começou a ser desenvolvida por volta do Linux 3.16, com servidores Linux 3.2 como alvo principal, numa época em que perf_events carecia de certos recursos programáticos (por exemplo, agregações personalizadas no kernel). É possível que eles sejam adicionados em uma próxima versão do kernel. Até então, muitas dessas ferramentas empregam soluções alternativas, truques e hacks para funcionar. Algumas dessas ferramentas passam dados de eventos para o espaço do usuário para pós-processamento, o que custa uma sobrecarga muito maior do que agregações no kernel. A sobrecarga de cada ferramenta é descrita em sua página de manual.
AVISO : Em casos extremos , seu aplicativo de destino pode ser executado 5x mais devagar ao usar essas ferramentas. Dependendo da ferramenta e da versão do kernel, também pode haver o risco de kernel panics. Leia o cabeçalho do programa para obter avisos e teste antes de usar.
Se a sobrecarga for um problema, essas ferramentas podem ser melhoradas. Se uma ferramenta ainda não o fizer, ela poderá ser reescrita em C para usar perf_events_open() e mmap() para o buffer de rastreamento. Ele também poderia implementar contagens de frequência em C e operar diretamente em mmap(), em vez de usar awk/Perl/Python. Melhorias adicionais são possíveis para ferramentas baseadas em ftrace, como o uso de instantâneos e buffers por instância.
Algumas dessas ferramentas pretendem ser soluções alternativas de curto prazo até que existam mais recursos do kernel, momento em que podem ser substancialmente reescritas. Versões mais antigas dessas ferramentas serão mantidas neste repositório, para versões mais antigas do kernel.
Como meu alvo principal é uma frota de servidores Linux 3.2 que não possuem informações de depuração, essas ferramentas tentam não exigi-las. Às vezes, isso torna a ferramenta mais frágil do que o necessário, pois estou empregando soluções alternativas (que podem ser específicas da versão do kernel e da plataforma) em vez de usar informações debuginfo (que podem ser genéricas). Consulte a página de manual para pré-requisitos detalhados para cada ferramenta.
Tentei usar perf_events ("perf") sempre que possível, pois essa interface foi desenvolvida para uso multiusuário. Por vários motivos, muitas vezes precisei usar o ftrace. O ftrace é surpreendentemente poderoso (obrigado Steven Rostedt!), e nem todos os seus recursos são expostos via perf ou de uso comum. Esta coleção de ferramentas é, de certa forma, uma demonstração dos recursos ocultos do Linux usando o ftrace.
Como as coisas estão mudando, é muito possível que algumas ferramentas não funcionem na sua versão do kernel Linux. Algum conhecimento e montagem serão necessários para consertá-los.
Um estudo de caso e resumo:
Artigos relacionados: