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

 

21 pensamentos sobre “DataSnap Performance Test -Pt Br

  1. […] can check the results in the Roberio article here. The article is in PT-Br, so, probably you will have to use google translator (Not ideal, but it […]

    Curtir

  2. Bem, atualmente não estou envolvido com projetos Delphi, alem das ferramentas citadas por você eu já utilizei o Delphi on Rails – http://delphionrails.blogspot.com.br/ – em um projeto REST que teve uma performance interessante e também um ex-colega de trabalho utilizou o Delphi MVC Framework http://www.danieleteti.it/2012/02/02/delphi-mvc-web-framework-hello-world/ – para uma aplicação REST que também teve uma performance muito boa, caso queira considerar essa ferramentas para uso em seus projeto.

    Abraço.

    Curtir

  3. abouchez disse:

    DataSnap for XE7 did see huge improvements, but indeed not so good performance when running on heavy load.
    It is good to have Brook and Sparkle in the comparison.
    And no surprise that Sparkle is very close to mORMot: both uses http.sys for serving the web content!

    For “1 thread e 100000 requisições”, of course what you are measuring here is tied to the network latency, so would vary.
    IMHO “100 thread e 100000 requisições” are the most interesting numbers. Even if this is not a “real world” test.
    But what I can’t understand is why XE7 is slower for both Sparkle and mORMot than older versions of Delphi. Sounds due to some change (regression?) done at the Delphi RTL level, not at framework level.

    Here we only test “Hello World”, over a network. The fact that it is over a network is pretty much better than on localhost.
    I guess we may benefit from testing the whole chain, i.e. client request -> http server -> server orm/db access -> server json computation -> client json unserialization chain.
    You may be surprised!

    Curtir

    • thank you , always rapid responses

      Curtir

    • Wodzu disse:

      “But what I can’t understand is why XE7 is slower for both Sparkle and mORMot than older versions of Delphi. Sounds due to some change (regression?) done at the Delphi RTL level, not at framework level.”

      Definitely worth checking out, isn’t it? Perhaps EMB engineers screw something up but I am sure you will fix it:)

      Curtir

      • I will change some things , And retest

        Curtir

      • abouchez disse:

        I took the liberty to execute the following loop:

        procedure TThreadTest.Execute;
        var i: integer;
        s: RawByteString;
        begin
        for i := 1 to OBJ_NUM do begin
        TSynCache.Create.Free;
        s := ‘12345’;
        s[1] := AnsiChar(i mod 10+48);
        s[2] := AnsiChar(i mod 10+49);
        end;
        end;

        And there seems to be no regression when creating objects in XE7.

        Starting tests on Delphi 2007…
        Took 2.49s for creating 200000 objects in 8 threads for an average of 642,281 objects per second

        Starting tests on Delphi XE4…
        Took 2.58s for creating 200000 objects in 8 threads for an average of 619,116 objects per second

        Starting tests on Delphi XE7…
        Took 2.51s for creating 200000 objects in 8 threads for an average of 635,302 objects per second

        So I do not know (yet) the root cause of this speed regression. Perhaps just the fact that it has been tested after the others, and CPU Resources (e.g. IP ports) are exhausted… Do not know…

        Curtir

      • Wodzu disse:

        “I will change some things , And retest”

        Thanks a lot for testing roberiopraciano 🙂

        “So I do not know (yet) the root cause of this speed regression. Perhaps just the fact that it has been tested after the others, and CPU Resources (e.g. IP ports) are exhausted… Do not know…”

        It could be the reason in one test sample but we see that perfromance decreased in each test. Arnaud, don’t you have your own performance tests to confirm that something has gotten bad at the RTL level?

        Curtir

      • abouchez disse:

        @Wodzu
        As I wrote in the English version of this blog article, XE7 is not slower from our own tests. I even tried to reproduce the potential “multi-thread Create” problem, without any regression.
        So I do not know why it is slower under XE7 in those tests.

        Curtido por 1 pessoa

      • I will retest again today, but only compile And execute

        Curtir

  4. Nelson Lima disse:

    Prezado,

    Estou desenvolvendo um framework para trabalhar com Rest/Json e integração de plataformas, movel, desktop, e web. Fiz algumas implementações que impactaram diretamente da performasse. Tenho interesse a submeter a testes e divulgar o projeto. como podemos fazer?

    Atenciosamente,

    Nelson Lima
    jnelson3@ig.com.br

    Curtir

  5. warleyalex disse:

    O problema mais preocupante é quando o servidor “craches”. Minha conclusão é: qualquer servidor DataSnap antes XE7 é vulnerável a um simples DoS ataque 🙂

    Seria interessante, ver DataSnap “under pressure”, poderia incluir nos testes um comparativos de %erros utilizando acessos a dados e não um simples “hello world”.

    Curtir

  6. Parabéns pelo artigo. Desenvolvi algumas soluções usando o datasnap e o XE5 e tive problemas com estabilidade e consumo de memória. Analisando seus testes, percebi que o XE7 teve um bom avanço nessas questões. Pretendo desenvolver uma solução multi plataforma, mas até então não tinha confiança o suficiente para ter um “RELACIONAMENTO SÉRIO” com o Datasnap. Vamos ver se o XE7 agora me conquista. Abraços a todos.

    Curtir

  7. Eu achei que era um artigo muito interessante, eu estava começando a implementar aplicações DataSnap e este artigo me fez repensar a forma como eu vou para perceber a Implementação

    Curtir

  8. Efrain disse:

    Aproximadamente vinte anos em seguida, dessa forma, da promulgação da Autoridade Eusébio com Queirós, que proibiu negócio dentre escravos,
    a 4 desde setembro dentre 1850. https://www.linkedin.com/in/joaoanderson/

    Curtir

  9. Trabalhar Pela Internet disse:

    Você tem fez seu posição muito efetivamente . . https://Vendernainternetblog.Wordpress.com/

    Curtir

Deixe um comentário