DevSecOps

11 abr, 2013

Introdução a ferramenta LTTng: monitorando eventos em Linux

Publicidade

Rastreamento (tracing, em inglês) é uma técnica muito utilizada para análise de aplicações ou sistemas que consiste em monitorar a execução de uma aplicação ou ambiente ao longo do tempo, gerando informações detalhadas sobre sua interação com os recursos disponíveis e, então, permite descobrir os momentos em que a execução desvia do comportamento padrão esperado. Um exemplo de problema que pode ser detectado com rastreamento é o consumo exagerado da pilha de memória em um dado momento da execução de uma aplicação.

O LTTng compreende um conjunto de ferramentas usado para o monitoramento, visualização e análise tanto de aplicações (ou bibliotecas) quanto do próprio kernel do Linux. A palavra LTTng é um acrônimo para LTT (Linux Trace Toolkit) e “ng” (Next Generation).A versão 2.x compreende diversas melhorias em relação a geração anterior (1.x), tais como:

  • Uso de um formato para arquivo mais flexível e adequado para a quantidade de dados produzido, chamado CTF (Common Trace Format);
  • Introdução de rastreamento em nível de usuário (user-space tracing, em inglês) que permite monitoramento de aplicações e bibliotecas de sistema;
  • Nova implementação de um algoritmo de ring buffer, permitindo coleta e armazenamento de dados com maior eficiência e rapidez.

Existem outras ferramentas de rastreamento e monitoramento disponíveis para Linux, sendo as mais usadas o SystemTap e Dtrace, porém, LTTng possui algumas vantagens em relação a estas ferramentas, mais notadamente baixa sobrecarga no sistema e melhor usabilidade. Um comparativo completo entre LTTng, SystemTap e Dtrace pode ser encontrada em http://lttng.org/comparison-systemtap-and-dtrace.

Neste artigo será explicado como instalar e utilizar o LTTng para monitoramento de eventos e análise em ambiente Linux.

Compilando e instalando o LTTng

O LTTng, até o momento este artigo é escrito, está disponível em empacotes .deb para as distribuição Ubuntu e .rpm para OpenSuse Linux e Fedora 17. Entretanto, nesta seção do artigo ela será compilada e instalada a partir do seu código fonte, permitindo seu uso em outras distribuições Linux.

O código fonte do LTTng é versionado usando o sistema de versionamento git, mas, é dividido em componentes que são distribuídos em diferentes árvores, conforme é mostrado na tabela 1.

Os requisitos para sua compilação são as ferramentas GNU Autotools e Libtool, além do cliente git utilizado para clonar o código. Cada módulo pode conter dependência de binários ou bibliotecas de terceiros, portanto, é recomendável a leitura do arquivo README antes de executar os procedimentos de compilação apresentados a seguir.

Componente Descrição URL
liburcu Biblioteca que implementa mecanismo de RCU (Read-Copy-Update) em espaço de usuário (userspace) git://git.lttng.org/userspace-rcu.git
LTTng-Tools Cliente que controla execução do LTTng git://git.lttng.org/lttng-tools.git
LTTng-modules Módulos que habilitam tracing em kernel space. Até o presente momento, requer kernel headers >= 2.6.38 git://git.lttng.org/lttng-modules.git
LTTng-UST Habilita tracing de aplicações (userspace) git://git.lttng.org/lttng-ust.git
$ git clone git://git.lttng.org/lttng-tools.git
$ git clone git://git.lttng.org/lttng-modules.git
$ git clone git://git.lttng.org/lttng-ust.git
$ git clone git://git.lttng.org/userspace-rcu.git

O primeiro passo é compilar e instalar a biblioteca liburcu, conforme mostrado na listagem 2, pois esta será pré-requisito aos demais componentes.

$ cd userspace-rcu
$ ./bootstrap
$ ./configure
$ make
$ make install
$ sudo ldconfig

Os componentes lttng-ust e lttng-tools tem procedimentos similares de compilação, conforme mostrado na listagem 3. Já os módulos kernel são compilados e instalados usando comandos apresentados listagem 4.

