Programacao

Benchmarks de ambiente de servidor - Node vs. PHP vs. Java vs. Go

Em Notas de Referência e complementando ao artigo anterior onde fiz alguns testes e comparei algumas requisições HTTP simples com servidores implementados em PHP, Java, Node.js e Go:

Os benchmarks foram executados em uma máquina virtual CentOS 7.3 (Linux 3.10.0-514.el7.x86_64) (Intel Core i7, 4 núcleos @ 2,2 GHz, 1 GB de RAM) em execução no VirtualBox em um laptop Mac.  Os tempos foram obtidos com o ApacheBench (v.2.4.6).

  • PHP v5.4.16;  Apache v2.4.6
  • Java (OpenJDK) 1.8.0_131-b11;  Tomcat v7.0.69 (sem APR/nativo)
  • Node.js v6.10.3
  • Go v1.8.1

Observe:

Tem havido bastante discussão aqui sobre a versão utilizada para PHP, a linha de comando do Node.js e possíveis otimizações de performance através de configuração e outros meios.  E você sabe o que - eu concordo plenamente!  Existem muitos, muitos fatores que entram em desempenho e os benchmarks foram apenas uma pequena parte do artigo e não pretendem ser algum tipo de medição oficial.  Se você leu o artigo, sabe que ele fala sobre modelos de E/S - a abordagem usada para cada um, esse foi o foco principal e o objetivo da leitura.  De qualquer forma, seria muito interessante ver outras postagens que fornecem uma comparação objetiva desses ambientes com diferentes números de versão e configurações ajustadas, etc.

Tenho certeza de que todos esses quatro ambientes poderiam ter melhorias de desempenho significativas girando os vários botões e otimizando.

Arquivos/scripts de benchmark:

Todos os arquivos “data.dat” ou /tmp/data são apenas 65536 bytes de dados aleatórios.

PHP

Configuração padrão do apache do CentOS 7.3

Exemplo de comando de referência: ab -n 2000 -c 300 'http://127.0.0.1:80/test.php?n=1'

test.php:

Java

Configuração padrão do tomcat do CentOS 7.3

Exemplo de comando de referência: ab -n 2000 -c 300 'http://127.0.0.1:8080/sample/test.jsp?n=1'

Node

Comando de execução: node main.js

Exemplo de comando de referência: ab -n 2000 -c 300 'http://127.0.0.1:3000/test?n=1'

Go

Comando de execução: go run server.go

Exemplo de comando de referência: ab -n 2000 -c 300 'http://127.0.0.1:4000/test?n=1