Gerando redes aleatórias no iSPD e automatizando
Um pouco sobre
Existem problemas que não podemos estudar por conta do seu tamanho, imagine por exemplo analisar como um material para construir prédio deve ser feito, com qual liga metálica e em qual quantidade. Deveríamos construir o prédio para ver se dará certo? Óbvio que não, é realizado um estudo para verificar como será feito, nesse caso entram os engenheiros civis.
Mas no caso de sistemas computacionais distribuídos, precisamos de computadores, muitas vezes cada computador custa no Brasil o valor de uma casa ou um carro, pois não estamos falando de notebooks do varejo. São máquinas que ficam empilhadas em armários próprios, em salas com resfriamento, muitas vezes centenas, milhares ou até dezenas de milhares de máquinas.
Você pode se perguntar, para que tudo isso? Bom, temos problemas muito grandes para resolver, só a infraestrutura do facebook daria para ser uma cidade pequena para conseguir armazenar todos os dados. Mas existem lugares de quase 30km² só de computadores armazenando e processando informações a todo instante e nesse caso temos um problema: Tenho N tarefas para uma quantidade de computadores que podem ser até o mesmo modelo, mas são únicos e desta forma, sofrem a ação do tempo de forma única, além disso podemos com o tempo, adquirir mais máquinas em nosso datacenter e que obviamente terão uma capacidade de processamento diferente. Nesse sentido, temos uma pergunta inquietante:
Como distribuir as tarefas para esses dispositivos da melhor forma possível? Mas este ainda não será nosso tema! O que quero relatar aqui, é um pedaço do caminho, algo que contribui para que tenhamos um ambiente de estudo automatizado.
Para conseguir responder essa pergunta, precisava primeiro ter o ambiente criado no simulador e para isso o iSPD tem um ambiente gráfico, o que permite que fiquemos focados na resolução do problema, sem precisar pensar sobre a questão do ambiente em si. Os outros simuladores, por exemplo o SimGrid, CloudSim, GridSim e outros, precisam ter as características do ambiente realizadas de forma programática, o que dificulta substancialmente o processo de estudo.
Porém, no caso analisado, era necessário criar ambientes com 10, 50 e 100 máquinas (o que daria em um ambiente de 100 máquinas e muitas horas clicando, arrastando e digitando configurações), com capacidades de comunicação e processamento diferentes e fazer isso com o mouse iria ser algo aterrador, além de que não teria como garantir que o ambiente fosse significativamente diferente entre si. Nesse caso, o iSPD não poderia me ajudar, então resolvi criar uma rede com 3 nós, colocando um deles como principal e salvar o arquivo de configuração.
O iSPD gera um arquivo XML de configuração da rede e analisando o arquivo, criei um Bash Script que constrói um arquivo de configuração para o iSPD e tudo o que preciso fazer, é passar a quantidade de máquinas que quero.
Abaixo você pode conferir o Bash Script:
Automatizando o simulador
Outro problema, foi que o estudo que estava realizando, era necessário a execução de 100, 1.000, 10.000 e 100.000 tarefas para cada uma das redes de 10, 50 e 100 máquinas, considerando que cada uma deveria ser realizada 20 vezes para termos um resultado minimamente confiável.
Temos 4 quantidades de tarefas, 3 tipos de redes, então temos 12 ambientes diferentes, multiplicado por 20 resulta em 240 execuções. Porém, neste estudo, analisei 4 algoritmos diferentes, portanto seriam 960 execuções e ainda tem mais uma observação, os testes seriam realizados em ambientes com máquinas com processamento e comunicação heterogênea e também homogênea, o que significa que são 1920 execuções. Quando me deparei com esse problema, simplesmente desisti e decidi automatizar tudo! Infelizmente a documentação do iSPD não é muito vasta, mas navegando nos diretórios de sua build, pude encontrar um arquivo interessante:
Quando realizei o comando abaixo, tive uma grata surpresa:
Então gerei builds do iSPD com os algoritmos que desejava analisar e os coloquei em diretórios específicos, criei o seguinte Bash Script:
Depois disso, pude deixar a execução dos algoritmos sendo realizada, o que demorou pouco mais de 10 horas, enquanto isso pude estudar, escrever sobre os algoritmos e fazer mais café :D
Conclusão
Muitas vezes temos que descobrir como resolver os problemas sem a possibilidade de contar com a ajuda externa, no caso alguém implementar a funcionalidade de criar redes aleatorizadas, o problema foi resolvido com algumas linhas de Bash que podem assustar muitas pessoas, mas é simples :) De quebra, descobri um bug no iSPD, não era possível gerar redes com mais de 402 máquinas e isso foi corrigido na nova versão do projeto, que está sendo reescrita de Java para C++ por corajosos discentes da UNESP/IBILCE.