Observação: até o momento que este artigo estava sendo escrito os módulos precisavam ser compilados utilizando um kernel com versão maior que 2.6.37, portanto, leia o README do componente para certificar que todas as dependências estão instaladas no ambiente.

# Compilando e instalando lttng-ust
#
$ cd lttng-ust
$ ./bootstrap
$ ./configure
$ make
$ make install
$ ldconfig

# Compilando e instalando lttng-tools
$ cd lttng-tools
$ ./bootstrap
$ ./configure
$ make
$ make install
$ ldconfig
# Compilando e instalando lttng-module
$ cd lttng-modules
$ make
$ sudo make modules_install
$ sudo depmod -a

Na listagem 4 é mostrado como alguns módulos do LTTng para o kernel do Linux devem ser compilados e instalados. Lembrando que é necessário ter instalado no ambiente os pacotes de headers e devel com exata versão do kernel rodando na máquina.

Após compilado e instalado no ambiente, a ferramenta pode ser testada executando o comand lttng --help. A saída deste comando irá mostra as opções de ajuda da ferramenta tal como mostrado na listagem 5.

LTTng Trace Control 2.1.0-rc5 - Basse Messe

usage: lttng [OPTIONS] <COMMAND> [<ARGS>]

Options:
  -h, --help                 Show this help
      --list-options         Simple listing of lttng options
      --list-commands        Simple listing of lttng commands
  -v, --verbose              Increase verbosity
  -q, --quiet                Quiet mode
  -g, --group NAME           Unix tracing group name. (default: tracing)
  -n, --no-sessiond          Don't spawn a session daemon
      --sessiond-path PATH   Session daemon full path

Commands:
    add-context       Add context to event and/or channel
    calibrate         Quantify LTTng overhead
    create            Create tracing session
    destroy           Tear down tracing session
    enable-channel    Enable tracing channel
    enable-event      Enable tracing event
    disable-channel   Disable tracing channel
    disable-event     Disable tracing event
    enable-consumer   Enable local or streaming consumer
    disable-consumer  Disable consumer
    list              List possible tracing options
    set-session       Set current session name
    start             Start tracing
    stop              Stop tracing
    version           Show version information
    view              Start trace viewer

Each command also has its own -h, --help option.

Please see the lttng(1) man page for full documentation.
See http://lttng.org for updates, bug reports and news.

Existe um passo adicional (pós-instalação) que precisa de ser efetuado para que um usuário não root possa efetuar monitoramento dos eventos de kernel. O lttng se vale de um daemon (automaticamente inicializado) para unificar a coleta de dados tanto em nível de kernel quanto userspace, assim, a principio, apenas ao usuário root é permitido acesso aos eventos de kernel. Entretanto, se o usuário faz parte do grupo tracing então ele terá permissão de acesso ao monitoramento do kernel do Linux assim, na listagem 6, é mostrado como o grupo é criado e o usuário adicionado em Fedora 17.

$ sudo groupadd -r tracing
$ sudo usermod -aG tracing <username>

Como controlar uma sessão de rastreamento
LTTng usa o conceito de sessão com comandos próprios para cada etapa do ciclo de monitoramento, conforme tabela 2.

Comando Descrição
create [NOME] Usado para criar uma sessão. Por padrão os arquivos de rastros serão gravados em ~/lttng-traces mas a opção -o pode ser usado para definir outro diretório.
set-session [NOME] Usado para trocar de sessões quando mais de uma existe. Define a sessão NOME como a atual.
start Usado para iniciar o rastreamento
stop Usado para parar o rastreamento
destroy [NOME] Usado para destrir uma sessão. A opção -a ou –all pode ser usada para destruir todas as sessões.
list [NOME] Usado para lista informações sobre a sessão NOME. Caso o nome da sessão for omitida, então ele irá listar todas as sessões disponíveis.

A listagem 7 mostra um ciclo completo de rastreamento usando lttng. Após a sessão ter sido iniciada (comando start) foi executado o comando para inicializar o navegador firefox em background (firefox &), assim, tal sessão ilustra como a inicialização de um aplicativo pode ser monitorada.

