DataSnap Performance Test -Pt Br

Baseado nos trabalhos do Sr  Roberto schneiders.   do blog http://robertocschneiders.wordpress.com/2012/11/22/datasnap-analysis-based-on-speed-stability-tests/

resolvi desenvolver novo teste de performance do datasnap nos mesmos moldes:

Uso delphi desde a versão 7 e talvez não seja a pessoa mais indicada para testar do zero, resolvi pedi autorização ao Sr  Roberto schneiders e usar seus fontes como base para um novo estudo, depois de conversar com ele recebi autorização e comecei os trabalhos.

Como ele abre seus trabalhos , também começo os meus: “Não é dificil ouvir das maravilhas do delphi nas apresentações da embarcadero” , tanto no lançamento dos seus produtos quanto na delphi conference onde tive o prazer de participar de uma 2013, gostaria de poder ir em 2014 mas não foi possível, tendo em vista que nosso Radstudio XE7 nos remete ao nosso querido Delphi 7 e seria uma grande satisfação conhecer ser possível o Sr Marco Cantu.

Histórico e motivação

Brincando com o Datasnap com a intenção de começar um novo projeto, vejo que é um ótimo produto, tanto pra quem usa o modo Rad quanto para os amantes de classes, poo , orm , testamos em laboratório e funcionou muito bem, mas no cliente , no dia a dia como isso funcionaria?,   300 clientes usando em diversas localidades entrando dados, criando produtos, gerando relatórios???, como passar do paradigma  duas camadas para o três camadas, usando o que o delphi tem de melhor, centralização de rotinas e interoperabilidade, pensado com a equipe chegamos a conclusão : Delphi + Datasnap (Http + Rest + Json)  possibilitando assim interoperabilidade plena(todo mundo hoje usa rest+json) e centralização das rotinas, não estou aqui para testar funcionalidades do datasnap vs outras soluções e sim sua performance e estabilidade diante de uma situação extrema e possível, diante dos inúmeros clientes disponíveis hoje e num futuro.

Agora vem o ponto que nos preocupou a matéria http://robertocschneiders.wordpress.com/2012/11/22/datasnap-analysis-based-on-speed-stability-tests/, realmente quando fomos colocar uma simulação de 200 maquinas usando datasnap (via virtualização Aws amazon) nesta época testávamos o datasnap da versão XE , o projeto ficou parado e quando saiu o XE5 retomamos o projeto (Servidor Delphi + Datasnap + Aurelius(orm) +Rest +json) com clientes em Delphi VCL + Delphi Firemonkey +Android (java) +Ios(xcode), e python com cliente web, desenvolvemos o framework e a documentação inicial mas no meio do projeto bateu a duvida como esta o datasnap hoje?, pegamos os fontes dos testes iniciais do Sr Roberto e começamos os testes segue abaixo então nosso parecer,”Testamos a tecnologia DataSnap, a fim de saber qual o nível de desempenho e estabilidade que proporciona, e para verificar se ele realmente atende às nossas exigências. Nosso principal requisito era a capacidade do servidor para gerenciar muitas conexões simultâneas, uma vez que a aplicação é grande e usado por muitos usuários”.

 

“Objetivo

Nosso objetivo foi testar a API DataSnap REST e responder a algumas perguntas:

  • Como ele se comporta em um ambiente com muitas conexões simultâneas?
  • Qual é o desempenho em estado crítico?
  • É estável em estado crítico?”

Parafraseando o blog do Roberto

Hardware Utilizado:

NoteBook Delll 15R SE 4670 I7 3 geração com 8Gb de memoria e 1TB disco. (Servidor)

NoteBook Dell 15R SE 4670 I7 3 geração com 8Gb de memoria 1 1TB de disco(Cliente)

Softwares Utilizados:

Afim de comparação utilizamos:

  • Datasnap (delphi Xe4,Xe5,Xe6,Xe7) (vlc,console,iis) ,(com keepalive e sem keepalive)
  • Mormot (componente livre delphi para versões XE4,XE5,XE6,XE7),
  • Sparkle(Servidor Http da TMS para delphi, para versões XE4XE5XE6XE7)
  • Wcf VisualStudio 2012
  • Node.js(apenas um núcleo)
  • Lazarus utilizando http://brookframework.org/

