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
- LibRastro Home Page: http://www.inf.ufsm.br/lsc/libRastro
Marcelo Veiga Neves < marcelo.veiga at gmail.com >