$ sudo lttng-sessiond &
$ lttng create demo_session
Session demo_session created.
Traces will be written in /home/wainersm/lttng-traces/demo_session-20121030-233238
$ lttng start
Tracing started for session demo_session
$ firefox &
$ lttng stop
Waiting for data availability
Tracing stopped for session demo_session
$ lttng destroy demo_session
Session demo_session destroyed

Importante notar que o primeiro comando executado (listagem 7) foi justamente para inicializar o daemon (lttng-sessiond) com permissão de usuário root para que um usuário normal do sistema, desde que adicionado apropriadamente ao grupo tracing, possa fazer monitoramento de eventos do kernel.

É possível iniciar/parar (start/stop) a sessão diversas vezes, inclusive adicionando ou removendo parâmetros de monitoramento, for exemplo, eventos (veja sessão “Como gerenciar os eventos em uma sessão de rastreamento” para mais informações sobre eventos).

Como gerenciar os eventos em uma sessão de rastreamento

A ferramenta também utiliza o conceito de eventos, produzidos pelo sistema operacional ou aplicação e, que são disponibilizados por meio de infraestruturas tais como Kernel Kprobe, Ftrace, tracepoints e também pelo hardware, neste caso os eventos gerados pelo PMU (Performance Monitoring Unit) do processador. Tais eventos são monitorados pela ferramenta a partir do momento que uma sessão é iniciada (veja comando start, tabela 2) e seus dados são coletados assim é possível rastrear informações que sobre IRQ, chamadas de sistema (syscalls, em inglês), atividades de alguns sub-sistemas do kernel (scheduling, networking, etc.) e contadores de performance de hardware.

Assim como o controle da sessão de rastreamentos, lttng provê um conjunto de comandos para gerenciar os eventos a serem monitorados. A tabela 3 lista todos os comandos usados para listar, adicionar e remover eventos de uma sessão.

Comando Descrição
list [-k] [-u] Usado para listar disponíveis eventos de kernel (-k) e/ou userspace (-u)
enable-event [opções] Usado para adicionar eventos. As [opções] servem para controlar quais eventos a serem adicionados na sessão. Por exemplo, as opções “-a -k –syscall” é usada para adicionar todos os eventos de chamadas de sistema (syscalls).
disable-event [opções] Usado para remover eventos. As [opções] servem para controlair quais eventos a serem removidos da sessão.
add-context -t [tipo] Usado para adicionar informações de contexto, dentro os [tipo] pré-definidos. No momento que este artigo é escrito, os [tipo] de contexto são pid, procname, prio, nice, vpid, tid, pthread_id, vtid, ppid, vppid assim como eventos PMU.

A listagem 8 mostra como listar todos os eventos de kernel disponíveis para a sessão de rastreamento.

