Universidade Federal do ABC (UFABC)
Centro de Matemática, Computação e Cognição (CMCC)
Curso de Pós-Graduação em Ciência da Computação
Dissertação de Mestrado
Jhon Franko Jorge Velarde
APLICAÇÃO DO PROTOCOLO SPDY PARA APLICATIVOS DE
MONITORAMENTO SOBRE REDES DE IP PÚBLICO
Santo André - SP
2014
Curso de Pós-Graduação em Ciência da Computação
Dissertação de Mestrado
Jhon Franko Jorge Velarde
APLICAÇÃO DO PROTOCOLO SPDY PARA APLICATIVOS DE
MONITORAMENTO SOBRE REDES DE IP PÚBLICO
Trabalho apresentado como requisito parcial
para obtenção do tı́tulo de Mestre em Ciência
da Computação, sob orientação do Prof. Dr.
Nunzio Marco Torrisi.
Santo André - SP
2014
Centro de Matemática, Computação e Cognição (CMCC)
Curso de Pós-Graduação em Ciência da Computação
APLICAÇÃO DO PROTOCOLO SPDY PARA APLICATIVOS DE
MONITORAMENTO SOBRE REDES DE IP PÚBLICO
Jhon Franko Jorge Velarde
Março de 2014
BANCA EXAMINADORA:
• Prof. Dr. Nunzio Marco Torrisi (Presidente)
(CMCC) Universidade Federal do ABC - UFABC
• Prof. Dr. Rodrigo Palucci Pantoni
Instituto Federal de São Paulo - IFSP
• Prof.a Dr.a Vera Nagamuta
(CMCC) Universidade Federal do ABC - UFABC
• Prof. Dr. Ronaldo Cristiano Prati (Suplente)
(CMCC) Universidade Federal do ABC - UFABC
Este exemplar foi revisado e alterado em relação à versão original,
de acordo com as observações levantadas pela banca no dia da defesa, sob responsabilidade única do autor e com a anuência de seu
orientador.
Santo André, 20 de março de 2014.
Assinatura do autor:
Assinatura do orientador:
Resumo
O objetivo deste trabalho é propor o uso do protocolo SPDY em aplicativos de
monitoramento sobre redes de IP público, com foco nas melhorias sobre HTTP e
fornecido pelo escalonamento de requests utilizando as oito prioridades no fluxo
SPDY. Para o escalonamento SPDY, são considerados algoritmos de padrões de
projeto que utilizam mecanismos sı́ncronos ou assı́ncronos para o gerenciamento
de requests de múltiplos clientes, tais como: os padrões Reactor e Proactor. A
caracterı́stica principal, o quantum de tempo, compartilhada nos algoritmos de
escalonamento, tais como: Escalonamento por Prioridade, Escalonamento RoundRobin, Escalonamento em Filas Multinı́vel, Weighted Fair Queuing e Weighted
Round-Robin, permite que os requests com menor prioridade tenham maior oportunidade de ser gerenciados. Um protótipo de servidor SPDY foi desenvolvido
baseado na especificação do protocolo SPDY e, nas caracterı́sticas principais
dos padrões de projeto e algoritmos de escalonamento propostos. A avaliação
deste protótipo foi feita na simulação de uma situação real de monitoramento,
o protótipo considerou três estruturas para gerenciamento de requests no escalonador: oito filas de prioridade, uma fila sem prioridade e oito filas de prioridade
com um quantum de tempo para cada fila. Os resultados obtidos mostram que
os requests com maior prioridade são processados na média em menor tempo
além de que são gerenciados em maior quantidade e, a utilização de um quantum de tempo para cada fila de prioridade aumentou a quantidade de requests
gerenciados com menor prioridade.
Palavras-chave: Aplicativos de monitoramento, DNP3, SCADA, HMI, Escalona-
mento, SPDY, HTTP, Padrões de projeto, Filas, Prioridade.
iv
Abstract
The aim of this research project is to propose the use of SPDY protocol for
monitoring applications over public IP networks, with focus on the improvements over HTTP provided by the request scheduling using the eight priorities
in SPDY stream. For the SPDY scheduling, are considered design patterns algorithms which use synchronous or asynchronous mechanisms for handles request
of multiple clients, such as: Reactor and Proactor pattern. The main feature,
the time quantum, shared in scheduling algorithms, such as: Priority Scheduling,
Round-Robin Scheduling, Multilevel Queue Scheduling, Weighted Fair Queuing
and Weighted Round-Robin, allows lower priority requests have higher opportunity to be managed. A SPDY server prototype was developed based on the
specification of the SPDY protocol, and the main characteristics of the design
patterns and scheduling algorithms proposed. The evaluation of this prototype
was made in the simulation of a real situation monitoring, was considered in the
prototype three structures for managing requests in the scheduler: eight priority
queues, a queue without priority and eight priority queues with a time quantum
for each queue. The results show that higher priority requests are processed on
average in less time beyond that are managed in a larger quantity, and the use
of a time quantum for each priority queue increased the amount of lower priority
managed requests.
v
Agradecimentos
Agradeço a Deus pelas bênçãos, pela minha saúde e proteção em todos os dias
da minha vida.
Agradeço a minha esposa e amor Alisoli Pretel Jesus por que juntos somos
uma grande equipe, pelo apoio, pela presença e grande amor, por que todo isso
foi um grande motor para conduzir este mestrado em bom caminho.
Agradeço profundamente a minha amada mãe, Dominga e a minha querida
irmã, Marı́a, pelo amor, pelas orações, pela motivação, compreensão e apoio
incondicional em todo momento.
Agradeço a meu orientador o Prof. Dr. Nunzio Marco Torrisi pela amizade,
pelos ensinamentos, ajuda e colaboração com o meu trabalho no mestrado.
Aos professores André Balan, João Paulo Gois e Ronaldo Prati pelas novas
experiências e pelos conhecimentos adquiridos.
E finalmente, agradeço a meus caros amigos Lı́dia, Marcel e Renato por ter
me dado a sua confiança, amizade e por sempre torcer por mim.
vi
Glossário
AJAX
Asynchronous Javascript and XML
CyberOPC
Cybernetic OPC
DNP3
Distributed Network Protocol, version 3
HMI
HTML5
HTTP
HTTPS
Human Machine Interface
HyperText Markup Language, version 5
HyperText Transfer Protocol
HyperText Transfer Protocol Secure
IETF
Internet Engineering Task Force
OLE
Object Linking and Embedding
OPC
OLE for Process Control
OPC XML-DA OPC eXtensible Markup Language-Data Access
OPC-UA
OPC-Unified Architecture
RFC
Request For Comments
SCADA
SPDY
SSL
Supervisory Control And Data Acquisition
SPeeDY Protocol
Secure Sockets Layer
TCP/IP
TLS
Transmission Control Protocol/ Internet Protocol
Transport Layer Security
W3C
World Wide Web Consortium
vii
Sumário
Glossário
vii
1 Introdução
2
1.1
Motivação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.2
Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.3
Organização deste trabalho . . . . . . . . . . . . . . . . . . . . . .
4
2 Revisão Bibliográfica
2.1
2.2
2.3
5
Tecnologias Relacionadas . . . . . . . . . . . . . . . . . . . . . . .
5
2.1.1
Melhoria do Projeto de Aplicativos HTTP . . . . . . . . .
5
2.1.2
Melhorias da Especificação do Protocolo HTTP . . . . . .
7
2.1.3
Tecnologias Middleware para Otimização de uso de HTTP
8
Estado da arte
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.2.1
Protocolo WebSocket . . . . . . . . . . . . . . . . . . . . .
10
2.2.2
Protocolo SPDY . . . . . . . . . . . . . . . . . . . . . . .
10
Algoritmos de Escalonamento . . . . . . . . . . . . . . . . . . . .
13
2.3.1
Escalonamento Round-Robin . . . . . . . . . . . . . . . . .
13
2.3.2
Escalonamento por Prioridade . . . . . . . . . . . . . . . .
14
2.3.3
Escalonamento em Filas Multinı́vel . . . . . . . . . . . . .
15
2.3.4
Weighted Fair Queuing . . . . . . . . . . . . . . . . . . . .
16
2.3.5
Weighted Round-Robin . . . . . . . . . . . . . . . . . . . .
17
3 Metodologia
3.1
3.2
18
Padrões de projeto para transmissão de dados de tipo sı́ncrono e
assı́ncrono . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
Metodologia para a avaliação dos resultados . . . . . . . . . . . .
22
4 Desenvolvimento de um protótipo de servidor SDPY
viii
24
SUMÁRIO
5 Resultados
5.1
28
Testes I: Análise do comportamento dos tempos de processamento
nas oito filas de prioridade . . . . . . . . . . . . . . . . . . . . . .
5.2
ix
32
Testes II: Análise e comparação do comportamento dos tempos
de processamento em uma fila sem prioridade e nas oito filas de
prioridade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3
37
Testes III: Análise e comparação do comportamento dos tempos
de processamento nas oito filas com prioridade e quantum de tempo 43
6 Conclusões
48
Lista de Figuras
2.1
Diagrama temporal da modalidade HTTP Keep-alive (a) e Pipelining (b). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2
8
Diagrama de conexões SPDY. As setas grossas indicam a transferência de dados, enquanto as setas finas mostram os tipos de
frames SPDY: PING, SETTINGS, SYN STREAM, SYN REPLY
e DATA FRAME. . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3
12
Escalonamento Round-Robin. (a) Fila de frames. (b) Fila de frames quando F S1 não termina após de um quantum. . . . . . . . .
13
2.4
Um algoritmo de escalonamento com quatro classes de prioridade.
15
2.5
Escalonamento em Filas Multinı́vel. . . . . . . . . . . . . . . . . .
16
2.6
Weighted Fair Queuing. . . . . . . . . . . . . . . . . . . . . . . .
17
2.7
Weighted Round-Robin. . . . . . . . . . . . . . . . . . . . . . . . .
17
3.1
Diagrama de interação para o padrão Reactor. . . . . . . . . . . .
19
3.2
Diagrama de interação para o padrão Proactor. . . . . . . . . . .
21
3.3
Registro de Eventos (a) Reactor. (b) Proactor. . . . . . . . . . . .
21
3.4
Esquema do projeto. . . . . . . . . . . . . . . . . . . . . . . . . .
22
3.5
Abordagem básica do poll de atualização. . . . . . . . . . . . . . .
23
4.1
Visão geral das etapas desenvolvidas no projeto. . . . . . . . . . .
25
4.2
Diagrama de interação para o enfileiramento de eventos. . . . . .
26
4.3
Dinâmica do desenfileiramento de eventos. . . . . . . . . . . . . .
26
4.4
Diagrama de interação para o despacho de eventos. . . . . . . . .
27
x
LISTA DE FIGURAS
5.1
xi
Estrutura dos arquivos de Teste A, F, J e Tráfego de Fundo com o
valor da prioridade na primeira coluna e o tempo de inter-arrival
na segunda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2
29
(a) Armazenamento na estrutura de dados. (b) Gerenciamento dos
novos requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
5.3
Esquema dos testes 1 e 2. . . . . . . . . . . . . . . . . . . . . . .
32
5.4
Plotting 2D do teste 1 utilizando um cliente SPDY para transmitir
o tráfego de fundo. . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5
33
Plotting 2D do teste 2 utilizando um cliente SPDY para transmitir
o tráfego de fundo. . . . . . . . . . . . . . . . . . . . . . . . . . .
33
5.6
Esquema dos testes 3 e 4. . . . . . . . . . . . . . . . . . . . . . .
34
5.7
Plotting 2D do teste 3 utilizando outro cliente SPDY para transmitir o tráfego de fundo. . . . . . . . . . . . . . . . . . . . . . . .
5.8
5.9
34
Plotting 2D do teste 4 utilizando outro cliente SPDY para transmitir o tráfego de fundo. . . . . . . . . . . . . . . . . . . . . . . .
35
Esquema dos testes 5 e 6. . . . . . . . . . . . . . . . . . . . . . .
35
5.10 Plotting 2D do teste 5 utilizando outro cliente SPDY para transmitir o tráfego de fundo. . . . . . . . . . . . . . . . . . . . . . . .
36
5.11 Plotting 2D do teste 6 utilizando outro cliente SPDY para transmitir o tráfego de fundo. . . . . . . . . . . . . . . . . . . . . . . .
36
5.12 Vista 1: Plotting 3D do teste 7 utilizando oito filas de prioridade.
38
5.13 Vista 2: Plotting 3D do teste 7 utilizando oito filas de prioridade.
38
5.14 Vista 3: Plotting 3D do teste 7 utilizando oito filas de prioridade.
39
5.15 Vista 1: Plotting 3D do teste 8 utilizando oito filas de prioridade.
40
5.16 Vista 2: Plotting 3D do teste 8 utilizando oito filas de prioridade.
40
5.17 Vista 3: Plotting 3D do teste 8 utilizando oito filas de prioridade.
41
5.18 Vista 1: Plotting 3D do teste 9 utilizando uma fila de prioridade.
42
5.19 Vista 2: Plotting 3D do teste 9 utilizando uma fila de prioridade.
42
5.20 Vista 3: Plotting 3D do teste 9 utilizando uma fila de prioridade.
43
LISTA DE FIGURAS
xii
5.21 Nova dinâmica de desenfileiramento para o teste. . . . . . . . . .
44
5.22 Vista 1: Plotting 3D do teste 10 utilizando oito filas de prioridade.
45
5.23 Vista 2: Plotting 3D do teste 10 utilizando oito filas de prioridade.
45
5.24 Vista 1: Plotting 3D do teste 11 utilizando um quantum para cada
fila de prioridade. . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
5.25 Vista 2: Plotting 3D do teste 11 utilizando um quantum para cada
fila de prioridade. . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
Lista de Tabelas
5.1
Caracterı́sticas do servidor e das máquinas clientes. . . . . . . . .
28
5.2
Resultados dos Testes 7, 8 e 9. . . . . . . . . . . . . . . . . . . . .
47
5.3
Resultados dos Testes 10 e 11. . . . . . . . . . . . . . . . . . . . .
47
xiii
Lista de Algoritmos
1
Algoritmo de Gerenciamento de Eventos . . . . . . . . . . . . . .
1
22
Capı́tulo 1
Introdução
Em 1991, foi especificada a primeira versão do protocolo HTTP por Tim BernersLee e, em 1996, foi padronizado pelo IETF como HTTP 1.0 e documentado no
RFC 1945 [1]. Apenas três anos depois, pelo aumento da carga na web, foi padronizado o HTTP 1.1 pelo IETF. O protocolo revisado no RFC 2616 [2] reduziu
o número necessário de requisições de conexão para um terminal através da introdução de conexões keep-alive [3] e, através do HTTP pipelining [4] permitiu
múltiplos requests em sequência sem a necessidade de esperar por as correspondentes responses. O HTTP não mudou muito desde então, embora o panorama
web tenha mudado fundamentalmente.
Desde a primeira especificação do protocolo HTTP - RFC 1945, os aplicativos
baseados neste protocolo evoluı́ram superando a limitação da especificação para
trabalhar com streaming e conteúdos web interativos. No entanto, muitos dos
gargalos das implementações HTTP 1.1 estão relacionadas à gestão de múltiplas
conexões simultâneas, configurações de conexão de ida e volta desnecessárias,
controle de congestionamento e um racionamento constante causado pelo cliente
onde ele tenta evitar a abertura de muitas conexões em um único servidor [5].
Enquanto a comunidade cientı́fica vem desenvolvendo novas ideias para melhorar
o desempenho de aplicativos web sobre HTTP 1.1, a limitação do domı́nio de muitos aplicativos de monitoramento de redes IP locais foi estendida para redes de
IP público usando HTTP como protocolo preferido para aplicativos personaliza-
2
CAPÍTULO 1. INTRODUÇÃO
3
dos. Os aplicativos modernos SCADA1 e HMI2 têm acesso em leitura e escritura,
parcial ou totalmente, a suas variáveis de processo através de protocolos HTTP,
HTTPS, ModBus [6], DNP [7] e outros, usando gateways como OPC XML-DA
[8], OPC-UA [9], CyberOPC [10] e muitas outras soluções interessantes.
1.1
Motivação
Este trabalho foi motivado pela utilização das novas caracterı́sticas de prioridade
introduzidas pelo protocolo SPDY [5], que permita melhorar o desempenho de
qualquer aplicativo de monitoramento que usa o protocolo HTTP. Esta abordagem tenta resolver o problema através do protocolo e não através de um middleware de aplicativos HTTP, por exemplo, o Reverse AJAX [11]. Assim, os
principais resultados esperados são:
• Uma metodologia otimizada para usar o protocolo SPDY em redes públicas
para monitoramento e controle de processos industriais;
• A contribuição tecnológica na indústria de software para aplicativos de monitoramento através da internet.
1.2
Objetivos
O principal objetivo é pesquisar e desenvolver um protótipo de servidor SPDY
baseado nas especificações do protocolo, os estudos de padrões de projeto e nas
caracterı́sticas dos algoritmos de escalonamento aplicadas na teoria de gerenciamento de filas de prioridade do escalonador SPDY. Os algoritmos de gerenciamento de filas adotados no projeto do servidor são justificados pela caracterı́stica
de prioridade do protocolo SPDY. Mais especificamente, os objetivos são:
• Investigar o protocolo SPDY, os padrões de projeto e algoritmos de escalonamento, para atingir os requerimentos de gerenciamento de prioridades e
1
SCADA ou Supervisory Control and Data Acquisition é um sistema que utiliza software
para monitorar e supervisionar as variáveis e dispositivos de sistemas de controle industrial.
2
HMI ou Human–machine interface inclui componentes de hardware e software pelo qual os
usuários interagem com as máquinas.
CAPÍTULO 1. INTRODUÇÃO
4
modelar a integração do gerenciador de fluxo de prioridades SPDY;
• Desenvolver um servidor de teste e simular cenários de aplicativos de monitoramento no laboratório;
• Comparar a estratégia de gerenciamento de fluxo sobre redes de IP público
e avaliar os resultados.
1.3
Organização deste trabalho
O primeiro capı́tulo é destinado a fornecer o leitor uma visão geral dos assuntos
abordados neste trabalho, assim, neste capı́tulo são apresentadas a introdução,
motivação e os objetivos.
No capı́tulo 2 são apresentadas as caracterı́sticas de varias tecnologias relacionadas que visam à melhoria de HTTP. Também descrevemos o estado da arte que
abrange os protocolos WebSocket e SPDY, considerados os principais candidatos
para a próxima e esperada especificação do HTTP 2.0 pelo IETF. Além disso,
são abordadas as caracterı́sticas principais dos algoritmos de escalonamento.
No capı́tulo 3 são descritas as caracterı́sticas principais dos padrões de projeto consideradas para o desenvolvimento do escalonador SPDY. Além disso, é
apresentada a metodologia utilizada para avaliação dos resultados.
No capı́tulo 4 são abordadas, detalhadamente, as etapas compreendidas no
desenvolvimento de um protótipo de servidor SPDY.
No capı́tulo 5 são apresentados os resultados dos distintos experimentos feitos
sobre o protótipo desenvolvido, além de descrever a análise de cada um deles. A
avaliação foi feita na simulação de uma situação real de monitoramento considerando três grupos de testes.
Finalmente, no capı́tulo 6 são apresentadas as conclusões desta dissertação.
Capı́tulo 2
Revisão Bibliográfica
2.1
2.1.1
Tecnologias Relacionadas
Melhoria do Projeto de Aplicativos HTTP
Blocking e Non-Blocking Socket
Os termos de Blocking e Non-Blocking
I/O fazem referência à maneira pela qual os I/O são processados no sistema
operacional (OS), sı́ncrona ou assincronamente respectivamente. O problema
da limitação de conexões simultâneas está relacionado também à forma como
o servidor foi implementado e como o OS trabalha com os sockets. Querendo
iniciar uma conexão com o servidor e utilizando um socket para qualquer tipo
de operação, no Blocking I/O, a operação é iniciada com um thread, a qual fica
imediatamente em espera até que o pedido esteja completo. No caso de NonBlocking I/O, existem duas alternativas, ou um polling, onde o servidor tenta
fazer a operação cada intervalo de tempo, ou a utilização de uma notificação
assı́ncrona, no qual o servidor gera um evento indicando que uma operação está
pronta para ser processada.
Devido à complexa interação entre HTTP e o subjacente protocolo da camada
de transporte (TCP), quer isto dizer, apesar da adição das técnicas de HTTP
keep-alive e pipelining em HTTP/1.1, um atraso de 500 ms no servidor HTTP
impede a reutilização do canal TCP para requests adicionais, do modo que, os
navegadores atuais evitam este problema abrindo múltiplas conexões simultâneas,
em uma média de 6 conexões. O gerenciamento de múltiplas sessões TCP, para
suportar essas conexões simultâneas, aumenta a sobrecarga e a latência. SPDY
5
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
6
[5] proporciona melhorias significativas de latência, mas existem outras soluções
propostas para a latência web, principalmente no nı́vel da camada de transporte
ou sessão.
Stream Control Transmission Protocol (SCTP) É um protocolo da camada de transporte que trabalha como os populares protocolos TCP e UDP e
oferece algumas de suas caracterı́sticas de serviço. É orientado a mensagem como
UDP e garante a confiabilidade e mensagens em sequência com o controle de
congestionamento como TCP. Além disso, a motivação principal por detrás do
SCTP é fornecer um protocolo mais confiável e robusto do que o TCP e UDP, o
qual pode aproveitar recursos como multihoming
1
[12]. O protocolo foi definido
pelo grupo de trabalho de transporte de sinalização SIGTRAN do IETF em 2000,
e é mantido pelo grupo de trabalho da área de transporte (TSVWG) do IETF. O
RFC 4960 define o protocolo e o RFC 3286 fornece uma introdução. Na ausência
de suporte nativo para SCTP em sistemas operacionais é possı́vel o túnel SCTP
sobre UDP, assim como o mapeamento de chamadas da API de TCP para SCTP.
HTTP sobre SCTP É uma proposta para a execução de HTTP sobre SCTP.
HTTP requer um transporte confiável para a comunicação fim-a-fim. Semelhante
ao TCP, o SCTP oferece uma conexão de transporte fim-a-fim confiável para aplicativos web, além disso, oferece outros serviços inovadores indisponı́veis no TCP,
incluindo multi-transmissão, multihoming, fiabilidade parcial e transferência de
dados orientados a mensagem [13].
Structured Stream Transport (SST) SST é um protocolo de transporte
experimental projetado para atender às necessidades de aplicativos modernos
que precisam trabalhar com muitas atividades de comunicação assı́ncrona em
paralelo, tal como baixar diferentes partes de uma página web e a reprodução de
áudio e múltiplos streams de vı́deo de forma simultânea [14].
1
O multihoming faz referência a um computador ou dispositivo (celular, tablet) conectado
a mais de uma rede.
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
7
MUX e SMUX São protocolos de gerenciamento de sessão que separam o
transporte subjacente dos protocolos de aplicação de nı́vel superior. Fornecem um
canal de comunicação leve para a camada de aplicação através da multiplexação
de fluxos de dados, sobre um transporte orientado de fluxo confiável. Ao suportar
a coexistência de múltiplos protocolos de nı́vel de aplicação (por exemplo, HTTP
e HTTP-NG), eles irão facilitar as transições para futuros protocolos web e as
comunicações de applets cliente utilizando protocolos privados com os servidores
sobre a mesma conexão TCP como a conversação HTTP [15].
2.1.2
Melhorias da Especificação do Protocolo HTTP
Keep-alive
Também chamado conexão persistente HTTP, permite ao servidor
manter a conexão TCP aberta após do envio das respostas. As sub-sequentes
requests/responses entre o mesmo cliente e servidor podem ser enviados através
da mesma conexão. Depois de um determinado perı́odo de tempo (intervalo de
tempo de espera), o servidor HTTP fecha a conexão quando não é utilizada. É
uma técnica padrão do HTTP/1.1 e existe em duas versões: com pipelining e sem
pipelining [3]. A figura 2.1-(a) mostra o esquema do HTTP Keep-alive com os
requests/responses entre o mesmo cliente e servidor através da mesma conexão.
HTTP Pipelining
É uma técnica que quebra o modelo rigoroso: “enviar uma
solicitação e esperar pela resposta”, especificada em HTTP 1.0 [1], e permite
despachar múltiplos requests HTTP em paralelo para o servidor em uma única
conexão TCP, sendo utilizado com muito mais eficácia, mas com o tempo transcorrido muito menor, sem esperar pelas respostas correspondentes. Logo que os
pedidos são todos enviados, o cliente HTTP (navegador) começa a escutar para
responder. O HTTP Pipelining permite menos pacotes TCP para ser enviados
através da rede, desde que no mesmo pacote TCP é possı́vel agrupar vários requests HTTP, reduzindo a carga de rede [4]. A figura 2.1-(b) mostra o esquema do
HTTP Pipelining com múltiplos requests, em paralelo, sobre a mesma conexão.
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
Cliente
Servidor
Abrir
8
Cliente
Servidor
Abrir
tempo
Fechar
Fechar
(a)
(b)
Figura 2.1: Diagrama temporal da modalidade HTTP Keep-alive (a) e Pipelining
(b).
HTTP Server Push
Envolve o envio de pacotes de dados periodicamente
desde o servidor HTTP para o cliente HTTP. A conexão HTTP entre o cliente
e o servidor é mantida aberta indefinidamente, de modo que se um evento é
recebido pelo servidor, este pode ser imediatamente enviado para um ou múltiplos
clientes, ou caso contrário, os dados teriam que ser enfileirados até que o próximo
request do cliente seja recebido. Este mecanismo pode ser implementado em
um programa CGI através do uso de tipo de MIME multipart/x-mixed-replace.
Também é conhecido como HTTP streaming e é suportado apenas pelo Netscape
Navigator (versão 1.1 ou superior) e Internet Explorer [16].
2.1.3
Tecnologias Middleware para Otimização de uso de
HTTP
Estas tecnologias requerem um software middleware com JavaScript do lado do
cliente e do servidor para a transferência de dados.
Reverse Ajax Comet [17], conhecido por outros nomes incluindo Reverse Ajax,
é um modelo de aplicação web que permite aos servidores web enviar dados para
um navegador cliente, sem a necessidade de um request explı́cito [17]. Neste
modelo, um request é enviado para o servidor e mantido ativo por um longo
tempo, até um limite de tempo ou a ocorrência de um evento do servidor. Quando
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
9
o request é completado, outro request Ajax de longa duração é enviado para
esperar por outros eventos do servidor. A maior vantagem do Comet é que cada
cliente sempre tem um link de comunicação aberto com o servidor, no qual pode
enviar os eventos aos clientes para completar imediatamente as respostas quando
eles chegarem, ou até mesmo acumular e enviar por rajadas [18].
Bayeux É uma solução de código aberto projetado para proporcionar baixa
latência através de HTTP. Ele trabalha transportando as mensagens assı́ncronas
e roteando eventos entre clientes e servidores utilizando um modelo publicar/subscrever. O objetivo principal de Bayeux é a implementação de interações
de usuários que respondem a clientes web usando Ajax e a técnica server-push
chamada de Comet. A ideia principal é facilitar a interoperação entre as implementações para resolver a distribuição comum de mensagens e problemas de
roteamento, e fornecer mecanismos para melhorias incrementais e de extensões.
Entre suas operações globais encontramos os transportes “Streaming”, que utilizam a técnica de streaming para permitir que múltiplas mensagens sejam enviadas
dentro da mesma resposta HTTP, mas que estejam sujeitas à implementação dos
agentes de usuário e proxies que requerem respostas HTTP incompletas para ser
entregue ao cliente Bayeux [19].
BOSH Ou “Bidirectional-streams Over Synchronous HTTP”, é uma tecnologia que emula um fluxo bidirecional via HTTP entre cliente e servidor, usando
múltiplos requests/responses sı́ncronos de HTTP. BOSH consegue uma largura
de banda eficiente, para aplicativos que requerem comunicações “push” e “pull ”,
e baixa latência, sem requerimento de polling ou segmentação assı́ncrona, como
é feito na técnica conhecida como Comet [20].
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
2.2
10
Estado da arte
Os requerimentos definidos pelo IETF para o futuro protocolo HTTP incluem um
bom desempenho para os navegadores convencionais e móveis e um amplo grau
de compatibilidade com versões anteriores. O desenvolvimento das especificações
de HTTP 2.0 tem como referência as caracterı́sticas de SPDY [21]. WebSocket
e SPDY são tecnologias que incluem as caracterı́sticas principais das tecnologias
descritas na seção 2.1 como o Pipelining, reutilização da conexão aberta TCP,
multiplexação de fluxos de dados, o Server Push, etc., e seus drafts de especificações no IETF e W3C são muito ativos em termos de grupo de interesse.
Ambos são candidatos para a próxima especificação de HTTP 2.0.
2.2.1
Protocolo WebSocket
É uma tecnologia web desenvolvida como parte do padrão entrante HTML5 [22],
com suporte para comunicação bidirecional e full-duplex, ao contrário de tecnologias como BOSH ou equivalentes, que requerem apenas uma única conexão de
socket para que as mensagens sejam enviadas entre o cliente e o servidor. Servidores proxy e firewall com WebSocket são conscientes que usam o canal HTTP e
que podem operar também sobre SSL [23]. O API de WebSocket está sendo padronizado pelo W3C, e o protocolo WebSocket foi padronizado pelo IETF como
RFC 6455 [24].
2.2.2
Protocolo SPDY
SPDY [5] é um novo protocolo da camada de aplicação desenvolvido pela empresa
Google Inc. para transportar mensagens HTTP de forma mais rápida. SPDY foi
projetado para reduzir a latência e aumentar a segurança. SPDY é considerado
um substituto para o HTTP e como protocolo de pacotes (frames) tem suporte
para a codificação de dados binários e suporte nativo para TLS (SSL). SPDY
adiciona um framing layer ou camada de enquadramento para a multiplexação
de fluxos de mensagens HTTP simultâneos, através de uma única conexão TCP.
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
11
O framing layer é otimizado para fluxos request/response do tipo HTTP, tal que
os aplicativos que rodam sobre HTTP atualmente podem trabalhar sobre o SPDY
com pouca ou nenhuma alteração dependendo do desenvolvimento dos aplicativos
web.
A sessão SPDY permite requests simultâneos HTTP para rodar em uma única
sessão TCP/IP, e oferece quatro melhorias sobre HTTP:
• Requests multiplexados. Não existe limite para o número de requests
que podem ser emitidos simultaneamente em uma única conexão SPDY.
Como os requests são intercalados em um único canal, o protocolo é mais
eficiente sobre TCP.
• Requests priorizados. Os clientes podem solicitar certos recursos para
serem entregues primeiro. Isto evita o problema de congestionar o canal
de rede com os recursos não crı́ticos, quando um pedido de alta prioridade
está pendente.
• Cabeçalhos comprimidos. Os clientes atualmente enviam uma quantidade significativa de dados redundantes na forma de cabeçalhos HTTP
devido ao fato de que uma única página web pode requerer 50 ou 100 subrequests. Comprimir os cabeçalhos economiza uma quantidade significativa
de largura de banda além de reduzir a latência em relação ao HTTP, assim
SPDY comprime os cabeçalhos dos requests e responses HTTP utilizando
zlib [25], um método de compressão baseado em dicionário amplamente
utilizado [26].
• Server pushed streams. Permite aos clientes receber dados de servidores
sem precisar da requisição deles.
A especificação técnica de SPDY está dividida em duas partes: Framing Layer
e HTTP Layer. O framing layer, no último draft [5] considera seis partes: sessões,
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
12
que está associado às conexões, framing, fluxos, que entre suas caracterı́sticas considera a priorização do request, tratamento de erros, fluxo de dados e tipos de frames de controle. No HTTP Layer, o SPDY tenta preservar a semântica existente
de HTTP embora a sintaxe de transmitir essa semântica tenha mudado. Entre
essas mudanças considera-se o gerenciamento da conexão, o request/response de
HTTP e transações enviadas pelo servidor. A figura 2.2 mostra o diagrama para
conexões SPDY, baseado no tı́pico intercâmbio de pacotes TCP [27], onde vários
parâmetros de tempo são necessários para caraterizar esse intercâmbio como: O
round-trip time ou tempo de ida/volta que tarda um pacote enviado desde um
emissor, o segment transmission time, como tempo que leva para enviar o maior
número possı́vel de pacotes, o tempo de execução do algoritmo de controle de
congestionamento slow-start, e finalmente o tempo de processamento do request
no servidor SPDY.
Cliente
SPDY
Servidor
SPDY
Setup
(PING,
SETTINGS)
round-trip
time(RTT)
Request inicial
(SYN_STREAM)
“tempo de
processamento”
Response
(SYN_REPLY,
DATA_FRAME)
segment
transmission
time
slow-start
sustained
transfer
...
Figura 2.2: Diagrama de conexões SPDY. As setas grossas indicam a transferência
de dados, enquanto as setas finas mostram os tipos de frames SPDY: PING,
SETTINGS, SYN STREAM, SYN REPLY e DATA FRAME.
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
2.3
13
Algoritmos de Escalonamento
Para o gerenciador de requests com prioridade, alguns algoritmos de escalonamento são considerados, alguns bem conhecidos de teorias de sistemas operacionais, tais como: Escalonamento Round-Robin, Escalonamento por Prioridade
e Escalonamento em Filas Multinı́vel, e também algumas propostas tais como:
Weighted Fair Queuing e Weighted Round-Robin.
2.3.1
Escalonamento Round-Robin
Um dos mais antigos, simples, justos algoritmos amplamente utilizado é o escalonamento round-robin (ERR). A cada frame SPDY (FS) é atribuı́do um intervalo
de tempo, chamado quantum, o qual é permitido para executar. Se o FS atual
ainda está em execução no final do quantum, no escalonador SPDY (ES) ocorre
uma preempção e cede o lugar a outro FS. Se o FS foi bloqueado ou terminado
antes que tenha decorrido o quantum, um novo FS é escolhido na fila pelo escalonador. O round-robin é fácil de implementar. O escalonador tem uma fila de
frames, como é mostrado na figura 2.3-a. Quando o frame FS não termina após
um quantum, ele é colocado no final da fila, como é mostrado na figura 2.3-b.
Atual
Frame
FS1
Próximo
Frame
Atual
Frame
FS3
FS2
(a)
FS4
FS2
FS4
FS3
FS1
(b)
Figura 2.3: Escalonamento Round-Robin. (a) Fila de frames. (b) Fila de frames
quando F S1 não termina após de um quantum.
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
14
O único problema interessante com o escalonamento round-robin é a duração
do quantum.
Definir um quantum com pouco tempo provocaria muitas co-
mutações dos frames e uma baixa na eficiência do escalonador, mas defini-lo
com muito tempo pode causar uma má resposta aos requests interativos curtos
[28].
Fair Queuing
No fair queuing (FQ), os frames FS são enviados e armazenados
em filas. O algoritmo de escalonamento round-robin é usado para servir todas as
filas de uma forma justa. A principal vantagem do FQ é que os fluxos em rajadas
não afetam o desempenho global [29].
2.3.2
Escalonamento por Prioridade
O escalonamento round-robin faz a suposição implı́cita que todos os frames FS são
igualmente importantes. A necessidade de levar em conta fatores externos, leva
ao escalonamento por prioridade (EP). A ideia básica é simples: A cada frame
FS é atribuı́da uma prioridade e o FS com a maior prioridade tem permissão de
execução.
A fim de prevenir a execução indefinida dos frames FS com maior prioridade,
o escalonador ES pode diminuir a prioridade dos FS atualmente em execução
em cada ciclo de relógio (isto é, a cada interrupção do relógio). Se essa ação
atribui uma prioridade menor para deixar sem execução ao próximo FS com maior
prioridade, então um troco de FS ocorre. Alternativamente, a cada FS pode ser
atribuı́do um tempo máximo de quantum que é permitido para executar. Quando
este quantum se esgota, é dada a oportunidade de execução ao próximo FS com
prioridade mais alta.
É frequentemente conveniente agrupar os frames FS em classes de prioridade
e usar o escalonamento por prioridade entre as classes, mas com o escalonamento
round-robin dentro de cada classe. A figura 2.4 mostra um sistema com quatro
classes de prioridade. O algoritmo de escalonamento é da seguinte maneira: enquanto existam frames FS executáveis na classe de prioridade 1, basta executar
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
15
cada um por um quantum “round-robin por turnos”, sem preocupar-se pelas classes de menor prioridade, se a classe de prioridade 1 está vazia então executamos
os frames FS da classe round-robin 2. Se as classes 1 e 2 são ambas vazias, em
seguida, executamos a classe round-robin 3, e assim por diante. Se as prioridades
não são ajustadas ocasionalmente, todas as classes de menor prioridade podem
morrer por inanição [28].
Prioridade máxima
FS1
FS2
FS3
FS8
FS4
FS7
FS5
FS8
FS6
FS9
FS3
FS5
FS4
FS1
Despachador
Escalonador
FS2
FS6
FS7
FS9
Prioridade mínima
Figura 2.4: Um algoritmo de escalonamento com quatro classes de prioridade.
2.3.3
Escalonamento em Filas Multinı́vel
O algoritmo de escalonamento em filas multinı́vel, divide a fila pronta em várias filas separadas, como na figura 2.5. Os frames FS são permanentemente atribuı́dos
a uma fila, geralmente baseados em alguma propriedade do FS, seja pela prioridade ou pelo tipo de frame. Cada fila tem seu próprio algoritmo de escalonamento. Por exemplo, de duas filas separadas com frames FS, a primeira fila pode
ser escalonada por um algoritmo de escalonamento ERR, enquanto a segunda fila
pode ser escalonada por um algoritmo de escalonamento EP.
Cada fila tem prioridade absoluta sobre as filas de prioridade inferior, também
pode ser atribuı́do um intervalo de tempo entre as filas. Assim, cada fila recebe
certa porção de tempo, o qual pode então, escalonar entre seus múltiplos frames
FS [30].
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
16
Prioridade Alta
Tempo
Real
FS9
FS7
FS3
FS1
preemptado
Sistema
FS
FS
FS
FS
FS0
preemptado
Interativo
FS
FS
FS
FS
preemptado
Lote
FS
FS
Prioridade baixa
FS
FS
preemptado
Figura 2.5: Escalonamento em Filas Multinı́vel.
2.3.4
Weighted Fair Queuing
O weighted fair queuing (WFQ), é uma técnica de escalonamento de frame de
dados, que permite diferentes prioridades de escalonamento para os fluxos de
dados multiplexados estatisticamente. A ideia deste algoritmo pode ser facilmente
explicada como uma combinação dos algoritmos de escalonamento por prioridade
e fair queuing. Tal como no método FQ, todas as filas são servidas de maneira
que não existe qualquer inanição de largura de banda, mas algumas filas têm
mais peso no sentido que elas recebem mais serviço. Em outras palavras, o peso
é dado a cada fila para atribuir diferentes prioridades às filas. Os frames são
armazenados na fila apropriada de acordo com sua classificação.
A figura 2.6 mostra um exemplo do algoritmo WFQ. Os tempos finais são
atribuı́dos somente para um uso qualitativo. Atribuindo um peso alto para uma
fila, ele deve permitir ao escalonador tomar mais de um frame FS dessa fila que
das as outras [29].
CAPÍTULO 2. REVISÃO BIBLIOGRÁFICA
17
Fila 1 (50%)
FS1
FS2
FS3
Ordem da transmissão de frames
Fila 2 (25%)
FS4
FS5
FS6
FS8
FS9
Escalonador
FS9
FS7
FS8
FS5
FS6
FS4
FS2
FS3
FS1
Fila 3 (25%)
FS7
Figura 2.6: Weighted Fair Queuing.
2.3.5
Weighted Round-Robin
O Weighted Round-Robin (WRR) é um algoritmo de escalonamento onde o buffer é dividido em k filas que representam os fluxos ativos, o algoritmo percorre
cada fila e um fator de ponderação determina quantos bytes de dados do sistema
entrega de cada fila antes de passar para a próxima fila. Um peso é associado a
cada fila proporcionalmente à taxa de bits requerida da fila e, a maneira como as
filas são servidas é através de uma disciplina Round-Robin de acordo com o peso:
cada fila é servido proporcionalmente a seu próprio peso [31].
Alta
Filas
FS1
FS2
FS3
FS1
FS4
FS7
FS5
FS8
FS6
FS2
FS5
P=4
FS6
FS8
P=3
Despachador
FS9
Escalonador
FS9
FS4
P=2
FS7
FS3
P=1
Baixa
Figura 2.7: Weighted Round-Robin.
A figura 2.7 mostra um exemplo do algoritmo WRR. O escalonamento WRR
previne que as filas de menor prioridade sejam ignoradas completamente durante
os perı́odos de tráfego de alta prioridade. Ao utilizar este escalonamento, as filas
de baixa prioridade têm a oportunidade de transmitir frames FS, embora as filas
de alta prioridade não estejam vazias.
Capı́tulo 3
Metodologia
Fluxos e Prioridades em SPDY Apesar de que as caracterı́sticas atuais do
protocolo HTTP restringem seu ótimo desempenho como o envio de um único
request por conexão, cabeçalhos HTTP redundantes, etc., SPDY retém a compatibilidade e mantém a estrutura básica de HTTP, tal como a semântica dos requests
e response, ao contrário de WebSocket que requer uma reprogramação no processo
de encapsulamento de HTTP [24]. Além disso, oferece a multiplexação de fluxos,
que proporciona benefı́cios adicionais como priorizar os requests, garantindo que
os mais importantes tenham prioridade sobre os menos importantes. Em SPDY,
o iniciador de um fluxo, atribui uma prioridade ao request que é representado por
um número inteiro de 0 a 7, sendo 0 a maior prioridade e 7 a menor prioridade
[5].
3.1
Padrões de projeto para transmissão de dados de tipo sı́ncrono e assı́ncrono
Para a implementação do escalonamento de fluxo e a concorrência em um servidor
SPDY, serão considerados padrões de projeto de arquitetura de software para o
gerenciamento de eventos em sistemas de rede que usam mecanismos sı́ncronos e
assı́ncronos, entre os quais temos os padrões Reactor e Proactor. Comparado aos
mecanismos sı́ncronos, os mecanismos assı́ncronos são atrativos porque oferecem
o benefı́cio da concorrência enquanto aliviam muito a sobrecarga e a complexidade
do multi-threading [32].
18
CAPÍTULO 3. METODOLOGIA
19
Padrão de projeto Reactor O Reactor é um padrão que simplifica o trabalho aos aplicativos orientados a eventos através da integração da demultiplexação
sı́ncrona de eventos e o despacho de seus gerenciadores de eventos correspondentes. O padrão Reactor está constituı́do pelos seguintes participantes: Handles,
que identificam os recursos que são gerenciados por um sistema operacional; O
demultiplexador sı́ncrono de eventos, que bloqueia os recursos esperando pela
ocorrência de eventos em um conjunto de Handles; A iniciação do despachador,
que define uma interface para o registro, remoção e envio dos gerenciadores de
eventos; Os gerenciadores de eventos, que especificam uma interface usada pela
iniciação do despachador chamando de volta aos métodos hook 1 pré-registrados
para processar certos tipos de eventos e finalmente o gerenciador de eventos concretos, que implementa os métodos hook que processam eventos em uma forma
especı́fica da aplicação [33]. A figura 3.1 mostra um diagrama de interação para
o padrão Reactor.
Callback:
Programa Gerenciador de
principal eventos concretos
Initializa
Registrar o
gerenciador
:Reactor
Reactor()
registrar_gerenciador(callback)
Obter o
gerenciador
obter_gerenciador()
Executar no
mesmo laço
gerenciar_eventos()
Esperar por
eventos
Despachar
gerenciador(es)
:Handles
select()
gerenciar_evento(tipo_evento)
Figura 3.1: Diagrama de interação para o padrão Reactor.
1
Os Métodos hook são definidos em interfaces ou classes abstratas e devem necessariamente
ser implementados por uma aplicação.
CAPÍTULO 3. METODOLOGIA
20
Padrão de projeto Proactor O Proactor é um padrão usado para descrever
como iniciar, receber, demultiplexar, despachar e processar eventos. Seu principal objetivo é melhorar o desempenho de um aplicativo orientado a eventos
que recebe e processa múltiplos eventos de forma assı́ncrona. O padrão Proactor é desenvolvido da seguinte forma: quando um evento chega, a entidade do
aplicativo, referido a um iniciador, começa uma operação assı́ncrona apropriada,
em seguida, o Proactor registra o evento com um gerenciador e despachador de
eventos associados ao processador de operações assı́ncronas, logo após, o iniciador
invoca a operação assı́ncrona registrada no processador de operações assı́ncronas.
Uma operação assı́ncrona é executada sem bloquear o thread de controle do gerenciamento de eventos, assim, ele pode realizar outras operações. Uma vez
que a operação é concluı́da, o processador de operações assı́ncronas recupera informações do gerenciador e despachador de eventos correspondentes, e gera um
evento de conclusão contendo os resultados da operação assı́ncrona, logo após, demultiplexa e despacha o evento para o gerenciador de eventos associado à operação
assı́ncrona. Posteriormente, o gerenciador de eventos processa os resultados da
operação assı́ncrona e chama novamente a aplicação [32].
O padrão Proactor oferece os seguintes benefı́cios: maior portabilidade da
lógica da aplicação, encapsulamento do mecanismo de concorrência pelo despachador de conclusão, uma polı́tica de threading desacoplada da polı́tica de concorrência, maior separação de interesses, e maior desempenho e simplificação da
sincronização de aplicativos. No entanto, ele também tem os seguintes inconvenientes: o escalonamento e controle de operações pendentes e a dificuldade de
depuração [34]. A figura 3.2 mostra um diagrama de interação para o padrão
Proactor.
CAPÍTULO 3. METODOLOGIA
Iniciador do
Proactor
Operação
assíncrona iniciada
21
Processador
da Operação
Assíncrona
Operação
Assíncrona
Despachador
de conclusão
Gerenciador
de conclusão
registrar(operação, gerenciador, despachador)
executar()
Operação realizada
assincronamente
despachar()
Operação concluída
gerenciar_evento()
Gerenciador de
conclusão notificado
Figura 3.2: Diagrama de interação para o padrão Proactor.
Em resumo, tanto o Reactor quanto o Proactor são padrões de projeto focados
nos aplicativos orientados a eventos e que compartilham principalmente as funções
de registro, demultiplexação e gerenciamento de múltiplos eventos.
I6
I5
I4
I3
I2
I1
Fila
(a)
I3
I2
I1
Fila 0
I1
Fila 1
I2
I1
Fila 2
I4
I3
I2
I1
Fila 3
I1
Fila 4
I3
I2
I1
Fila 5
I2
I1
Fila 6
I1
Fila 7
(b)
Figura 3.3: Registro de Eventos (a) Reactor. (b) Proactor.
A figura 3.3 mostra o registro de eventos em ambos padrões, é utilizada uma
fila como estrutura de dados de armazenamento dos eventos para a implementação
do mecanismo sı́ncrono do padrão Reactor. A diferença do Proactor é que utiliza
oito filas chamadas filas de prioridade para implementar o mecanismo assı́ncrono.
Além disso, tanto o Reactor quanto o Proactor também compartilham a
mesma estrutura do algoritmo 1 de gerenciamento de eventos, mas a diferença
deles está na função de demultiplexação dos eventos onde, no Reactor é realizado
através do desenfileiramento do evento pronto na única fila utilizada enquanto
no Proactor é realizado por meio de uma dinâmica de desenfileiramento que será
descrita no capı́tulo 4, ambos gerenciam o evento obtido com a mesma lógica para
responder à requisição envolvida no evento.Como se pode deduzir, o Proactor é
CAPÍTULO 3. METODOLOGIA
22
Algorithm 1 Algoritmo de Gerenciamento de Eventos
1: procedure Handle Events
2:
loop
3:
while queue.size > 0 do
4:
queueItem = Dequeue()
. Demultiplexing Events
5:
response = HandleEvent(queueItem)
6:
Send response
7:
end while
8:
end loop
9: end procedure
uma versão do Reactor que, mesmo assim que conceitualmente sejam distintos,
adiciona oito filas de prioridade para melhorar o gerenciamento dos eventos.
3.2
Metodologia para a avaliação dos resultados
A avaliação se baseou na comparação do desempenho entre as diferentes estratégias de gestão de fluxo SPDY, testadas durante a execução do escalonador.
Assim, tendo em conta os parâmetros de tempo do diagrama de SPDY na figura 2.2, vamos considerar como parte da avaliação o tempo de processamento
nas filas de prioridade do escalonador baseado nos algoritmos de padrões de projeto Reactor e Proactor do servidor SPDY.
Os modelos de tráfego adotados para os testes da rede, estarão baseados no
tráfego gerado por um grupo de outstations ou estações exteriores DNP3 [7], enviando dados de potência de uma planta de produção de energia, mas adicionando
diferentes prioridades para cada estação DNP3 e incorporando sua atualização
de dados no fluxo SDPY.
Cliente SPDY
Internet
Servidor SPDY
Rede
Figura 3.4: Esquema do projeto.
A técnica básica para o esquema do poll de atualização, utilizado no DNP3,
CAPÍTULO 3. METODOLOGIA
23
permite que o servidor interaja com o cliente retornando imediatamente uma
resposta aos requests periódicos de atualização, ou seja, quando ocorrem as alterações dos dados, enquanto que o cliente mantenha a subscrição. Esta abordagem é descrita na especificação, mas não é comum em aplicativos reais devido
ao fato de que não otimiza o procedimento de notificação de alteração de dados
para o cliente. A figura 3.5 mostra a abordagem básica do poll de atualização.
Request de
Atualização
Cliente SPDY
Servidor SPDY
Response do
Servidor
Cliente SPDY
Servidor SPDY
Figura 3.5: Abordagem básica do poll de atualização.
Capı́tulo 4
Desenvolvimento de um
protótipo de servidor SDPY
O desenvolvimento do protótipo de servidor SPDY abrangeu os dois primeiros
objetivos especı́ficos indicados na seção 1.2. O projeto foi desenvolvido na linguagem de programação Python e com o uso de bibliotecas externas que dão suporte
ao protocolo SSL, utilizando OpenSSL que adiciona a extensão “Next Protocol
Negotiation” (NPN) [35] para negociar o uso de SPDY sobre uma conexão segura, e também para sockets assı́ncronos, adaptando a biblioteca “asyncore”1
para complementar ao correto funcionamento do escalonador SDPY.
A pesquisa da especificação do protocolo SPDY e, o estudo dos dois padrões
de projeto e dos cinco algoritmos de escalonamento selecionados, descritos no
capı́tulo 3, permitiram atingir o primeiro objetivo especı́fico indicado na seção
1.2.
Para o desenvolvimento do protótipo de servidor SPDY, a estrutura do request/response SPDY está baseada na especificação do draft SPDY [5] versão
três, versão atual suportada por navegadores e servidores que utilizam esta tecnologia, e a estrutura do escalonador, nesta primeira versão do protótipo, está
baseada no padrão de projeto Proactor. A figura 4.1 mostra uma visão geral das
etapas desenvolvidas na primeira versão do servidor SPDY.
1
A biblioteca “asyncore” fornece uma infraestrutura básica para desenvolver o gerenciamento
de sockets assı́ncronos, http://docs.python.org/3/library/asyncore.html.
24
CAPÍTULO 4. DESENVOLVIMENTO DE UM PROTÓTIPO DE SERVIDOR SDPY25
<< loop >>
Servidor SPDY
Escalonador - Proactor
Criar o Proactor
como base para
o escalonador de
SPDY
Envolver o
frame SPDY
e a prioridade
em um evento
Enfileirar o
evento acordo à
prioridade
atribuida
<< request SPDY>>
Despachar o
novo frame
SPDY obtido de
gerenciar o
evento
desenfileirado
<< response SPDY>>
Cliente SPDY
Figura 4.1: Visão geral das etapas desenvolvidas no projeto.
Funcionamento do escalonador SPDY A execução do servidor SPDY contempla inicialmente a criação da instância do Proactor. Criada a instância, dois
métodos serão executados: O registro do gerenciador de eventos, que é preciso
para a análise e processamento dos requests HTTP envolvidos nos frames SPDY,
e o inı́cio do thread de gerenciamento de eventos, que fica esperando pelo menos
um elemento disponı́vel nas filas de prioridade para ser processado pelo gerenciador de eventos.
O processo no escalonador SPDY, baseado em Proactor, compreende três
etapas para atingir o gerenciamento de requests SPDY: O envolvimento do frame
SPDY recebido e sua prioridade atribuı́da em um evento, respeitando a concepção
do Proactor descrita na subseção 3.1; o enfileiramento do evento e por último, o
despacho do frame SPDY resultante do gerenciamento do evento desenfileirado.
Enfileiramento do evento O enfileiramento do evento está baseado na prioridade atribuı́da ao frame SPDY, como item de uma das oito filas de prioridade
criadas segundo a especificação de SPDY [5]. A figura 4.2 mostra o diagrama de
interação para o enfileiramento de eventos no escalonador SPDY.
CAPÍTULO 4. DESENVOLVIMENTO DE UM PROTÓTIPO DE SERVIDOR SDPY26
: Servidor
SPDY
Enfileiramento
iniciado
: QueueItem :PriorityQueue :Queue
: Proactor
Enqueue(handleID, event, priority)
setHandle(handleID)
Estabelecer
parâmetros nos
items da fila
setEvent(event)
Enqueue(queueItem, priority)
Procurar a fila
baseado na
prioridade
FindPriorityQueue(priority)
Enqueue(queueItem)
Enfileirar o
evento
Figura 4.2: Diagrama de interação para o enfileiramento de eventos.
Despacho do frame SPDY O processo de despacho de um novo frame SPDY,
inicia com o desenfileiramento do evento pronto para gerenciar. A figura 4.3
mostra a dinâmica de desenfileiramento utilizada nas oito filas de prioridade do
escalonador SDPY, onde para desenfileirar um evento é necessário cumprir com
a sequência de prioridade desde a fila de prioridade mais alta até a mais baixa.
Portanto, começa a desenfileirar o evento pronto a partir da fila de mais alta
prioridade. Se essa fila estiver vazia, continua-se com a próxima fila de menor
prioridade e assim por diante.
<< loop >>
Alta
prioridade
Fila 0
I3
I2
I1
Fila 1
I2
I1
Fila 2
I4
I3
I2
I1
Fila 3
I1
Fila 4
Baixa
prioridade
I3
I2
I1
Fila 5
I2
I1
Fila 6
I1
Fila 7
Figura 4.3: Dinâmica do desenfileiramento de eventos.
Com o evento desenfileirado, procedemos a tratar seu pedido com a análise
do frame SPDY envolvido. Essa análise compreende principalmente conhecer
qual é o tipo de frame SPDY para poder atender o requerimento. Assim, de
CAPÍTULO 4. DESENVOLVIMENTO DE UM PROTÓTIPO DE SERVIDOR SDPY27
acordo à especificação do protocolo SPDY, geramos um novo frame SPDY com
a informação solicitada. A figura 4.4 mostra o diagrama de interação para o
despacho de eventos no escalonador SPDY.
:Proactor
Desenfileiramento
iniciado
:PriorityQueue
:Queue
: QueueItem
:HTTP
Handler
Dequeue()
FindQueueItem()
Procurar o item
pronto e
desenfileirar
da fila
Dequeue()
queueItem
queueItem
GetEvent()
Obter os
parâmetros do
item
Gerenciar o
evento a
despachar
event
GetHandle()
handleID
HandleEvent(event)
Figura 4.4: Diagrama de interação para o despacho de eventos.
Gerenciamento assı́ncrono de sockets
O “asyncore” é uma biblioteca que
trabalha com sockets gerenciados de forma assı́ncrona, seu desenho é baseado em
eventos e é utilizada para desenvolver servidores de rede com requests concorrentes. Estas caraterı́sticas ajudam muito ao desenvolvimento do escalonador SPDY,
mas essa biblioteca não tem suporte para sockets envolvidos em SSL, e além disso,
cada socket entrante é tratado na ordem de chegada e fechado imediatamente,
não podendo se adequar a um esquema de gerenciamento com prioridade. Devido
a esses inconvenientes na biblioteca, foi adicionado um patch de suporte para sockets envolvidos em SSL e foram implementados métodos para o gerenciamento
de erros e fechamento dos sockets.
Capı́tulo 5
Resultados
A fim de abranger a avaliação do tempo de processamento nas filas de prioridade
do escalonador SPDY, foi definido um ambiente de teste usando quatro máquinas
clientes e um servidor para transmitir requests com diferentes prioridades entre 0
e 7. O servidor e as máquinas clientes possuem as seguintes caracterı́sticas:
Servidor
Máquina 1
Máquina 2
Máquina 3
Máquina 4
Intel
Intel
Intel
Intel
Intel
Core
Core
Core
Core
Core
i5
i5
i5
i5
i5
Processador
3333M, 4 Núcleos
2430M, 4 Núcleos
3333M, 4 Núcleos
3333M, 4 Núcleos
3333M, 4 Núcleos
de
de
de
de
de
3.2
2.4
3.2
3.2
3.2
GHz
GHz
GHz
GHz
GHz
RAM
4 GB
4 GB
4 GB
4 GB
4 GB
Sistema Operacional
Ubuntu 12.04, 32 bits
Ubuntu 12.04, 64 bits
Ubuntu 12.04, 32 bits
Ubuntu 12.04, 64 bits
Ubuntu 12.04, 64 bits
Tabela 5.1: Caracterı́sticas do servidor e das máquinas clientes.
Para determinar as faixas de prioridades e os tempos de envio dos requests
transmitidos por cada cliente para o servidor SDPY, foram utilizados quatro
arquivos de teste configurados com a seguinte estrutura: o valor da prioridade e
tempo de inter-arrival em milissegundos.
Arquivos de Teste Três dos quatro arquivos de teste contêm tempos de interarrival de três dispositivos DNP3 industriais reais chamados de A, F e J, os quais
enviam dados de uma planta de energia para uma central de controle SCADA,
estes tempos de inter-arrival foram obtidos a partir de medições ao longo de uma
semana de funcionamento da planta, além disso, a cada tempo de inter-arrival foi
atribuı́do um valor de prioridade selecionado aleatoriamente das maiores prioridades que estão entre 0 e 2. Os dados destes arquivos têm o objetivo de simular uma
28
CAPÍTULO 5. RESULTADOS
29
situação real de monitoramento enviando requests simultâneos por cada cliente.
Os tempos de inter-arrival do quarto arquivo ou arquivo de tráfego de fundo,
foram criados utilizando uma função de distribuição normal1 com média de 0.039
segundos e desvio padrão de 1.0 em um intervalo de tempo total de 90 horas.
Além desta grande quantidade de dados de tempo de inter-arrival foi atribuı́do
aleatoriamente a cada tempo um valor de prioridade menor do que os arquivos
A, F e J que está entre 3 e 7. Os dados deste último arquivo têm o objetivo
de manter cheias as filas de prioridade gerando um efeito de stress no servidor
SPDY. A figura 5.1 mostra a estrutura e alguns dados dos arquivos de teste.
A
2
0
1
0
2
.
.
.
F
4000
6000
8000
4000
262000
0
0
2
1
0
.
.
.
J
8000
78000
2000
26000
2000
2
1
1
0
1
.
.
.
Tráfego de Fundo
8000
22000
18000
4000
18000
7
4
6
6
3
.
.
.
614.094
109.847
1168.76
1083.66
703.774
Figura 5.1: Estrutura dos arquivos de Teste A, F, J e Tráfego de Fundo com o
valor da prioridade na primeira coluna e o tempo de inter-arrival na segunda.
Descrição do Teste Após da execução do servidor SPDY, cada cliente envia
o primeiro request e o servidor retorna uma response SPDY contendo texto com
sintaxe HTML e JavaScript aos clientes a fim de que possam anexar o arquivo
de teste a seguir. Assim cada cliente vai continuar um tráfego principal com
prioridades entre 0 e 2 ou um tráfego de fundo com prioridades entre 3 e 7 por
request. O código 5.1 mostra a função que é utilizada para gerar o conteúdo da
response SPDY, esta função contêm três parâmetros e se o primeiro parâmetro,
que é boolean, é verdadeiro, então lê o conteúdo de um arquivo com sintaxe HTML
e JavaScript de geração do formulário que permite anexar arquivos.
1
A função normrnd de Matlab gera números aleatórios a partir de uma função de distribuição
normal, http://www.mathworks.com/help/stats/normrnd.html.
CAPÍTULO 5. RESULTADOS
30
def g e t r e s p p r o c t i m e h t m l ( self , f i l e t e s t , t e s t a t t , p r e v t i m e ) :
try :
resp = ’ ’
if not f i l e t e s t :
r e s p = ’<form i d =\’myform \ ’ method=post> ’ \
’<t a b l e b o r d e r =\ ’0\ ’ > ’ \
’<t r ><th>Timer :</ th> <td><i n p u t type =\’ t e x t \ ’ ’ \
’ i d =\’ t i m e r \ ’ v a l u e= ’+t e s t a t t [ 0 ] + ’></td></t r > ’
\
’<t r ><th>P r e v i o u s Time:</ th> <td><i n p u t type= ’ \
’ \ ’ t e x t \ ’ i d =\’ p r e v t i m e \ ’ v a l u e= ’+p r e v t i m e+ ’> ’
\
’</td></t r > ’ \
’<i n p u t type =\’ hidden \ ’ i d =\’ c u r t i m e \ ’ v a l u e= ’+
\
t e s t a t t [ 0 ] + ’> ’ \
’<i n p u t type =\’ hidden \ ’ i d =\’nrow \ ’ v a l u e= ’+ \
t e s t a t t [ 1 ] + ’> ’ \
’<i n p u t type =\’ hidden \ ’ i d =\’ p r i o r i t y \ ’ v a l u e= ’+
\
t e s t a t t [ 2 ] + ’> ’ \
’</ t a b l e > ’ \
’</form> ’
else :
f = open ( ’www/ p r o c t i m e a j a x . html ’ , ’ rb ’ )
r e s p = f . r e a d ( ) . decode ( ’UTF−8 ’ )
f . close ()
return r e s p . encode ( ’ u t f −8 ’ )
except IOError a s e :
raise E x c e p t i o n ( ’ h t t p h a n d l e r − g e t r e s p p r o c t i m e h t m l : ’ \
’ I /O e r r o r ( { 0 } ) : {1} ’ . format ( e . e r r n o , e . s t r e r r o r ) )
except E x c e p t i o n a s e r r :
raise E x c e p t i o n ( ’ h t t p h a n d l e r − g e t r e s p p r o c t i m e h t m l : ’ , \
err )
Código 5.1: Geração do conteúdo da response SPDY.
As linhas dos arquivos de teste enviados pelos clientes no próximo grupo
de requests são armazenados em uma estrutura de dados do servidor a fim de
que possa gerenciar os novos requests até o final do teste. A response SPDY
para cada request contem texto com sintaxe HTML que inclui três parâmetros
preenchidos com o tempo que tem que esperar o cliente SPDY para enviar o
próximo request, a prioridade que vai ter esse request e o ı́ndice do próximo
elemento da estrutura de dados que o servidor tem que obter para atender o
CAPÍTULO 5. RESULTADOS
31
request enviado. Assim, no código 5.1, se o primeiro parâmetro é falso, então
geramos a sintaxe HTML de um formulário com campos que são preenchidos com
os valores dos outros parâmetros da função. A figura 5.2 mostra a representação
dos últimos procedimentos anteriormente descritos.
Cliente
Cliente
Cliente
Máquina 1
Máquina 4
Máquina
F
A
Cliente
Cliente
Máquina 3
Tráfego de
Fundo
J
Prioridade,
Índice
Tempo,
Prioridade,
Índice
Máquina 2
Servidor SPDY
Estrutura de
dados
Servidor SPDY
(a)
(b)
Figura 5.2: (a) Armazenamento na estrutura de dados. (b) Gerenciamento dos
novos requests.
A medição do tempo total de processamento2 nas filas de prioridade do escalonador SPDY abrange as funções principais de desenfileiramento e gerenciamento
dos requests. Com a obtenção dos dados de tempo, número de IP do cliente,
prioridade e número de request no escalonador SPDY foram realizados dois experimentos preliminares, o registro em um arquivo de resultados dos tempos de
processamento nas filas de prioridade e a geração de um gráfico3 de Tempo de
inter-arrival vs. Número de Requests.
2
A biblioteca “cProfile” de Python mede o tempo total de execução de uma porção de código,
http://docs.python.org/3.3/library/profile.html.
3
A biblioteca “‘matplotlib” de Python realiza o plotting 2D e 3D de dados, http://
matplotlib.org/.
CAPÍTULO 5. RESULTADOS
5.1
32
Testes I: Análise do comportamento dos tempos de processamento nas oito filas de prioridade
Para atingir a análise do comportamento dos tempos de processamento nas filas de
prioridade, foram realizados distintos experimentos gerando gráficos de Tempo de
processamento vs. Número de Requests. As figuras abaixo mostram os resultados
dos testes que foram executados no servidor SDPY em um tempo total médio de
20 minutos.
Testes 1 e 2 Os testes 1 e 2 foram executados utilizando um dos clientes
SPDY para transmitir o tráfego de fundo e os outros clientes o tráfego principal
dos arquivos A, F e J. O esquema de realização destes testes está representado
na figura 5.3.
Cliente
Cliente
Máquina 1
Máquina 4
A
F
Cliente
Cliente
Máquina 3
Tráfego de
Fundo
J
Máquina 2
Servidor SPDY
Figura 5.3: Esquema dos testes 1 e 2.
A figura 5.4 mostra que o Teste 1 realizado em um tempo total de 20 minutos
alcança um número de requests de 517 e um tempo de processamento máximo de
0.0367 ms.
A figura 5.5 mostra que o Teste 2 realizado em um tempo total de 20 minutos
alcança um número de requests de 508 e um tempo de processamento máximo de
0.0392 ms.
CAPÍTULO 5. RESULTADOS
33
Figura 5.4: Plotting 2D do teste 1 utilizando um cliente SPDY para transmitir o
tráfego de fundo.
Figura 5.5: Plotting 2D do teste 2 utilizando um cliente SPDY para transmitir o
tráfego de fundo.
Testes 3 e 4 Os testes 3 e 4 foram executados utilizando um cliente SPDY,
distinto ao usado nos testes 1 e 2, para transmitir o tráfego de fundo e os outros
clientes o tráfego principal dos arquivos A, F e J. O esquema de realização destes
testes está representado na figura 5.6.
CAPÍTULO 5. RESULTADOS
34
Cliente
Cliente
Máquina 4
Tráfego de
Fundo
Máquina 1
A
Cliente
Cliente
Máquina 3
J
F
Máquina 2
Servidor SPDY
Figura 5.6: Esquema dos testes 3 e 4.
Figura 5.7: Plotting 2D do teste 3 utilizando outro cliente SPDY para transmitir
o tráfego de fundo.
A figura 5.7 mostra que o Teste 3 realizado em um tempo total de 20 minutos
alcança um número de requests de 457 e um tempo de processamento máximo de
0.035 ms.
A figura 5.8 mostra que o Teste 4 realizado em um tempo total de 35 minutos com 46 segundos alcança um número de requests de 774 e um tempo de
processamento máximo de 0.038 ms.
Testes 5 e 6 Os testes 5 e 6 foram executados utilizando um cliente SPDY,
distinto ao usado nos anteriores testes, para transmitir o tráfego de fundo e os
outros clientes o tráfego principal dos arquivos A, F e J. O esquema de realização
CAPÍTULO 5. RESULTADOS
35
Figura 5.8: Plotting 2D do teste 4 utilizando outro cliente SPDY para transmitir
o tráfego de fundo.
destes testes está representado na figura 5.9.
Cliente
Cliente
Máquina 4
Tráfego de
Fundo
J
Cliente
Cliente
Máquina 3
Máquina 1
A
F
Máquina 2
Servidor SPDY
Figura 5.9: Esquema dos testes 5 e 6.
A figura 5.10 mostra que o Teste 5 realizado em um tempo total de 20 minutos
e 13 segundos alcança um número de requests de 461 e um tempo de processamento máximo de 0.039 ms.
CAPÍTULO 5. RESULTADOS
36
Figura 5.10: Plotting 2D do teste 5 utilizando outro cliente SPDY para transmitir
o tráfego de fundo.
Figura 5.11: Plotting 2D do teste 6 utilizando outro cliente SPDY para transmitir
o tráfego de fundo.
A figura 5.11 mostra que o Teste 6 realizado em um tempo total de 20 minutos
alcança um número de requests de 436 e um tempo de processamento máximo de
0.04 ms.
CAPÍTULO 5. RESULTADOS
5.2
37
Testes II: Análise e comparação do comportamento dos tempos de processamento em
uma fila sem prioridade e nas oito filas de
prioridade
Para ter uma melhor visualização do comportamento dos tempos de processamento nas filas de prioridade e assim poder observar em quais filas os requests se
processam em menor tempo e em quais se gerenciam mais, foram gerados distintos
gráficos em 3D considerando novamente o tempo de processamento e o número de
request adicionando como terceiro parâmetro a prioridade ou o número de cliente
de acordo com a análise.
Nas figuras abaixo serão mostradas dois tipos de análise com o objetivo de
fazer a comparação visual entre elas, a primeira considera a proposta deste trabalho com a adição das oito filas de prioridade no gerenciamento dos requests no
escalonador SPDY com gráficos de Tempo de Processamento vs. Número de requests vs. Prioridade. A segunda considera somente uma fila de armazenamento
dos requests atribuindo para cada um deles a mesma prioridade com gráficos de
Tempo de Processamento vs. Número de requests vs. Cliente.
Teste 7 As figuras 5.12, 5.13, 5.14 mostram os gráficos do experimento que
utilizou os três arquivos de tempos reais de teste A, F, J e o arquivo de tráfego de
fundo. Como resultado se pode observar que nos 20 minutos de execução do teste
os 126 requests com prioridades entre 0 e 2 são processados em um tempo médio
de 0.0012 ms e os 378 requests com prioridades entre 3 e 7 são processados em
um tempo médio de 0.0019 ms alcançando um tempo de processamento máximo
no teste de 0.025 ms.
CAPÍTULO 5. RESULTADOS
38
Figura 5.12: Vista 1: Plotting 3D do teste 7 utilizando oito filas de prioridade.
Figura 5.13: Vista 2: Plotting 3D do teste 7 utilizando oito filas de prioridade.
CAPÍTULO 5. RESULTADOS
39
Figura 5.14: Vista 3: Plotting 3D do teste 7 utilizando oito filas de prioridade.
Teste 8 As figuras 5.15, 5.16, 5.17 mostram os gráficos do experimento que
utilizou quatro arquivos de teste que contêm os mesmos dados de tempo do
arquivo de tráfego do fundo, atribuindo aleatoriamente para três deles as maiores
prioridades entre 0 e 2. O objetivo deste experimento é a execução simultânea
com tempos curtos de envio entre requests para alcançar o mais alto nı́vel de
stress no servidor. Como resultado se pode observar que nos 20 minutos de
execução do teste os 1062 requests com prioridades entre 0 e 2 são processados
em um tempo médio de 0.002408 ms e os 380 requests com prioridades entre 3 e
7 são processados em um tempo médio de 0.002416 ms alcançando um tempo de
processamento máximo no teste de 0.063 ms. Além disso, se pode observar que
com esta grande quantidade de transmissão de dados são gerenciados com maior
prioridade aqueles requests com prioridades entre 0 e 2.
CAPÍTULO 5. RESULTADOS
40
Figura 5.15: Vista 1: Plotting 3D do teste 8 utilizando oito filas de prioridade.
Figura 5.16: Vista 2: Plotting 3D do teste 8 utilizando oito filas de prioridade.
CAPÍTULO 5. RESULTADOS
41
Figura 5.17: Vista 3: Plotting 3D do teste 8 utilizando oito filas de prioridade.
Teste 9 As figuras 5.18, 5.19, 5.20 mostram os gráficos do experimento que
utilizou novamente nos quatro arquivos de teste os dados de tempo do arquivo de
tráfego de fundo com a diferença que se atribuı́ram a todos os tempos a mesma
prioridade com valor 0. O objetivo deste experimento é observar o comportamento
dos tempos de processamento em um contexto sı́ncrono de gerenciamento de
requests e de fazer uma comparação com a proposta das oito filas de prioridade
no escalonador SPDY. Como resultado se pode observar que nos 20 minutos
de execução do teste os 1550 requests são processados em um tempo médio de
0.00246 ms alcançando um tempo de processamento máximo de 0.06 ms.
CAPÍTULO 5. RESULTADOS
42
Figura 5.18: Vista 1: Plotting 3D do teste 9 utilizando uma fila de prioridade.
Figura 5.19: Vista 2: Plotting 3D do teste 9 utilizando uma fila de prioridade.
CAPÍTULO 5. RESULTADOS
43
Figura 5.20: Vista 3: Plotting 3D do teste 9 utilizando uma fila de prioridade.
5.3
Testes III: Análise e comparação do comportamento dos tempos de processamento
nas oito filas com prioridade e quantum de
tempo
Tomando em consideração a caracterı́stica principal do algoritmo de escalonamento Round-Robin, o quantum descrito nas subseções 2.3.1 e 2.3.2, foi atribuı́do
a cada fila de prioridade um tempo máximo de execução ou quantum com a
finalidade que os requests armazenados nas filas com menor prioridade sejam
processados com maior frequência e assim se possa controlar mais a inanição.
Empiricamente foi atribuı́do um quantum a cada fila de prioridade com valores
entre 0.8 a 0.1 segundos nessa ordem, assim à dinâmica de desenfileiramento,
descrita no capı́tulo 4, foi adicionada um novo controle de tempo de execução
para cada fila de prioridade. Assim, se esse tempo de execução fosse maior ao
quantum atribuı́do, então deixa de gerenciar os demais requests da fila atual
que está atingindo para continuar com os requests da próxima fila de menor
CAPÍTULO 5. RESULTADOS
44
prioridade, e assim por diante com cada fila de prioridade. A figura 5.21 mostra
a nova dinâmica de desenfileiramento para o teste utilizando um quantum de
tempo para cada fila de prioridade.
<< loop >>
Alta
prioridade
Baixa
prioridade
...
Fila 0
I3
I2
I1
Fila 1
I2
I1
Fila 2
q= 0.8 sec
q= 0.7 sec
q= 0.6 sec
I1
Fila 7
q= 0.1 sec
Figura 5.21: Nova dinâmica de desenfileiramento para o teste.
As figuras abaixo mostram os gráficos de dois experimentos realizados com
quatro arquivos de teste que contêm os mesmos dados de tempo que do arquivo de
tráfego de fundo onde dois deles têm atribuı́dos aleatoriamente para cada tempo
as maiores prioridades entre 0 e 2 e os outros dois têm atribuı́dos aleatoriamente
prioridades entre 3 e 7, com o objetivo de realizar uma comparação entre estes
experimentos.
Teste 10 As figuras 5.22, 5.23 mostram os gráficos do experimento realizado
com o mesmo gerenciamento sobre as oito filas de prioridade descritos no primeiro
experimento da seção 5.2 em um tempo total de 20 minutos, onde o escalonador SDPY alcança gerenciar 759 requests nas filas de maior prioridade com um
tempo médio de processamento de 0.002304 ms, 480 requests nas filas de menor
prioridade com um tempo médio de processamento de 0.002388 ms e um máximo
tempo de processamento entre os requests de 0.064 ms.
CAPÍTULO 5. RESULTADOS
45
Figura 5.22: Vista 1: Plotting 3D do teste 10 utilizando oito filas de prioridade.
Figura 5.23: Vista 2: Plotting 3D do teste 10 utilizando oito filas de prioridade.
CAPÍTULO 5. RESULTADOS
46
Teste 11 As figuras 5.24, 5.25 mostram os gráficos do experimento realizado
com o quantum de tempo para cada fila de prioridade, descrito nesta seção, em
um tempo total de 20 minutos, onde o escalonador SDPY alcança gerenciar 740
requests nas filas de maior prioridade com um tempo médio de processamento de
0.002836 ms, 541 requests nas filas de menor prioridade com um tempo médio de
processamento de 0.002945 ms e um máximo tempo de processamento entre os
requests de 0.084 ms. Como se pode observar nos dois experimentos realizados
com os mesmos arquivos de teste, a utilização de um quantum para cada fila de
prioridade permite gerenciar mais requests das filas de menor prioridade.
Figura 5.24: Vista 1: Plotting 3D do teste 11 utilizando um quantum para cada
fila de prioridade.
CAPÍTULO 5. RESULTADOS
47
Figura 5.25: Vista 2: Plotting 3D do teste 11 utilizando um quantum para cada
fila de prioridade.
Em resumo as tabelas 5.2 e 5.3 contêm os resultados dos testes descritos nas
seções 5.2 e 5.3:
Teste 7
Teste 8
Prioridades
0-2
3-7
0-2
3-7
Teste 9
N. Requests
126
378
1062
380
1550
Tempo Médio de Proc.
0.0012 ms
0.0019 ms
0.002408 ms
0.002416 ms
0.00246 ms
Tempo Max. de Proc.
0.025 ms
0.063 ms
0.06 ms
Tabela 5.2: Resultados dos Testes 7, 8 e 9.
Teste 10
Teste 11
Prioridades
0-2
3-7
0-2
3-7
N. Requests
759
480
740
541
Tempo Médio de Proc.
0.002304 ms
0.002388 ms
0.002836 ms
0.002945 ms
Tempo Max. de Proc.
Tabela 5.3: Resultados dos Testes 10 e 11.
0.064 ms
0.084 ms
Capı́tulo 6
Conclusões
O Proactor, como padrão projetado para aplicativos orientados a evento que
recebem e processam múltiplos eventos de forma assı́ncrona, se adéqua às caracterı́sticas requeridas no escalonador SPDY permitindo a concorrência e ótimo
gerenciamento dos requests transmitidos pelos clientes SDPY.
A inclusão de oito filas de prioridade no escalonador SPDY ajuda a alcançar no
Proactor o conceito de mecanismo assı́ncrono, além de que obedece à priorização
dos requests como uma das melhorias de SPDY sobre HTTP. Os testes baseados,
em grande parte nesta funcionalidade do escalonador SPDY e descritos na seção
5.2, demonstram que os requests com maior prioridade são processados na média
em menor tempo além de que são gerenciados em maior quantidade, ao contrário
dos requests com menor prioridade que são gerenciados em menor quantidade
alcançando tempos de processamento máximos em alguns requests e na média
maior tempo de processamento.
A atribuição de um quantum, como caracterı́stica principal do algoritmo de
escalonamento Round-Robin, ou tempo de execução para cada fila de prioridade,
descrito na seção 5.3, melhorou o gerenciamento dos requests armazenados em
todas as filas de prioridade, prevenindo a execução indefinida dos requests com
maior prioridade e aumentando a quantidade de requests gerenciados com menor
prioridade.
Este trabalho demonstrou que se alcançamos simular uma situação real com
o envio de dados gerados por dispositivos industriais de uma planta de energia,
48
CAPÍTULO 6. CONCLUSÕES
49
tomando em consideração o ótimo funcionamento do escalonador SDPY, então
os aplicativos de monitoramento poderiam adotar as caracterı́sticas do protocolo
SPDY para melhorar o desempenho atual da técnica de atualização de dados
descrita na seção 3.2.
Referências Bibliográficas
[1] T. Berners-Lee, R. Fielding, and H. Frystyk. Hypertext Transfer Protocol –
HTTP/1.0. http://www.ietf.org/rfc/rfc1945.txt, May 1996.
[2] R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, and T. Berners-Lee.
Hypertext Transfer Protocol – HTTP/1.1.
http://www.ietf.org/rfc/rfc2616.txt, June 1999.
[3] J.F. Kurose and K.W. Ross. Computer Networking: A Top-Down Approach.
Addison-Wesley, 2010.
[4] Ilya
Grigorik.
Optimizing
HTTP:
Keep-alive
and
Pipelining.
http://www.igvita.com/2011/10/04/optimizing-http-keep-alive-andpipelining, Oct. 2011.
[5] R. Peon M. Belshe.
SPDY Protocol.
http://tools.ietf.org/html/draft-
mbelshe-httpbis-spdy-00, Feb. 2012.
[6] Modbus Organization. Modbus Application Protocol Specification v1.1b3.
http://www.modbus.org/docs/Modbus Application Protocol V1 1b3.pdf,
April 2012.
[7] IEEE Draft Standard for Electric Power Systems Communications Distributed Network Protocol (DNP3). IEEE P1815/D08, January 2012,
pages 1–858, Feb 2012.
[8] OPC
Foundation.
OPC
http://www.opcfoundation.org/, July 2003.
50
XML-DA
Specification.
REFERÊNCIAS BIBLIOGRÁFICAS
[9] OPC
Foundation.
51
OPC
Unified
Architecture.
http://www.opcfoundation.org/UA.
[10] N.M. Torrisi. Cyberopc. http://www.cyberopc.org.
[11] N.M. Torrisi. Monitoring Services for Industrial. Industrial Electronics Magazine, IEEE, 5(1):49 –60, March 2011.
[12] Jan Newmarch. Introduction to stream control transmission protocol. Linux
J., (161):7, Sep. 2007.
[13] P. Natarajan, P. Amer, J. Leighton, and F. Baker.
SCTP for HTTP.
http://tools.ietf.org/html/draft-natarajan-http-over-sctp-02, July 2009.
[14] Bryan F. Structured Stream Transport. http://pdos.csail.mit.edu/uia/sst,
March 2007.
[15] W3C
HTTP-NG
project.
MUX
Overview.
http://www.w3.org/Protocols/MUX, Dec. 2000.
[16] Shishir
G.
CGI
Programming
on
the
World
Wide
Web.
http://oreilly.com/openbook/cgi/ch06 06.html, March 1996.
[17] P. McCarthy and D. Crane. Comet and Reverse Ajax: The Next-Generation
Ajax 2.0. Apresspod Series. Apress, 2008.
[18] Mathieu Carbou.
met.
Reverse Ajax,
Part 1:
Introduction to Co-
http://www.ibm.com/developerworks/web/library/wa-reverseajax1,
July 2011.
[19] Alex R., Greg W., David D., and Mark N. Bayeux Protocol – Bayeux 1.0.0.
http://svn.cometd.com/trunk/bayeux/bayeux.html, 2007.
[20] XMPP
Standards
Foundation.
XMPP
Technologies:
http://xmpp.org/about-xmpp/technology-overview/bosh.
BOSH.
REFERÊNCIAS BIBLIOGRÁFICAS
[21] IETF.
Hypertext
52
Transfer
Protocol
Bis
(httpbis).
https://datatracker.ietf.org/wg/httpbis/charter/, 2012.
[22] World Wide Web Consortium. W3C. http://www.w3.org.
[23] Ilya
Grigorik.
Ruby
&
Websockets:
TCP
for
the
Browser.
http://www.igvita.com/2009/12/22/ruby-websockets-tcp-for-the-browser,
Dec. 2011.
[24] A.
Melnikov
I.
Fette.
The
Websocket
Protocol.
http://tools.ietf.org/html/rfc6455, Dec. 2011.
[25] Mark A. Greg R., Jean-loup G. zlib. http://zlib.net/, July 2012.
[26] Fan Y., Paul A., Jonathan L., and Mike B. A methodology to derive SPDY’s
initial dictionary for zlib compression.
[27] J. Heidemann, K. Obraczka, and J. Touch. Modeling the performance of
HTTP over several transport protocols. Networking, IEEE/ACM Transactions on, 5(5):616–630, 1997.
[28] Andrew S. Tanenbaum. Modern Operating Systems. Prentice Hall PTR,
2001.
[29] Chuck Semeria. Supporting Differentiated Service Classes: Queue Scheduling
Disciplines. Juniper Networks, 2001.
[30] Abraham S., Peter B. G., and Greg G. Operating Systems Concepts. JOHN
WILEY & SONS. INC, 2005.
[31] Ioannou, Aggelos, Katevenis, and Manolis G. H. Pipelined heap (priority
queue) management for advanced scheduling in high-speed networks. IEEE/ACM Trans. Netw., 15(2):450–461, Apr. 2007.
REFERÊNCIAS BIBLIOGRÁFICAS
53
[32] U. Praphamontripong, S. Gokhale, A. Gokhale, and J. Gray. Performance
Analysis of an Asynchronous Web Server. In Computer SW and App. Conf.,
COMPSAC ’06. 30th Annual Int., volume 2, pages 22–28, Sept. 2006.
[33] Douglas C. S. Reactor – An Object Behavioral Pattern for Concurrent Event
Demultiplexing and event handler dispatching, 1995.
[34] Douglas C. S. James Hu, Irfan P. Applying The Proactor Pattern to HighPerformance Web Servers. In Proceedings of the 10th Int. Conf. on Parallel
and Distributed Computing and Systems, 1998.
[35] A. Langley. Transport Layer Security (TLS) Next Protocol Negotiation Extension. draft-agl-tls-nextprotoneg-03, April 2012.
Download

Dissertaç˜ao de Mestrado Jhon Franko Jorge Velarde APLICAC