Pra quem teve a oportunidade de experimentar o Azure APP Service em ambientes de produção, provavelmente notou que a performance tanto para aplicações PHP quanto nodes.js ficam abaixo do esperado quando comparamos VMs Linux de hardware similares.

Minha experiência com plataformas WordPress, Moodle, e outros CMS, embora 100% compatíveis, é de que costumam performar mal no IIS. Sendo assim, em alguns casos, eu acabo recomendando à meus clientes que utilizem IaaS ao invés do PaaS para ambientes críticos ou de produção.

Felizmente, este mês a Microsoft anunciou o suporte ao Linux como backend do APP Service (que ainda está em preview!!) como forma de facilitar a migração de aplicações destes ambientes para o PaaS, mas isso me deixou curioso se a performance também não poderia ser melhor ao utilizarmos o Apache. Embora o Apache não seja necessariamente um dos web servers mais rápidos, perdendo feio para o meu preferido nginx, ainda assim me parece uma melhor opção ao IIS para estes casos.

Ambiente de Testes

Sendo assim, resolvi testar as duas plataformas para verificar se realmente o Apache poderia prover melhor performance que o IIS. Meu ambiente de testes foi o seguinte:

  • Meu Blog WordPress executando em tier Basic 1 (1 core, 1.75GB)
  • MySQL em IaaS executando em VM DS2 (2 cores, 3.5GB, SSD)
  • Cache de aplicação desligado
  • Simulação de usuários simultâneos: 250
  • Duração do teste: 5min

Para a simulação foi utilizado o Performance Test do próprio App Service, que nada mais é que a funcionalidade de teste de carga do VS Team Services.

Windows

Começando pelo backend Windows, os resultados foram bastante impressionantes.

brazilwindowsrequests

Em 5 minutos foi possível alcançar a marca de 13392 requests com sucesso a uma média de 44.64 req/seg. O tempo de resposta foi alto, quase 7 segundos, mas dentro do esperado dado a quantidade de usuários acessando a aplicação e o tier utilizado no backend. Lembrando que estamos falando de 1 core e 1.75GB de memória apenas.

brazilwindowsrequests2

Linux

Agora vamos ver como se sai nosso amigo pinguim.

westuslinuxrequests4

Com números ainda mais impressionantes, o App Service no Linux foi capaz de bater a marca de 25.448 requests no mesmo período. A média agora foi de 84.83 req/seg. e o tempo de resposta consideravelmente menor, ficou em 5.29 seg.

westuslinuxrequests5

O problema aqui, conforme podem ver na imagem, é o número de requests com falha, o que impacta diretamente no no tempo de resposta e na quantidade de requests por segundos, pois o retorno de um erro 500 ou qualquer outro tipo de erro pode ser bem mais rápido do que processar a página em si. Mesmo assim, se considerarmos apenas os requests com sucesso, já temos um pequeno ganho.

Contra-Prova

Resolvi refazer os testes 3 vezes para tirar uma média tanto do ambiente Windows quanto Linux e o resultado foi o seguinte:

Windows:

Requests Sucesso Requests Falha Requests/Seg Avg. Resp Time
run 1 13392 0 44.64 6.98
run 2 11718 243 39.87 7.28
run 3 11529 278 39.35 7.32

Note que a performance foi diminuindo a medida que os testes eram refeitos. Acredito que por conta da baixa quantidade de memória e o working set ter aumentado significativamente a cada run fez com que esse resultado acontecesse. De qualquer maneira, o App Service no Windows conseguiu se manter a uma média muito boa durante os testes.

Linux:

Requests Sucesso Requests Falha Requests/Seg Avg. Resp Time
run 1 14123 11325 84.83 5.29
run 2 10130 8365 61.65 6.97
run 3 4474 14523 63.62 3.91
run 4 0 200 120.17 0.67

Já no Linux, note como a performance foi degradando rapidamente a cada run. Embora tenha apresentado um número consideravalemente maior de requests, uma boa parte deles tiveram falha. Na terceira execução, o número foi tão alto que resolvi executar uma quarta bateria e o resultado foi na falha total do ambiente. O backend rodando a aplicação morreu completamente de forma que nem um restart resolvia. Fica aqui o ponto de atenção de que estamos falando de uma plataforma que ainda está em preview, sendo assim não há SLA, nem muitas das melhorias que temos para o mesmo ambiente de produção. De fato, quando comparamos as funcionalidades do App Service executando em Windows, notamos uma gama enorme de ferramentas e funcionalidades no portal do Azure, enquanto em execução no Linux só podemos fazer algumas tarefas básicas.

De qualquer maneira a conclusão que chego é que há um enorme potencial neste anúncio e tão logo for anunciado melhorias no ambiente Linux ou entrar em GA irei refazer os testes e talvez até a níveis de detalhes maior, pois tudo aqui foi muito simples.

Para quem quiser saber mais sobre o App Service em Linux, pode conferir nas referências.

Referências:

  1. Azure App Service improves Node.js and PHP developer experience
  2. App Service on Linux Documentation