$ lttng list -k
Kernel events:
-------------
      timer_init (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      timer_start (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      timer_expire_entry (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      timer_expire_exit (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      timer_cancel (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      hrtimer_init (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      hrtimer_start (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      hrtimer_expire_entry (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      hrtimer_expire_exit (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      hrtimer_cancel (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      itimer_state (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      itimer_expire (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      lttng_statedump_start (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      lttng_statedump_end (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      lttng_statedump_process_state (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      lttng_statedump_file_descriptor (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      lttng_statedump_vm_map (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      lttng_statedump_network_interface (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      lttng_statedump_interrupt (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      signal_generate (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      signal_deliver (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      signal_overflow_fail (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      signal_lose_info (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      sched_kthread_stop (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      sched_kthread_stop_ret (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      sched_wakeup (loglevel: TRACE_EMERG (0)) (type: tracepoint)
      sched_wakeup_new (loglevel: TRACE_EMERG (0)) (type: tracepoint)
 (…)

Normalmente o primeiro passo ao analisar o comportamento do sistema é simplesmente habilitar todos os eventos disponíveis e, então, iterativamente ir adicionando ou removendo eventos conforme os possíveis problemas vão ficando mais claros. Assim, a listagem 9 mostra como adicionar todos os eventos (kernel e usuário) disponíveis de uma só vez.

$ lttng enable-event -a -k
All kernel events are enabled in channel channel0

Como foi dito mencionado na tabela 3, lttng também possui o comando add-context para adicionar informação de contexto aos eventos monitorados. Tal dado pode ser usado para melhor entender quais entidades estão relacionadas a um determinado evento, por exemplo, qual processo foi criado em um determinado instante.

Analisando performance de aplicações com LTTng

Normalmente uma sessão de rastreamento produz uma quantidade grande de dados cujo interpretação torna-se praticamente impossível sem uso de ferramentas de visualização que podem usar várias técnicas tais como agrupamento e filtragem de dados. O LTTng disponibiliza as ferramentas descritas na tabela 4 para visualização e análise dos dados coletados.

Ferramenta Descrição Suporta CTF?
Babeltrace É uma biblioteca e ferramenta de linha de comando capaz de ler e converter os dados produzidos em diferentes formatos. Sim
LTTV Viewer É um visualizador gráfico (GTK+) que permite analisar dados produzidos pelo LTTng. Não
Eclipse TMF O plug-in para eclipse chamado TMF (Tracing and Monitoring Framework) permite também visualizar dados de rastreamento coletados pelo LTTng. Atualmente esta é a ferramenta que mais recebe investimento pela comunidade do LTTng. Sim

Neste artigo será abordado apenas o TMF para visualização de dados de rastreamento pois é atualmente a ferramenta com mais funcionalidades e investimentos por parte da comunidade. O plug-in TMF já vem instalado na última versão (4.2.1) do Eclipse IDE for C/C++ Developers, que pode ser baixado do site http://www.eclipse.org/downloads/

O primeiro passo para importar o arquivo de rastreamento é abrir a perspective do LTTng no Eclipse, clicando em Window >Open Perspective > Other e então selecionando a opção LTTng Kernel. A figura 1 mostra a perspectiva do LTTng no Eclipse.

image001 (1)

Com a perspectiva aberta é necessário então criar um novo projeto Eclipse, clicando no botão direito na aba de Project view (veja figura 1) e selecionando New > Tracing Project. Coloque um nome para o novo projeto e clique OK, resultando em um novo projeto como mostrado na figura 2.

image002

Agora basta importa os arquivos de rastreamento gerados em uma sessão, sendo possível associar ao projeto mais de um arquivo. Clique com o botão direito em Traces (veja figura 2) e então escolha Import. Uma nova janela irá aparecer aonde é necessário preencher com alguns dados tais como o caminho para o arquivo e o seu tipo (Generic CTF Trace ou Kernel Trace), veja figura 3.

image003

Para visualizar os gráficos, estatísticas e informações de monitoramento basta efetuar um duplo-clique no arquivo rastreamento que aparece na sob a seção Traces em Project Explorer, como indicado na figura 4.

image004

As informações coletadas durante a sessão de monitoramento são processadas e então exibidas em alto-nível uma tela de visualização como mostrado na figura 5.

image005

A figura 5 mostra que as informações de monitoramento são exibidos de várias formas diferentes, permitindo mais fácil navegação e visualização de grande quantidade de dados coletados. Os painéis são:

  • Control flow: informação dos processos monitorados em um dado instante;
  • Resources: informações do sistema tais como consumo de CPU e IRQ (soft ou hard);
  • Statistics: número de eventos capturados por tipo;
  • Events: todos os eventos capturados com informações tais como timestamp, tipo e conteúdo;
  • Histogram: histograma dos eventos monitorados

Recursos

Sobre o autor: Wainer dos Santos Moschetta – Graduado em Ciencias da Computação na Univerdade de São Paulo.Tem mais de 6 anos de experiência no desenvolvimento de ferramentas para migração e desenvolvimento em ambiente GNU/Linux.Atualmente é líder do projeto que desenvolve o IBM SDK for PowerLinux.