Relatório Final Identificação Grande Área CNPq: Ciências Exatas e da Terra Área CNPq: Telemática Título do Projeto: Desenvolvimento de um protocolo leve para “cluster” de computadores Diretório de Grupos CNPq: Grupo de Sistemas Inteligentes Linha de pesquisa do Grupo: Recuperação Inteligente de Informações Pesquisador Responsável: Sérgio Antônio Andrade de Freitas Nome do sub-projeto do aluno: Implementação de um protocolo de redes leve para o “cluster” de computadores do Departamento de Informática Nome do Bolsista: Jaci Alves de Souza Júnior 2 1) INTRODUÇÃO O computador é uma ferramenta poderosa para se resolver problemas, desde a sua criação a ciência tem trabalhado para aumentar o seu poder de processamento, tornando essa máquina cada vez mais eficiente. Mas ainda assim há problemas que, devido à sua complexidade, demandam uma quantidade de processamento tão grande que um único computador levaria anos para resolvê-los. Uma das técnicas usadas para resolver este problema é o processamento paralelo [9] que consiste em dividir o problema em partes menores que serão processadas ao mesmo tempo (paralelamente) em vários computadores. A esse conjunto de máquinas interligados em uma rede local [10] dá-se o nome de cluster [2]. Um cluster é um conjunto de máquinas (com a mesma configuração ou não), que se comunicam através de uma rede de interconexão cujo poder de processamento pode ser semelhante a de um supercomputador, porém a um custo bem menor. Durante o processamento essas máquinas necessitam de trocar mensagens entre si, sendo que, dependendo do problema a ser resolvido, o número de mensagens trocadas é muito grande. Se a comunicação entre os computadores não for suficientemente rápida, o cluster pode passar mais tempo trocando mensagens do que resolvendo o problema propriamente dito. Portanto é importante que a rede local que interliga cada computador e o protocolo utilizado na comunicação sejam eficientes. O Departamento de Informática da UFES adquiriu, através do edital do CTPETRO, um cluster de 64 máquinas ( também chamadas de nós ), cada uma delas com um processador Athlon XP 1800 MHz, memória RAM de 256MB, disco rígido de 20GB e interface de rede ethernet 3Com de 100Mbits. Dois switches 3Com Super Stack3 4300 de 48 portas chaveados por um link GigaBit, interligam as máquinas na rede. O sistema operacional é o Red Hat Linux 7.1 com a versão do kernel 2.4-18-27.7x. Atualmente o cluster do departamento de Informática é o mais rápido do Brasil, e se encontra na 50ª posição do rank mundial segundo o site clusters.top500.org. Em testes de desempenho realizados em fevereiro de 2003 esse supercomputador atingiu a marca de 51Gflps (51 bilhões de operações de ponto-flutuante por segundo). Mais informações sobre o cluster do Departamento de informática podem ser encontradas no site do Laboratório de Computação de Alto Desempenho (LCAD)1 onde o cluster esta montado. 1 Endereço eletrônico do LCAD: http://www.inf.ufes.br/~lcad 3 O protocolo de comunicação utilizado neste cluster, até o momento, é o TCP/IP [11]. Este protocolo foi originalmente criado para interligar máquinas na Internet [11], que é, por natureza, uma rede complexa e heterogênea, onde as mensagens que trafegam podem facilmente se perder no meio do caminho ou então serem atrasadas se o caminho estiver congestionado ou ainda podem chegar ao destino contendo erros. O protocolo TCP/IP trata todos esses possíveis erros e garante que a mensagem chegará correta ao seu destino. Ao contrário da Internet, a rede de interconexão do cluster é um ambiente controlado, homogêneo e confiável ( com uma taxa de erro pequena ), não necessitando de um protocolo tão robusto quanto o TCP/IP [11]. Baseado no fato de que o protocolo TCP/IP não é o mais apropriado para um ambiente controlado, José Carlos Campana Filho [1], propôs em seu projeto final de graduação um novo protocolo de comunicação para o cluster denominado TCPCamp. Em seguida, Oziander Paula Nunes [5], realizou testes comparativos com simulações do TCP/IP e do TCPCamp no ambiente do cluster do DI. Através deste projeto de iniciação científica foi dada a continuidade a essa linha de pesquisa dentro do Departamento de Informática da Ufes. O objetivo deste trabalho é de otimizar a troca de mensagens entre os nós do cluster do DI: (1) reduzindo o tamanho do cabeçalho de cada pacote, o que aumenta a quantidade de dados enviados em cada um deles, (2) simplificando o processo de detecção de erros, o que implica em acelerar o empacotamento dos dados a serem enviados e (3) reduzindo o número de pacotes de confirmação, ou seja, ao invés de se fazer a confirmação de um único pacote, pode-se confirmar o recebimento de um conjunto de pacotes. A justificativa para este projeto é que o cluster do Departamento de Informática da UFES é usado para aplicações tais como: simulação de poços de petróleo, simulação da distribuição de poluentes na atmosfera, processamento de texto em larga escala, cálculo em águas profundas , algoritmos genéticos para o problema do cacheiro viajante entre outras. Essas aplicações são executadas ao mesmo tempo e cada uma delas utiliza os recursos de várias máquinas do cluster que se comunicam entre si, tornando a troca de mensagens muito intensa. Vale ainda ressaltar que a utilização dos recursos dessa máquina esta disponível para toda a comunidade acadêmica do brasil, já existem aplicações de pesquisadores vinculados a outras instituições de pesquisa em outros estados sendo executadas no cluster do DI. Otimizar o processo de comunicação entre as máquinas do cluster contribui para acelerar a execução de cada aplicação e 4 conseqüentemente para uma melhor a utilização dos recursos do cluster do DI pela comunidade acadêmica. O trabalho foi dividido em duas etapas: I – Avaliação (simulação) dos modelos propostos por Campana [1] no ambiente do cluster com subsequente extensão/adaptação dos mesmos. II – Implementação do modelo resultante da fase I através de um módulo dinâmico [7] [8] para o kernel do linux. A fase de avaliação foi concluída em janeiro de 2003. Da adaptação dos modelos avaliados foi proposto um outro protocolo de comunicação: CCP (Cluster Communication Protocol) para ser implementado na fase seguinte. A fase de implementação teve início em fevereiro de 2003 e o resultado dessa fase é um módulo dinâmico carregável [7] [8] que provê as funcionalidades do CCP e que pode ser acoplado ao kernel do sistema operacional linux, este módulo foi escrito na linguagem de programação C. Este relatório está assim estruturado: na seção 2 é feita uma breve descrição dos modelos TCPCamp e os resultados da sua avaliação. A seção 3 é dedicada ao funcionamento do protocolo CCP (Cluster Communication Protocol), que é um aprimoramento do TCPCamp. A seção 4 mostra detalhes da implementação do CCP em baixo nível, na seção 5 são apresentados os resultados dos testes realizados com CCP e na seção 6 as conclusões da análise desses resultados. 2) OS MODELOS TCPCAMP E SUA A AVALIAÇÃO Os modelos proposto por Campana [1] descrevem 4 protocolos que foram baseados nos protocolos TCP/IP e RTP [6]: 1 - TCPCamp Mínimo, com o menor tamanho de cabeçalho, não possui aviso de recebimento nem controle de erros, esse protocolo foi modelado para se obter o máximo de desempenho na comunicação. 2 - TCPCamp Padrão, é semelhante ao protocolo TCP/IP, seu cabeçalho é uma adaptação do cabeçalho TCP e do cabeçalho IP, possui procedimento simplificado para a detecção de erros (bit de paridade) e confirmação de recebimento para cada pacote enviado. 5 3 - TCPCamp JV (janela variável), que é derivado do modelo padrão, possui mesmo cabeçalho e comportamento que o anterior a exceção de um parâmetro a mais (tamanho de janela) que indica quantos pacotes podem ser enviados antes de esperar por um pacote de confirmação (ack ), o que diminui o tráfego de pacotes na rede. 4 - TCPCamp CDV (campo de dados variável) também derivado do modelo padrão, possui um parâmetro que permite especificar qual o tamanho do campo de dados a ser enviado em cada pacote, esta flexibilidade é importante porque para uma quantidade pequena de dados é melhor transmitir mensagens pequenas enquanto que para uma grande porção de dados, aumentar o tamanho das mensagens é mais vantajoso. Os modelos TCPCamp foram primeiramente avaliados por Campana, através de testes realizados com apenas duas máquinas fora do ambiente do cluster. Os testes foram realizados com simulações de cada um dos modelos TCPCamp e também uma simulação do TCP/IP, todas as simulações usam em nível mais baixo, para a transmissão real de dados , sockets TCP/IP. Os resultados obtidos por Campana comprovaram que os modelos TCPCamp tinham uma melhor performace em relação ao TCP/IP, sendo que o modelo TCPCamp Mínimo obteve os menores tempos, seguido do modelo de janelas variáveis (TCPCamp JV). Com a chegada do cluster ao Departamento de Informática, Oziander Paula Nunes [5] deu continuidade ao trabalho de avaliação desses modelos, realizando no ambiente do cluster os mesmos testes de Campana, porém, com grugos de 4,8,16,32 e até 64 máquinas clientes enviando arquivos para uma única máquina servidora. Da análise dos resultados pôde-se concluir que o TCPCamp Mínimo é a melhor solução para implementação, mas não é apropriado para qualquer tipo de rede, visto que não garante correção de erros, já o protocolo TCPCamp aproxima-se do protocolo TCP/IP para arquivos pequenos com poucas máquinas, mas se mostra mais eficiente à medida que o tamanho do arquivo e o número de máquinas aumenta. O protocolo TCPCamp JV mostrase mais eficiente quanto maior for o tamanho da janela, vale lembrar que escolha do tamanho da janela deve levar em conta a quantidade de memória RAM disponível, visto que quanto maior a janela maior será a quantidade de memória reservada para cada conexão, semelhantemente o protocolo TCPCamp CDV mostra-se mais eficiente quanto maior for o tamanho do campo de dados, tamanho este limitado pelo tamanho máximo de um frame Ethernet: 1500 bytes. 6 3) O CLUSTER COMMUNICATION PROTOCOL (CCP) Baseado nos modelos TCPCamp e nos resultados da avaliação dos mesmos foi proposto um novo protocolo: CCP (Cluster Communication Protocol). Nas subseções a seguir é apresentado o seu funcionamento detalhando aspectos da hierarquia de camadas, do cabeçalho de pacotes do CCP, do controle de erros e do controle de fluxo. 3.1) Hierarquia de Camadas CCP Para facilitar o entendimento estrutural do CCP está esquematizado na fig. 1 a hierarquia de camadas das arquiteturas de rede TCP/IP, TCPCamp e CCP. Camada de Transporte ( TCP ) Camada de Rede ( IP ) Camada de Enlace Camada de Transporte ( TCPCamp ) Camada de Rede ( IpCamp ) Camada de Enlace Camada de Transporte ( CCP ) Camada de Enlace Camada Física Camada Física Camada Física Arquitetura TCP/IP Arquitetura TCPCamp Arquitetura CCP Fig. 1: Hierarquia de Camadas A arquitetura de rede da Internet (TCP/IP) está organizada em quatro camadas: Camada de Transporte (TCP) cuja função é estabelecer uma comunicação confiável fima-fim entre a entidade transmissora e a receptora, Camada de Rede (IP) que é responsável pelo endereçamento lógico e roteamento dos pacotes, Camada de Enlace (SLIP, PPP, Ethernet, FastEthernet, etc. ) responsável pela comunicação entre máquinas fisicamente conectadas e a Camada Física cuja função é transmitir bits. Semelhantemente, a arquitetura TCPCamp está organizada em quatro camadas onde cada uma delas desempenha o mesmo papel de sua correspondente na arquitetura TCP/IP. Já a arquitetura CCP não possui a camada de rede, resultando numa hierarquia de apenas 3 camadas, ou seja , o processo de envio e recebimento de pacotes na arquitetura CCP possui uma etapa a menos tornando essa arquitetura mais eficiente que as outras duas. 7 3.2) O cabeçalho de pacotes CCP Uma das idéias básicas do TCPCamp é a redução do tamanho dos cabeçalhos TCP e IP, que somados resultam num montante de 40 bytes, através da eliminação/redução de alguns campos desses cabeçalhos. A economia é a 28 bytes para o cabeçalho do TCPCamp Minimo e de 16 bytes para os outros modelos. O tamanho do cabeçalho do CCP é de 6 bytes o que representa uma economia de 34 bytes em relação cabeçalho ao TCP/IP, ou seja, cada pacote CCP pode enviar até 34 bytes de dados a mais que um pacote TCP/IP o que significa que para uma transmissão de 10MB de informação, seriam necessários aproximadamente 7.250 pacotes TCP/IP ou 7.080 pacotes CCP. A seguir ilustramos o cabeçalho CCP. tipo 3 bits ack_this parity 1 bit num. sequência 1 bit 11bits Porta Origem 16bits Porta Destino 16bits DADOS Fig. 2: Cabeçalho CCP /*----------------------------------------------------------------------------------------------------------------------------*/ typedef struct header { __u16 type:3, /* {data,ack,nack,sleep,wake_up,ini,fin} ack_this:1, /* flag de req. de ack parity:1, /* bit de paridade nseq 11; /* seq number __u16 sport; /* source port __u16 dport; /* destination port */ */ */ */ */ */ }header; /*-------------------------------------------------------------------------------------------------------------------------*/ Fig. 3: Estrutura C do Cabeçalho CCP TIPO: Pode assumir um valor DATA, ACK, NACK, SLEEP, WAKE_UP, INI ou FIN, usado para identificar o tipo do pacote, ou seja , qual tratamento deve ser dado a ele. ACK_THIS: Indica ao receptor que o pacote é o último da janela. 8 PARITY: Bit de paridade, serve para identificar erros. NUMERO DE SEQUÊNCIA: Número de identificação do pacote. PORTA ORIGEM : Número que identifica o canal de comunicação na máquina que enviou o pacote (remetente). PORTA DESTINO: Número que identifica o canal de comunicação na máquina que receberá o pacote (destinatário). O principal motivo do tamanho reduzido desse cabeçalho é a eliminação de todos os campos do cabeçalho IP, isso é possível porque o protocolo IP (Internet Protocol), foi projetado para permitir a interconexão de redes de computadores que utilizam a tecnologia de comutação de pacotes. O ambiente inter-rede consiste em hosts (computadores) conectados através de hubs e swicthes, criando uma rede local, que por sua vez, é interligada através de routers (roteadores) a outras redes, a função do IP é rotear pacotes de uma rede para outra. A rede de comunicação do cluster é composta de apenas uma rede local, ou seja, os pacotes não precisam ser roteados pelo protocolo IP para chegarem a estação destino. A tarefa de endereçamento é realizada pelos switches que interligam os nós do cluster. Dado um pacote com seu endereço destino MAC (endereço físico da placa de rede) o switch é capaz de encaminhá-lo corretamente ao seu destino. Outro fator que contribuiu para a diminuição do cabeçalho CCP, foi a redução do tamanho do número de seqüência de 32 bits para 11 bits e a eliminação do campo acknowledgment number (ack), também de 32 bits, que está presente no cabeçalho TCP/IP, que possibilita o uso da técnica piggybacking [12], a qual permite que um pacote de confirmação (ack) venha de “carona” com um pacote de dados. 3.3 ) Fluxo Normal do CCP O funcionamento básico do CCP (fig. 4) é semelhante ao do TCPCamp: A entidade transmissora envia um conjunto de n pacotes ( janela de tamanho n) e espera a confirmação do recebimento dos pacotes enviados, esse processo se repete até que toda a informação (em forma de pacotes) tenha sido transmitida. O número de seqüência que é usado para identificar os pacotes não precisa ser maior que 2n, número suficiente para que o receptor possa fazer distinção entre pacotes da janela i e os pacotes da janela i +1. Transmissor Transmissão: Janela 01 9 Receptor Pacote 01 . . . Pacote n recepção esperando ack ack Transmissão: Janela 02 Pacote n+1 . . . Pacote 2n recepção esperando ack ack Transmissão: Janela 03 . . . Pacote 01 . . . . . . Fig. 4: Fluxo Normal do CCP 3.4) Controle de Erro Mesmo um ambiente controlado como a rede de interconexão do cluster não está livre de erros. Alguns pacotes podem simplesmente não chegar ao seu destino, ou então serem distorcidos/corrompidos durante o seu trajeto até o destino. Ao receber o último pacote da janela (último pacote enviado pelo transmissor antes de esperar pelo ack ), o receptor checa se todos pacotes chegaram corretamente, em caso negativo, ou seja, um ou mais pacotes não chegaram ao destino, o receptor sinaliza ao transmissor, através do envio de um pacote do tipo nack, quais pacotes se perderam pelo caminho. Ao receber um nack, o transmissor retransmiti somente os pacotes cujos números de seqüência estão contidos no nack. Surge um problema quando o último pacote da janela se perde: ambos, transmissor e receptor, ficam parados esperando um pelo outro, o primeiro fica em espera pelo ack e o segundo, por sua vez espera pelo último pacote da janela(que se perdeu) para então enviar o ack ao primeiro, essa situação de espera mútua por tempo indefinido 10 é chamada de deadlock. O mesmo problema ocorre quando um ack ou nack se perde no caminho de volta. Para resolver este o problema de deadlock a estação transmissora agenda uma retransmissão do último pacote da janela, caso um ack ou nack não chegue num certo intervalo de tempo o último pacote é então retransmitido. Pacotes corrompidos são detectados através do código de correção de erros, que no caso do CCP se resume a apenas um bit de paridade, ao identificar um pacote com erros a entidade receptora despreza-o. A fig. 5 é um esquema do controle erros do protocolo CCP. Transmissor Receptor Pacote 01 Transmissão: Janela 01 Pacote 02 Pacote 03 . . . Pacote n esperando ack erro erro recepção enviando nack nack Retransmissão: Pacote 01 Pacote 02 recepção ack Fig. 5: Controle de Erros 3.5) Controle de Fluxo O controle de fluxo é necessário quando a estação transmissora envia pacotes mais rapidamente do que a estação receptora pode receber. Antes de enviar um ack à entidade transmissora, o receptor verifica em seu buffer interno de armazenamento se há espaço suficiente para armazenar mais uma janela de pacotes, em caso negativo é enviado ao transmissor um pacote do tipo sleep, ao invés do ack. Quando estiver pronto para receber 11 uma nova janela o receptor envia um pacote wake_up (veja a fig. 6) ao transmissor, e a comunicação segue seu fluxo normal. Transmissor Receptor Pacote 01 Transmissão: Janela 01 Pacote 02 Pacote 03 . . . recepção Pacote n esperando ack Pouco espaço no buffer de armazenamento sleep “Dormindo” wake_up Fig. 6: Controle de Fluxo 4) A IMPLEMENTAÇÃO DO CPP Um protocolo de comunicação para rede de computadores é um conjunto de funcionalidades que viabilizam a comunicação entre duas máquinas. Essas funcionalidades precisam ser agrupadas e adicionadas ao sistema operacional de cada computador, dessa forma os usuários podem, através de chamadas de sistema (system call), tirar proveito dessas novas funcionalidades agora disponibilizadas pelo sistema operacional. A maneira mais fácil de se adicionar novas funções ao sistema operacional Linux é através de módulos dinâmicos [7] [8] que podem ser acoplados(ou desacoplados) dinamicamente ao kernel do sistema sem a necessidade de recompilar todo o kernel ou 12 de se reinicializar a máquina. Um exemplo do uso de módulos são os drivers de dispositivos de E/S [7] como placas de vídeo, placas de som, interfaces de rede etc. KERNEL KERNEL CCP Fig. 7: Adicionando o módulo CCP ao kernel A implementação2 do protocolo CCP baseou-se nessa idéia, ou seja, foram criados dois módulos dinâmicos para o Linux: o primeiro, cujo o código fonte está armazenado no arquivo ccp.c, provê as funcionalidades de comunicação do protocolo e o segundo, um char driver[7] armazenado no arquivo interface.c, que provê acesso a essas funcionalidades através do arquivo /dev/ccp. Para que um usuário possa enviar ou receber dados usando o protocolo CCP, basta abrir esse arquivo e escrever ou ler diretamente do descritor. Uma outra maneira de prover acesso as funcionalidades do protocolo CCP seria através das chamadas de sistema (system call). Essa não foi a opção escolhida pois para se adicionar uma nova chamada de sistema seria necessário recompilar o kernel do sistema operacional. 4.1) A Máquina de estado finitos CCP O protocolo CCP foi especificado através de uma máquina de estados finitos [4]. Além de facilitar a compreensão do comportamento funcional do protocolo, a máquina de estados finitos ajuda a estruturar o código de implementação, tornando-o mais claro e manutenível visto que o diagrama de transição de estados da máquina serve como um mapa para implementação. Por isso o protocolo CCP foi implementado como uma máquina de estados finitos. O diagrama de transição de estados, referente ao remetente (processo de envio) é apresentado na figura 8. 2 O código fonte do protocolo CCP pode ser encontrado na url: http://www.inf.ufes.br/~jjunior/ccp 13 pacote ini INICIO CONEXÃO requisição de envio ENVIANDO envio de uma janela ESPERANDO ACK tempo de retrans. expirado chegada de um sleep chegada de um ack “DORMINDO” ACK RECEBIDO ACK_TIMEOUT chegada de um ack chegada de um wake_up tempo de retrans. expirado tempo de retrans. expirado 10 vezes pacote fin CONNECTION_TIMEOUT FIM CONEXÃO Fig. 8: A Máquina de estados finitos CCP O estabelecimento de uma conexão (INICIO CONEXÂO) tem início com a envio de um pacote do tipo ini, então uma estrutura de dados é alocada na memória principal para guardar as informações referentes a essa conexão, como por exemplo o estado atual. A partir desse momento requisições de envio de informações podem ser solicitadas. Quando uma solicitação ocorre o estado atual da máquina é atualizado para ENVIADO, e os pacotes da primeira janela começam a ser enviados. Após o envio do último pacote da janela o estado corrente é alterado para ESPERANDO ACK no qual nenhuma ação é realizada até a chegada de um pacote do tipo ack. Se nenhum erro ocorrer e o destinatário estiver pronto para receber uma nova janela (espaço no buffer interno) um ack é enviado ao remetente confirmando o recebimento dos pacotes da janela enviada. 14 Ao receber o pacote de ack o estado atual é atualizado para ACK RECEBIDO, estando novamente pronto para enviar uma nova janela de pacotes. 4.2) Acesso à Camada de Enlace Antes de começar a implementação do módulo CCP foi necessário conhecer algumas funções de acesso aos serviços da camada de enlace disponibilizadas pelo kernel do linux e também pelo driver da placa de rede. Dentre essas funções, as principais são aquelas responsáveis pelo envio e recebimento de frames ethernet [12] [3]. No tutorial Adding a new protocol in LINUX [13] há uma descrição detalhada dessas funções utilizadas para enviar e receber frames ethernet, além de um exemplo de como adicionar um novo protocolo ao nível da camada de rede à versão 2.4 do kernel do linux. Esse tutorial foi traduzido para a língua portuguesa e aprimorado durante este projeto de iniciação científica e está disponível na Internet3. 4.3) Principais funções do kernel utilizadas Dentre as funções disponibilizadas pelo kernel do sistema operacional Linux utilizadas no módulo CCP, pode-se destacar: • dev_alloc_skb (int tam) : esta função aloca um pacote do tamanho desejado. • dev->hard_header (...) : Função do driver da placa de rede que dado um pacote e os endereços origem e destino, constrói o cabeçalho ethernet para o pacote. • dev_queue_xmit (sk_buff* pacote): Coloca um pacote numa fila de saída para ser enviado pela placa de rede. • dev_add_pack (...): Transfere um pacote do driver do dispositivo para o módulo CCP. 4.4) Principais funções implementadas Grande parte do trabalho realizado pelo módulo CCP que possibilita troca de informação entre duas ou mais máquinas, é realizado por apenas duas funções: 3 http://www.inf.ufes.br/~jjunior/tutorial 15 • ccp_output ( ccb * conexao, unsigned char * dados , int tam) A função ccp_output recebe um ponteiro para uma conexão e uma porção de dados de envio, em seguida aloca na memória um pacote preenche seu cabeçalho e o seu campo de dados, o pacote é então colocado numa fila para posteriormente ser enviado pela placa de rede. Se o pacote em questão for o último da janela a função agenda a retransmissão do pacote e põe o processo usuário para dormir esperando pelo ack. O processo se repete até que toda a porção de dados tenha sido enviada. • ccp_input ( struct sk_buff *pacote) A função ccp_input recebe como parâmetro um pacote e é chamada diretamente pelo kernel. Quando um pacote chega à interface de rede, esta lança uma interrupção indicando a chegada de um pacote. O sistema operacional assume o processador para tratar a interrupção chamando o driver do dispositivo que irá salvar o pacote em alguma região na memória. Através de uma chamada a ccp_input o kernel passa o pacote recebido para o módulo CCP. O que essa função faz é identificar a conexão a qual pertence o pacote e tratá-lo conforme o seu tipo e o estado atual da conexão. Por exemplo, se o pacote é do tipo ack e o estado correte da conexão a qual ele está relacionada é ESPERANDO ACK, a função ccp_input simplesmente atualizará o estado da conexão para ACK RECEBIDO. 16 5) TESTES E RESULDADOS 5.1)Testes de Correção Foram realizados alguns testes especificos para verificar a correção do protocolo CCP. Algumas porções de código foram intencionalmente introduzidas no módulo para provocarem erros tais como: • Perda de um ou mais pacotes de dados (DATA). • Perda da de um pacote de dados com um flag ack_this. • Perda de um pacote do tipo ack . • Perda de um pacote do tipo nack . • Perda de um pacote do tipo sleep. Esses erros são os mais freqüentes numa rede heterogênea. Em todas essas situações o protocolo se comportou como o esperado, tratando esses erros corretamente. Outros erros tais como: Perda de um pacote do tipo wake_up e pacotes corrompidos não foram testados visto que seu tratamento ainda não havia sido devidamente implementado no módulo CCP. 5.1)Testes de Desempenho Para testar o desempenho do protocolo CCP e compará-lo ao protocolo TCP/IP foram implementados 4 programas ( 2 servidores e 2 clientes ) capazes de transferir arquivos entre duas máquinas, dois deles utilizando comunicação TCP/IP (tcpServer/tcpClient) e os outros dois utilizando comunicação CCP (ccpServer/ccpClient). Todos os testes foram realizados no ambiente do cluster mas com apenas duas máquinas, porque a noção de portas lógicas ainda não havia sido implementada no módulo CCP o que não permitia a comunicação de uma mesma máquina com várias outras. Nos primeiros testes realizados os programas que utilizavam o protocolo CCP, para arquivos de 10MB, foram 4 vezes mais lento do que os outros que utilizavam TCP/IP. Isso ocorreu devido a um erro no módulo CCP que fazia o remetente esperar por um pacote do tipo ack após o envio de um pacote de dados, semelhante a uma janela de tamanho 1. 17 Após a correção desse erro, o protocolo CCP se mostrou mais eficiente que o protocolo TCP/IP na transferência de arquivos grandes (10MB) porém para arquivos menores, de 2MB, foi um pouco mais lento. Os Testes de desempenho foram realizados em duas máquinas do cluster com transferência de arquivos de 2MB, 4MB e 10MB. Foram usados dois valores para o tamanho da janela do protocolo CCP: 10 e 40 pacotes. Os resultados dos testes podem ser conferidos na tabela 1 e 2. A tabela 1 apresenta e compara os valores dos testes obtidos com o protocolo CCP variando apenas o tamanho da janela. A tabela 2 apresenta e compara os valores dos testes obtidos com o protocolo CCP (janela=40) e TCP/IP. PROTOCOLO CCP (janela=10) PROTOCOLO CCP (janela=40) Tam. MÉDIA Tam. MÉDIA Arquivo Arquivo Tempo (s) Tempo (s) 2MB 0.242 2MB 0.219 4MB 0.475 4MB 0.436 10MB 1.183 10MB 1.081 DIFERENÇA ENTRE OS PROTOCOLOS Tam. DIFERENÇA ENTRE AS MÉDIAS Arquivo Tempo (s) 2MB 0.023 4MB 0.039 10MB 0.102 Tabela 1: Comparação entre os resultados dos testes do CCP variando a janela. Os resultados dos testes comprovaram que o aumento da janela pode tornar o protocolo CCP mais eficiente. Para cada um dos arquivos enviados, o ganho obtido, em média, foi de um pouco menos de 10% na mudança de tamanho da janela de 10 para 40 pacotes. Porém deve se ressaltar que o número de retransmissões aumentou significantemente com o aumento da janela, o que implica dizer que o aumento exagerado do tamanho da janela pode tornar o processo de comunicação mais lento, além de sobrecarregar a rede com várias retransmissões de pacotes. 18 PROTOCOLO CCP (janela=40) PROTOCOLO TCP/IP Tam. Tam. MÉDIA MÉDIA Arquivo Arquivo Tempo (s) Tempo (s) 2MB 0.219 2MB 0.205 4MB 0.436 4MB 0.881 10MB 1.081 10MB 1.787 DIFERENÇA ENTRE OS PROTOCOLOS Tam. DIFERENÇA ENTRE AS MÉDIAS Arquivo Tempo (s) 2MB -0.014 4MB 0.445 10MB 0.706 Tabela 1: Comparação entre os resultados dos testes do CCP e TCP/IP O protocolo CCP foi aproximadamente 51% mais eficiente que o TCP/IP na transferência de arquivos de 4MB, e quase 40% mais rápido na transmissão de arquivos de 10MB. Esses resultados já eram esperados pois haviam sido profetizados pelos resultados obtidos com a avaliação dos modelos TCPCamp. Nota-se, porém, que com o aumento do tamanho do arquivo a eficiência do CCP em relação ao TCP/IP diminui, isso acontece porque o número de retransmissões aumenta a medida que aumenta a quantidade de informação sendo transmitida. O TCP/IP foi aproximadamente 7% mais eficiente que o protocolo CCP na transferência de arquivos de 2MB, o que não era esperado. Uma possível razão é o fato de que, ao contrário do CCP, o protocolo TCP/IP teve um comportamento muito variado, sendo que alguns dos tempos de envio de um mesmo arquivo tiveram uma discrepância de mais de 400%. Provavelmente os testes realizados com o arquivo de 2MB não foram suficientes para capturar o comportamento médio do TCP/IP. 6) DISCUSSÃO/CONCLUSÕES Conforme já havia sido previsto através das avaliações dos modelos TCPCamp, o protocolo CCP (derivado desses modelos) é mais eficiente que o TCP/IP. A redução do tamanho de cabeçalho e do número de pacotes de confirmação se traduz em uma economia que pode chegar a mais de 50%. O objetivo desse projeto de iniciação científica foi alcançado, através da utilização do protocolo implementado, a troca de mensagens entre os nós do cluster do Departamento de Informática pode ser otimizada. Deve-se ressaltar que a proposta inicial era a implementação funcional dos modelos TCPCamp, no entanto os resultados da avaliação desses modelos mostraram 19 que era possível simplificar ainda mais o processo de comunicação que envolve os nós do cluster. Baseado nessa conclusão um novo protocolo foi elaborado e chamado CCP(Cluster Communication Protocol). O protocolo CCP consiste em uma simplificação dos modelos TCPCamp. Essa simplificação facilitou a implementação desse protocolo como um módulo dinâmico para o sistema operacional Linux, e ao mesmo tornou esse protocolo um pouco menos abrangente que modelos TCPCamp e o próprio TCP/IP, servindo apenas para a comunicação entre máquinas de uma mesma rede. Essa abrangência reduzida é devido a eliminação da camada IP da hierarquia de camadas desse protocolo. 7) BIBLIOGRAFIA [1] Campana, José. Proposta de um Protocolo Leve para Clusters de Computadores. Monografia de Projeto Final de Graduação, Departamento de Informática da UFES, 2002. [2] Ferreira, Luiz. Linux HPC Clusters Instalation. 1ª Edição. Editora Redbooks. 2001. [3] Herrin, Glenn. Linux IP Networking. Url: http://www.cs.unh.edu/cnrg/gherrin/. [4] Holzmann, Gerard. Desing and Validation of Computer Protocols. Prentice Hall. 1991. [5] Nunes, Oziander. Avaliação de um protocolo leve no cluster de Computadores do DI/UFES. Monografia de Projeto Final de Graduação, Departamento de Informática da UFES, 2003. [6] Real Time Protocol. Almeida, Juliana. Url: http://www.gta.ufrj.br/grad/01_2/vidconf/rtp.html. Última visita: 29/07/2003. [7] Rubini, Alessandro. Linux Device Drivers, 2ª Edição. Editora O´reilly. 2001. [8] Salzman, Perter. The Linux Kernel Module Programming Guide. Url: http://jamesthornton.com/linux/lkmpg/ [9] Skilicorn, David. Models and Languages for Parallel Computation. 2002. [10] Soares, Luiz F. Redes de Computadores das Lans, Mans e Wans às redes ATM. 2ª Edição. Editora Campus. 1995. [11] Stevens, Richard. TCP/IP Illustrated:The Protocols. 1ª Edição. Editora AddisonWesley. 1998. [12] Tanenbaum, Andrew. Computer Networks. 3ª Edição. Prentice Hall. 2000. Última visita: 29/07/2003. [13] Zhu, Wenbin. Adding a new Protocol in LINUX. Url: http://www.unm.edu/%7Ezhuwb. Última visita: 29/07/2003. 20 7) APOIO Programa Institucional de Bolsas de Iniciação Científica (PIBIC-UFES) 8) AGRADECIMENTOS Ao professor Sérgio por me orientar em todo o processo de aprendizagem. À minha família pelo apoio e compreensão. A Oziander pelo auxílio na avaliação dos modelos TCPCamp.