Análise de frameworks de sockets em Java
Luciano Macedo Rodrigues
Tópicos
Introdução Frameworks – SEDA Frameworks - Apache MINA Frameworks - QuickServer Análises Análises - Apache JMeter Análises - Problema Resultado das análises Conclusão Bibliografia e anexos
Introdução O objetivo do meu trabalho é apresentar uma comparação entre
diferentes frameworks em Java para comunicação TCP/IP que utilizam os pacotes da Sun para N/IO e Sockets
Para isso, foram escolhidos os frameworks que preenchiam os seguintes requisitos: Alta performance Alta escalabilidade Rapidez no desenvolvimento Open source
Neste trabalho analisaremos a performance de 3 diferentes frameworks: SEDA Apache MINA QuickServer
Frameworks - SEDA SEDA: stage event-driven architecture Matt Welsh, Harvard University Trabalho da tese de doutorado na universidade UC Berkley
visando o desenvolvimento de uma plataforma robusta e de alta performance para serviços de Internet
Utiliza uma arquitetura em estágios determinados por eventos e decompõe uma aplicação de eventos complexos em um conjunto de estágios conectados por filas. Este design evitaria o alto overhead associado aos modelos de concorrência baseados em threads, e desacopla o escalonamento de eventos e threads da lógica de aplicação
http://www.eecs.harvard.edu/~mdw/proj/seda/
Frameworks - SEDA (cont.)
Arquitetura organizada em estágios baseados em eventos
Modelo de um servidor determinado por eventos Cada FSM representa uma única requisição ou fluxo
através do sistema.
Um estágio no SEDAUm estágio é composto de uma fila de eventos, um
pool de threads e um gerenciador de eventos fornecido pela aplicação. A operação é gerenciada pelo Controller, que ajusta a alocação de recursos
dinamicamente
Frameworks - SEDA (cont.) Objetivos
Suportar alta concorrência para evitar perda de performance ocasianada pela criação de threads, o SEDA
utiliza a execução baseada em eventos sempre que possível. Isso também requer que o sistema forneça primitivas de I/O escaláveis e eficientes
utiliza código nativo para execução usando JNI (Java Native Interface) Simplificar a construção de serviços bem estruturados
para reduzir reduce a complexidade na construção de serviços de Internet, o SEDA esconde do programador detalhes de escalonamento e alocação de recursos. O design permite a construção de aplicações em módulos, facilitando a depuração e profiling.
Instrospecção as aplicações devem poder analisar o fluxo de requisições para adaptar seu
comportamento as condições atuais. Por exemplo, o sistema deve poder priorizar e filtrar requisições sob carga alta.
Suportar auto-ajuste e alocação de recursos dinâmica ao invés de impor um limite para aplicação de recursos, ajustar a aplicação de
acordo com o requerido pelos clientes e a performance desejada.
Frameworks - Apache MINA MINA: Multipurpose Infrastructure for Network Applications Framework de alta produtividade e com design “elegante”, e fácil
aprendizagem Alta performance:
Assíncrono Arquitetura baseada em eventos
Testes unitários para simulações sem necessidade de um cliente real
Extensível através da modificação em tempo real do comportamento da aplicação através do uso de filtros
Reusabilidade e manutenibilidade Separação do código de sockets (MINA), codec de protocolo e
lógica de aplicação http://directory.apache.org/subprojects/mina/
Frameworks - Apache MINA (cont.)
IoSessionManager Onde as operações de I/O
ocorrem IoFilters
Filtra eventos de I/O · requisições IoHandler
<Lógica de aplicação> IoSession
Representa uma conexão
Remote Peer
IoSessionManager
IoHandler
IoFilterChain
CoreExtension Point
Protocol Implementation
Legend
Filtered I/O Event I/
O Re
ques
t
I/O Event
Filte
red
I/O
Requ
est
Low-level
I/O
Low
-leve
l I/
O
IoFilter #1
IoFilter #2IoFilter #3
IoSession
Frameworks - Apache MINA (cont.)
IoAcceptor IoConnector
nio::DatagramConnector
nio::SocketConnector
vmpipe::VmPipeAcceptor vmpipe::VmPipeConnector
nio::DatagramAcceptor
nio::SocketAcceptor
IoSessionManagerServidor: aceita
clientesCliente: conecta-se ao servidor
E suas implementações
Frameworks - Apache MINA (cont.) IoFilters
Um interceptador de eventos e requisições Reusabilidade Utiliza um pool de threads Registro de eventos Hot-deployable Exemplo
SSL – TLS
Frameworks - Apache MINA (cont.)
IoAcceptor IoHandler
No thread pool: single thread setting for minimal latency
IoAcceptorThreadPoolFilter
CPU-intensive
jobs(IoFilter)
ThreadPoolFilter
IoHandler
More than one thread pool: special setting for CPU-intensive jobs
IoAcceptorThreadPoolFilter
IoHandler
One thread pool: general setting for high throughput
Frameworks - Apache MINA (cont.) IoFilters: ProtocolCodecFilter Separação explícita e reusabilidade
Lógica de negócio – IoHandler Codec de protocolo – ProtocolCodecFilter
Frameworks - Apache MINA (cont.)Remote Peer
IoSessionManager
IoHandler
IoFilterChain
CoreExtension Point
Protocol Implementation
Legend
Filtered I/O Event I/
O Re
ques
t
I/O Event Filte
red
I/O
Requ
est
Low-level I/O
Low-
level
I/
O
IoSession
ProtocolCodecFilter
Protocol Codec Factory
EncoderDecoder
Encode
Decode
POJO → ByteBuffer
Apenas lógica de negócio!
ByteBuffer → POJO
Frameworks - QuickServer Abstrai a classe java.net.ServerSocket, facilitando
a criação de servidores robustos O esforço fica concentrado na lógica de aplicação e
protocolos Desenvolvida e implementada por Akshathkumar
Shetty Configuração de serviços e alocação de recursos
em XML Provém uma interface de administração remota,
permitindo avaliar as condições reais do servidor http://www.quickserver.org/
Frameworks - QuickServer (cont.) Arquitetura e interfaces de serviços
Frameworks - QuickServer (cont.) QuickServer divide a lógica de aplicaçao em
4 classes ClientCommandHandler
Interação com o cliente - comandos em Strings ClientObjectHandler [Classe opcional]
Interação com o cliente - comandos em objetos Authenticator [Classe opcional]
Usada para autenticar um cliente ClientData [Classe opcional]
Usada para compôr os dados enviados por um cliente (classe de suporte)
Frameworks - QuickServer (cont.)
Análises Para análise dos frameworks foi implementado um servidor HTTP
em cada framework, rodando na porta 8080 Este servidor deverá fornecer uma resposta HTTP válida e um
conteúdo do tamanho de 1kb Serão analisados os seguintes casos de carga:
1. 10 usuários simultâneos, 100 requisições por usuário2. 100 usuários simultâneos, 100 requisições por usuário3. 1.000 usuários simultâneos, 100 requisições por
usuário Serão analisados o tempo de resposta, throughput, taxa de
transmissão alcançada e porcentagem de erros As análises serão realizadas usando a ferramenta JMeter, do
projeto Apache A infra-estrutura usará o Java 5 e sistema operacional Windows
Análises – Apache JMeter
Aplicação desktop 100% escrita em Java desenvolvida para testar o funcionamento, comportamento e performance de sites Web
Inicialmente tinha este objetivo, mas foi expandida para outras funcionalidades, podendo analisar diversos outros serviços
Altamente configurável e interface intuitiva http://jakarta.apache.org/jmeter/
Análises – Problema Apesar de ter sido estudado e implementado, o
servidor HTTP do framework SEDA não pode ser utilizado
Por usar código nativo, o framework exigia a compilação de uma biblioteca escrita em C/C++. O framework não vem acompanhado da biblioteca nativa para Windows
Existe uma extensão para Windows 2000 que acompanha código-fonte e a DLL necessária. A tentativa de usar a DLL fornecida e de outra obtida através da compilação do código-fonte falhou.
Logo, o framework SEDA não terá seu desempenho analisado!
Resultado das análises - Apache Mina
Samples 1.000 10.000 100.000
Média (ms) 20 33 237
Máximo (ms) 125 1015 5188
% Erros 0 35,9 80,5
Throughput (requisições/s) 378,6 433,3 263,7
KB/s 369,7 474,92 329,06
Resultado das análises - Apache MinaApache MINA
0
1000
2000
3000
4000
5000
6000
1.000 10.000 100.000
Média (ms) Máximo (ms) % Erros Throughput (requisições/s) KB/s
Resultado das análises - QuickServerSamples 1.000 10.000 100.000
Média (ms) 59 318 893
Máximo (ms) 953 1829 18297
% Erros 1 60,15 82,65
Throughput (requisições/s) 162,9 224,2 223,7
KB/s 159,58 262,88 278,75
Resultado das análises - QuickServer
QuickServer
0
2000
4000
6000
8000
10000
12000
14000
16000
18000
20000
1.000 10.000 100.000
Média (ms) Máximo (ms) % Erros Throughput (requisições/s) KB/s
Resultado das análises - combinado Combinado
0
2000
4000
6000
8000
10000
12000
14000
16000
18000
20000
1.000 10.000 100.000
Média (ms) - MINA Máximo (ms) - MINA% Erros - MINA Throughput (requisições/s) - MINAKB/s - MINA Média (ms) - QuickServerMáximo (ms) - QuickServer % Erros - QuickServerThroughput (requisições/s) - QuickServer KB/s - QuickServer
Conclusão
Melhor desempenho Apache MINA
Maior facilidade de desenvolvimento Ambos foram de fácil desenvolvimento
Maior número de funcionalidades QuickServer
Possui já suporte a parar/suspender o servidor e uma interface de administração
Ficou faltando o uso do SEDA para ver como se comportaria com o uso de código nativo Assim, poderia se ter um benchmark mais específico de
sistemas operacionais
Conclusão (cont.) Houve pouca alteração conforme a carga exigida no
Apache MINA Para garantir que não houvessem erros, foi
verificada se a carga de dados correspondia ao pacote enviado (1k) Esta taxa manteve-se muito alta no QuickServer
Os frameworks facilitam em muito a programação por permitirem manter o foco na lógica de aplicação
Porém, o desempenho verificado foi abaixo do esperado Alto índice de erros Throughput baixo
Bibliografia e anexos
Bibliografia A bibliografia deste trabalho baseia-se nas
apresentações de arquitetura dos frameworks disponíveis em PDF nos sites incluídos neste trabalho
Anexos Código-fonte das aplicações JAR necessários para compilação Projeto de teste do JMeter