Para testes utilizamos:

 

 

Afim de documentar todo o processo tirei screenshots de todas as telas durante o processo:

 

Como procedeu os testes:

diagrama

 

Tentando simular um ambiente de rede testamos usando duas situações :

No mesmo computador Servidor e Jmeter

em computadores diferentes Servidor e Jmeter numa rede gigabit

nos testes criamos uma função HelloWorld em cada aplicação e retornamos um objeto json HelloWorld .

Segue parecer:

 

Testamos 4 Variaveis:

Requisições

Numero de requisições por segundo

Cpu
Uso da Cpu durante o processo

Exception
Quanto de falhas em percentual

Memoria
Consumo de memoria durante o processo

Taxa de erro

 

Operacionalizamos o teste com:

1 Thread e 100000 Requisições

50 Threads e 100000 Requisições

100 Threads e 100000 Requisições

 

 

1 thread e 100000 requisições

Neste teste tanto o delphi como as demais ferramentas funcionaram bem, sem erros ou perca na comunicação mas diante das demais o delphi ficou em abaixo,  apenas o xe6 32 bits usando iis e o xe7 funcionaram dentro de um numero esperado:

Requisições (qtd por segundo)

grafico 1 100

 

 Consumo de Memoria(em MegaBytes):

Até a versão Xe5 o gerenciamento de memoria estava comprometido do xe6 e xe7 aparentemente foi resolvido:

grafico 2 100

 

Uso de Cpu

(% )

aparentemente igual em todos os processos, exceto no uso de consoles pelo datasnap

grafico 3 100

 

Erros(% de erros)

 

Apenas na ferramenta do lazarus apresentou problemas

Lazarus 100000 - 1t

 

 

Agora comeca a ficar interessante

50 thread e 100000 requisições

Requisições(qtd por segundo):

Mesmo não dando tempo de colocar o iis com xe7 percebemos que fica no mesmo patamar, mas estvel é claro mas muito inferior a ferramentas mesmo do mundo delphi:

grafico 4 100

 

Uso de Memoria(em MegaBytes):

No Xe7 Sr Marco Cantu e Equipe fizeram um bom trabalho esta no mesmo patamar dos demais:

 

grafico 5 100

Uso de Cpu

(% )

aparentemente igual em todos os processos, exceto no uso de consoles pelo datasnap e nas versões de console

grafico 6 100

Erros(% de erros)

Até a versão xe6 ainda tinhamos sempre exceptions mas na versão xe7 com keepalive não apareceu mais

grafico 7 100

 

 

100 thread e 100000 requisições

Requisições(qtd por segundo):

Quase a mesma coisa (observação xe7 iis não esta na lista pois perdi a tela de teste e demora muito pra terminar 4 horas aproximadamente, mas acreditem esta um pouco menor que no xe6)

grafico 8 100

 

Uso de Memoria(em MegaBytes):

grafico 9 100

 

 

Erros (% de erros)

Até a versão xe5 tinhamos muitos erros mas fizeram um bom trabalho:

grafico 10 100

 

Conclusões

 

Segue planilha de dados

 

grafico 11 100

 

 

Fica claro que depois da entrada do Sr Marco Cantu como gerente de produto o nosso delphi,  o datasnap melhorou, mas em performance esta muito abaixo de ferramentas do próprio mundo delphi, fico impressionado com a performance do mormot e do Tms Sparkle feitos em delphi, colocando Wcf e node.js(usando apenas um núcleo, sabendo que talvez colocando vários núcleos isso deve melhorar e muito) em terceira e quartas colocações respectivamente, precisamos melhorar a performance , mas fico preocupado com a embarcadero cuidando agora do EMS , vão nos deixar na mão com o datasnap?, posso colocar isso na nuvem pra servir a 1000 clientes com android, ios, mac, windows??

 

Todos os exemplos e servidores foram compilados em maquinas virtuais com apenas a versão do delphi utilizado no modo release e testadas no servidor

 

para quem quiser testar o servidores segue link dos fontes e executáveis bem como screenshot

https://mega.co.nz/#!1Q1ghJRL!VhO919dfzKOdPYVT0b-N-GBE5PadgtStzuHUEWmi94U