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:
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)
Consumo de Memoria(em MegaBytes):
Até a versão Xe5 o gerenciamento de memoria estava comprometido do xe6 e xe7 aparentemente foi resolvido:
Uso de Cpu
(% )
aparentemente igual em todos os processos, exceto no uso de consoles pelo datasnap
Erros(% de erros)
Apenas na ferramenta do lazarus apresentou problemas
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:
Uso de Memoria(em MegaBytes):
No Xe7 Sr Marco Cantu e Equipe fizeram um bom trabalho esta no mesmo patamar dos demais:
Uso de Cpu
(% )
aparentemente igual em todos os processos, exceto no uso de consoles pelo datasnap e nas versões de console
Erros(% de erros)
Até a versão xe6 ainda tinhamos sempre exceptions mas na versão xe7 com keepalive não apareceu mais
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)
Uso de Memoria(em MegaBytes):
Erros (% de erros)
Até a versão xe5 tinhamos muitos erros mas fizeram um bom trabalho:
Conclusões
Segue planilha de dados
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