Chamada Remota de Procedimentos Remote Procedure Call • O fluxo de informações em uma implementação de clientes e servidores por passagem de mensagem requer a programação de duas trocas explícitas de mensagens em dois canais diferentes de comunicação • Cada cliente precisa de um canal de comunicação que leva a um grande número de canais • RPC serve especialmente para programar interações cliente/servidor • Combina aspectos de monitores e passagem de mensagem síncrona Remote Procedure Call • Como em monitores, um processo ou módulo exporta operações que são invocadas através da instrução call • Como em um processo síncrono de envio de mensagens, a execução do call atrasa o invocador da chamada • Uma operação é um canal de comunicação dupla do chamador para o processo que serve a chamada e de volta para o chamador • O chamador espera até que a operação invocada seja executada e os resultados sejam retornados • Um procedimento é declarado para cada operação e um processo novo é criado para tratar cada chamada Remote Procedure Call • Um procedimento é declarado para cada operação e um processo novo é criado para tratar cada chamada • O chamador e o corpo do procedimento podem estar em máquinas diferentes • Um módulo contém processos e procedimentos • Módulos podem residir em espaços de endereçamento diferentes • Processos dentro do módulo podem compartilhar variáveis e chamar procedimentos declarados dentro do módulo Modelo de um módulo • Um processo em um módulo só pode se comunicar com processos em outro módulo através da chamada de procedimentos exportados por esse módulo • Forma de um módulo módulo mnome indicações das operações exportadas corpo declarações de variáveis inicialização do código procedimentos das operações exportadas procedimentos locais e processos fim mnome Modelo de um módulo • Declaração de uma operação exportada – op opnome(formais) [returns resultado] • Operação implementada por uma proc – proc opnome(identificadores formais) returns identificador do resultado declarações de variáveis locais instruções fim • Um processo chama um procedimento em outro módulo executando call mnome.opnome(argumentos) Implementação da chamada entre módulos Processo chamador (chama procedimento opnome) Call Processo servidor ( executa procedimento opnome) Sincronização dentro dos módulos • Sincronização entre chamador e servidor implícita • Processos dentro de um módulo, incluindo servidores e processos locais, necessitam ser sincronizados entre eles e obter acesso mutuamente exclusivo a variáveis compartilhadas • Duas abordagens utilizadas: – processos executam com exclusão mútua, ou seja, um de cada vez está ativo – processos executam concorrentemente e mecanismos de exclusão mútua tem que ser utilizados Um servidor de tempo • Implementação de um módulo que provê serviços de tempo para clientes em outros módulos • Duas operações visíveis: – get_time, para um cliente obter a hora do dia – delay, para bloquear o processo do cliente por interval unidades de tempo • O servidor possui um processo interno que inicia continuamente um timer de hardware, que incrementa a hora do dia quando ocorre uma interrupção Um servidor de tempo Module TimeServer op get_time() returns int; op delay (int interval); body int tod=0; # hora do dia sem m =1; # semáforo para exclusão mútua sem d[n]=([n] 0); # semáforos privados para delay queue of (int waketime, int process_id) napQ; ## quando m==1, tod < waketime para os processos atrasados proc get_time() returns time { time = tod; } proc delay (interval) { # assume interval > 0 int waketime = tod + interval; P(m); insere (waketime, myid) no lugar apropriado em napQ; V(m); P(d[myid]); # espera para ser acordado } Um servidor de tempo process Clock { inicia o timer de hardware; while (true) { espera por interrupção, então reinicia timer; tod = tod + 1; P(m); while (tod >= menor waketime em napQ) { remove (waketime, id) de napQ; V(d[id]); # acorda processo id } V(m); } } fim TimeServer Java RMI (Remote Method Invocation) • Suporte de Java a RPC • Operações em objetos Java são chamados métodos, daí o nome RMI • Três componentes: – uma interface que declara os headers para os métodos remotos – uma classe servidora que implementa a interface – um ou mais clientes que chamam os métodos remotos Programação emRMI • Escreva uma interface Java que estende Remote com métodos que declaram o lance de exceções remotas • Escreva uma classe servidora que estende UnicastRemoteObject e implementa os métodos da interface • Escreva código que cria uma instância do servidor e registre seu nome em um servidor de nomes denominado registry service • Escreva uma classe cliente que interage com o servidor – O cliente deve criar um gerenciador de segurança para não carregar código errado pela rede e deve obter um objeto servidor do registry service. Após esse procedimento, o cliente pode chamar os métodos remotos do servidor. Mecanismo de funcionamento • O programa do cliente invoca os métodos do servidor como se fossem locais • Quando os métodos são remotos, a interação entre cliente e servidor é gerenciada por um stub e skeleton • Após a compilação do programa, o stub e skeleton são criados pelo comando rmic Mecanismo de funcionamento • Quando um cliente invoca um método remoto, ele, na verdade, invoca um método no stub • O stub organiza os argumentos da chamada remota e os envia em uma única mensagem para o skeleton • O skeleton recebe a mensagem com os argumentos, gera uma invocação local do método para o servidor, espera o resultado e o retorna para o stub • O stub retorna o resultado para o código do cliente Detalhes para execução • Cliente e servidor são programas separados que executam em hosts separados • Necessita-se de utilizar um identificador o servidor que deve ser único, pois podem existir mais de um servidor executando ao mesmo tempo • Formato dos nomes de servidores – rmi://hostname:port/pathname, onde hostname é o nome do host na Internet, port é uma porta escolhida pelo usuário e pathname é um nome do diretório escolhido pelo usuário no servidor • O registry service é um programa que mantém uma lista de nomes registrados de servidores em um host Detalhes para execução • O registry service é um programa que mantém uma lista de nomes registrados de servidores em um host • Inicia-se o programa em background na máquina servidora através do comando “rmiregistry port &” • A interface para esse serviço é fornecida por um objeto Naming com dois métodos: bind, para registrador um nome e lookup para obter o nome de um servidor • Os programas cliente e servidor são iniciados através do interpretador java – O servidor deve ser iniciado em uma máquina e os clientes em máquinas conectadas as servidor import java.rmi.*; import java.rmi.server.*; public interface RemoteDatabase extends Remote { public int read() throws RemoteException; public void write(int value) throws RemoteException; } class Client { public static void main(String[] args) { try { System.setSecurityManager(new RMISecurityManager()); String name ="rmi://neuman:9999/database"; RemoteDatabase db = (RemoteDatabase) Naming.lookup(name); int value, rounds = Integer.parseInt(args[0]); for (int i = 0; i , rounds; i==) { value = db.read(); System.out.println("read: "+ value); db.write(value+1); } } catch (Exception e) { System.err.println(e); } } } class RemoteDatabaseServer extends UnicastRemoteObject implements RemoteDatabase { protected int data = 0; public int read() throws RemoteException { return data; } public void write (int value) throws RemoteException { data = value; System.out.println(”new value is : “ + data); } public RemoteDatabaseServer() throws RemoteException { super (); } public static void main(String[] args) { try { RemoteDatabaseServer server = new RemoteDatabaseServer(); String name ="rmi://neuman:9999/database"; Naming.bind(name, server); System.out.println(name + “is running”); } catch (Exception e ) { System.err.println(e); } } } Ferramentas para Análise de Desempenho Ferramentas para análise de desempenho • Existem poucos padrões para ferramentas utilizadas para recolher e analisar dados relativos a desempenho de programas paralelos • Utilizam abordagens, formatos de arquivos e visualizações diferentes • Mas existem princípios básicos que podem ser identificados em várias ferramentas existentes Processos de análise de desempenho • Coleta de dados: – obtenção de dados sobre o desempenho de um programa que está sendo executado • Transformação de dados: – transformam dados coletados objetivando reduzir o volume total de dados • Visualização de dados: – oferecem meios de visualizar os dados obtidos de uma maneira mais amigável ao usuário Coleta de dados • Três técnicas básicas: – profiles: registram o tempo gasto em partes diferentes do programa. Geralmente são obtidos automaticamente – contadores: registram frequência de eventos ou tempo acumulativo. Requerem intervenção do programador – trace de eventos: registram cada ocorrência de eventos específicos. São gerados automaticamente ou com intervenção do programador Transformação de dados • • • • Determinação de valores médios Outras estatísticas (desvio padrão) Extrair dados de arquivos de trace Transformações podem ser codificadas pelo programador Visualização de dados • Dados são multidimensionais: – – – – – tempos de execução custos de comunicação vários componentes do programa processadores diferentes tamanhos de problemas diferentes • Técnicas de visualização gráfica são utilizadas Requisitos das ferramentas • Precisão – dados obtidos por amostragem são menos precisos que dados obtidos por contadores e temporizadores • Simplicidade – coleta de dados automática sem intervenção do programador • Flexibilidade – possibilidade de estender a ferramenta para coletar dados adicionais e prover diferentes visualizações dos mesmos dados • Nível de intrusão – overhead introduzido pela ferramenta • Abstração – dados devem poder ser examinados de acordo com o nível de abstração apropriado para o modelo de programação utilizado no programa paralelo Coleta de dados- Profiles • Um profile mostra a quantidade de tempo gasto em diferentes componentes do programa • O valor do contador de programa é obtido em intervalos fixos de tempo e utilizado para construir um histograma de frequências de execução • Essas frequências são combinadas com informações da tabela de símbolos do compilador para estimar o tempo gasto em partes diferentes do programa • Dados podem ser coletados para cada processador e podem identificar tempo de execução, comunicação e idle Coleta de dados- Profiles • Podem ser obtidos automaticamente, a baixo custo • Disponibilizam uma visão em alto nível do comportamento do programa • Permitem a identificação de partes do programa que estão ocupando muito tempo • Permitem identificação de escalabilidade do programa em relação ao número de processadores e tamanho do programa • Não registram aspectos temporais da execução do programa Coleta de dados- Contadores • Consiste de um local da memória que é incrementado cada vez que ocorre um evento específico • Eventos podem ser: – número de chamadas de procedimento – número total de mensagens – número de mensagens enviadas entre dois processadores • Os dados podem ser gerados por código gerado pelo compilador, por código incorporado de bibliotecas de comunicação ou por inserção pelo usuário de chamadas a rotinas de contador • Combinação de informações geradas pelos contadores e profiles: – contadores geram informação de número total de mensagens que podem ser combinadas com informação de tempo total de comunicação gerada pelos profiles para determinar eficiência de operações de comunicação Coleta de dados - Traces • Abordagem que provê maior detalhamento dos dados • Geram arquivos de log que contêm registros de eventos com a hora marcada representando ocorrências significativas na execução do programa, como chamada de procedimento e envio de mensagens • Podem ser utilizados para examinar relações entre comunicações, localizar fontes de causadores de paradas dos processadores e identificar gargalos • Geram uma quantidade muito grande de dados – muda característica do programa – pós processamento difícil – programador tem que ajustar o processo de coleta de dados para registrar somente eventos relevantes Coleta de dados - Dicas • Faça uma análise de desempenho previsto do seu programa • Utilize informações de profiles e contadores necessárias para a análise de desempenho • Meça o tempo de execução para um número variado de processadores e tamanhos de problemas • Se os valores observados são muito diferentes dos modelados, utilize informação de profiles e counters para verificar se as suposições básicas feitas no modelo ocorrem na realidade • Caso existam aspectos ainda inexplicados do desempenho do seu programa, incorpore ferramentas simples para trace de dados Transformação e visualização de dados • Profile e counts: – histogramas que mostram tempo de execução, número de mensagens, volume de dados (Kbytes/s), tamanho médio de mensagem por processador – Matriz bi-dimensional que mostra comunicação entre processadores e cores indicam estado do processador (comunicação, execução, idle) • Traces: – dados são reduzidos para uma, duas ou três dimensões e são visualizados com histogramas – volume de comunicação versus tempo – vistas de dependências temporais Ferramentas disponíveis • Paragraph – desenvolvida pelo Oak Ridge National Lab para programas que utilizam passagem de mensagens – gera arquivos de trace que podem ser mostrados como utilização do processador (comunicação, execução, idle), comunicação entre processadores e outros • Upshot – desenvolvida pelo Argonne National Lab para programas que utilizam passagem de mensagens – coleta dados em forma de trace e os mostra em forma de histogramas – mostra o estado (início e fim de um evento) de cada processo em função do tempo Ferramentas disponíveis • Pablo – desenvolvida pela Universidade de Illinois – provê uma variedade de mecanismos para coleta, transformação e visualização de dados e pode ser estensível para que novos formatos de dados, mecanismos de coleta de dados, transformações e visualizações sejam incorporados – pode ser utilizada por programas que utilizam passagem de mensagens e paralelismo de dados – instrumentação pode ser feita interativamente pelo usuário e chamadas aso sistema podem ser incorporadas a bibliotecas e compiladores • IBM Parallel Environment – desenvolvida pela IBM para o sistema SP – coleta dados através em profiles utilizando comandos prof e gprof – ferramenta VT coleta dados em forma de traces e mostra sua visualização: registro de comunicação, registro de utilização de CPU, disco, memória e partes marcadas pelo programador