Geração de Rastros de Execução de Aplicações (libRastro)

De Wiki do Veiga

Tabela de conteúdo

Introdução

A biblioteca libRastro permite monitorar uma aplicação seqüencial ou paralela através do registro de eventos observados durante a sua execução, como por exemplo o envio ou recepção de mensagens, a criação de threads, etc. Em uma plataforma do tipo cluster, os eventos são registrados em cada nó para, após o término da execução, serem sincronizados e combinados em um único arquivo de rastros. Uma característica importante de libRastro é sua genericidade, isto é sua total independência em relação à aplicação que a utiliza, à biblioteca de comunicação empregada e à ferramenta de análise/visualização utilizada.

De fato, ao contrário de muitos geradores de rastros atrelados a uma ferramenta de comunicação ou visualização, libRastro não atribui semântica aos dados no momento do seu registro ou leitura. O conhecimento da semântica dos dados monitorados fica, assim, sob responsabilidade dos programas que utilizam esta biblioteca. Além disso, com o auxílio de um conversor dos arquivos gerados por libRastro, pode-se produzir rastros no formato de qualquer ferramenta de visualização. Trata-se, portanto, de uma biblioteca versátil, que já foi utilizada, por exemplo, para monitorar aplicações Java distribuías (JRastro);

Este texto tem como objetivo descrever o processo de instalação e utilização desta biblioteca e apresentar um exemplos de utilização.

Instalação

A ultima versão de libRastro pode ser obtida em http://www.inf.ufsm.br/lsc/libRastro (ou acesse uma cópia local http://veiga.eti.br/librastro/libRastro-29sep2005.tar.gz). A instalação pode ser feita como segue:

tar xzf libRastro.tar.gz 
cd libRastro

# configurar o diretório de destino da biblioteca no Makefile:
RASTRO_DIR=/usr/local/libRastro

make
make install

#colocar no PATH:
export RATRO_HOME=/usr/local/libRastro
export PATH=$RASTRO_HOME/bin:$PATH

Funções de Instrumentação

Para gerar os rastros de execução, é necessário instrumentar o programa com as funções providas pelas libRastro. Através dessas funções é possível registrar informações/eventos relevantes sobre a execução do programa. A seguir é apresentadas as funções necessárias para instrumentar um programa.


/* inicia o arquivo de rastro (id1 e id2 são identificadores para diferenciar os arquivos gerados)
 * deve ser chamada antes de qualquer outra função da biblioteca */
void rst_init(u_int64_t id1, u_int64_t id2);

/* registra somente o tipo do evento */
void rst_event(u_int16_t type);

/* registra o tipo do evento, com informações adicionais */
void rst_event_[tipos](u_int16_t type, tipo1 dado1, tipo2 dado2, ...);

/* Os tipos suportados são:
	c - 8 bits
	w - 16 bits
	i - 32 bits
	l - 64 bits
	f - float
	d - double
	s - string
*/

/* Finaliza o rastreamento */
void rst_finalize(void);

Os tipos de dados das informações adicionais podem ser combinados, gerando diferentes chamadas de funções. A seguir, são apresentados alguns exemplos de chamadas:

    /* registrando evento 1 */
    rst_event(1);

    /* registrando evento 1, com a informação adicional do tipo inteiro */
    rst_event_i(1, 2);

    /* registrando evento 1, com dois inteiros, uma string e um float*/
    rst_event_iisf(1, 2, 3, "string", 2.5);

Exemplo de utilização

A seguir é mostrado um programa de exemplo instrumentado para registrar diferentes conjuntos de informações.

#include <stdio.h>

int main(int argc, char *argv[])
{
    rst_init(10, 20);
    
    printf("Hello!\n");

    rst_event(1);
    rst_event_lws(2, 1, 2, "3");
    rst_event_wlsfcd(3, 1, 2, "3", 4, '5', 6);
    rst_event_iwlsifcd(4, 1, 2, 3, "4", 5, 6, '7', 8);

    rst_finalize();

    return 0;
}

Antes de compilar o programa, é necessário gerar as funções que foram utilizadas. Para isso utiliza-se o script rastro_get_names.sh, que faz parte do pacote da biblioteca libRastro, passando como parâmetro o arquivo fonte instrumentado e um nome de arquivo para ser gerado (Obs: o script rastro_get_names.sh requer o shell bash!).

rastro_get_names.sh program.c rst_funcs

Incluir o arquivo rst_funcs.h gerado no arquivo fonte instrumentado e compilar:

gcc -o exe program.c rst_funcs.c -I$(RASTRO_HOME)/include/ -L$(RASTRO_HOME)/lib/ -lrastro -DTHREADED -lpthread 

Executar o programa normalmente, será gerado um aquivo de rastro com o nome rastro-10-20.rst. Onde 10 e 20 são os identificadores informados na função rst_init().

./exe
Hello!

ls rastro-10-20.rst

O arquivo de rastro .rst está no codificado no formato na libRastro.

Sincronização de Relógios

Em uma plataforma do tipo agregado, os eventos são registrados em cada nó de acordo com o relógio local para, após o término da execução, serem combinados em um único arquivo de rastros e sincronizados com um relógio de referência. Esta sincronização é descrita a seguir.

Antes de executar a aplicação:

rastro_timesync localhost host1 host2 ... > timesync.txt

Depois de executar a aplicação:

rastro_timesync localhost host1 host2 ... >> timesync.txt

Referências


Marcelo Veiga Neves < marcelo.veiga at gmail.com >

Ferramentas pessoais