Hoje resolvi testar a minha aplicação de várias formas, pra ver se a nova versão do Rails traria algum benefício de fato para mim.
Primeiro rodei o Apache Benchmark na aplicação do jeito que ela estava, como Rails 2.1.1:
$ ab -n 50 -c 5 http://localhost:3000/ Concurrency Level: 5 Time taken for tests: 39.938685 seconds Complete requests: 50 Failed requests: 0 Write errors: 0 Total transferred: 1036850 bytes HTML transferred: 1010700 bytes Requests per second: 1.25 [#/sec] (mean) Time per request: 3993.869 [ms] (mean) Time per request: 798.774 [ms] (mean, across all concurrent requests) Transfer rate: 25.34 [Kbytes/sec] received
Hummm.. lento.. muito lento. Já estava preocupado com a hora de colocar isso em produção.
Atualizando o Rails para a versão 2.2 e rodando o benchmark:
$ ab -n 50 -c 5 http://localhost:3000/ Concurrency Level: 5 Time taken for tests: 32.228686 seconds Complete requests: 50 Failed requests: 0 Write errors: 0 Total transferred: 590650 bytes HTML transferred: 564400 bytes Requests per second: 1.55 [#/sec] (mean) Time per request: 3222.869 [ms] (mean) Time per request: 644.574 [ms] (mean, across all concurrent requests) Transfer rate: 17.87 [Kbytes/sec] received
What?? Cadê a melhora de performance? Rails não é Threadsafe agora?
É! Mas você tem que habilitar o recurso nas configurações pequeno Padawan:
No seu arquivo config/development.rb adicione no final:
config.threadsafe!Rodando o Benchmark:
$ ab -n 50 -c 5 http://localhost:3000/ Concurrency Level: 5 Time taken for tests: 6.807438 seconds Complete requests: 50 Failed requests: 0 Write errors: 0 Total transferred: 590620 bytes HTML transferred: 564400 bytes Requests per second: 7.34 [#/sec] (mean) Time per request: 680.744 [ms] (mean) Time per request: 136.149 [ms] (mean, across all concurrent requests) Transfer rate: 84.61 [Kbytes/sec] received
Muito melhor não?! Uma melhora de quase 500%! Mas e se rodassemos em modo de produção?
$ ab -n 50 -c 5 http://localhost:3000/ Concurrency Level: 5 Time taken for tests: 3.693437 seconds Complete requests: 50 Failed requests: 0 Write errors: 0 Total transferred: 573555 bytes HTML transferred: 547350 bytes Requests per second: 13.54 [#/sec] (mean) Time per request: 369.344 [ms] (mean) Time per request: 73.869 [ms] (mean, across all concurrent requests) Transfer rate: 151.62 [Kbytes/sec] received
Impressionado pequeno Padawan? Cuidado! Nada disso aqui significa que sua aplicação vai ficar tão melhor quanto a minha somente com a nova versão do Rails. A aplicação em questão aqui envolve muitos cálculos complexos, e por isso tira vantagem do threading.
Tentei fazer alguns testes com o mysqlplus, driver de mysql pra ruby que promete acesso assíncrono ao banco de dados. O tutorial que eu segui simplesmente não funcionou no meu ambiente. Li em algum dos posts que pesquisei que eles estavam concentrando esforços pra fazer funcionar com o Rails 2.2 e corrigir alguns bugs.
Rails escala? Pra minha aplicação sim. E pra sua?




