SlideShare uma empresa Scribd logo
1 de 39
Baixar para ler offline
Globalcode – Open4education
Ruby - Definindo a quantidade de workers para sua app
Weverton do Couto Timoteo
Software Developer
Globalcode – Open4education
Qual app server vocês
utilizam?
Puma Passenger Unicorn
Globalcode – Open4education
Como funciona um web
server?
Web Server
Usuário
HTTP RequestHTTP Response
GET HTTP/1.1
Accept: text/html
Accept-Encoding: gzip
Accept-Language: en-US
Connection: keep-alive
Host: www2.autocargo.com.br
User-Agent: Chrome/42.0.231
HTTP/1.x 200 OK
Date: Sun, 10 May 2015 GMT
Server: nginx/1.4.6 (Ubuntu)
Cache-Control: max-age=0
Content-Type: text/html;
charset=utf-8
X-Powered-By: Phusion
Passenger 4.0.58
Globalcode – Open4education
Qual web server mais
utilizado?
Fonte: rails-hosting.com - 2014
Globalcode – Open4education
Qual app server mais
utilizado?
Fonte: rails-hosting.com - 2014
Globalcode – Open4education
Rack
Premissa:
Todos app servers implementam uma
interface Rack.
Sendo assim todos frameworks web
funcionam com todos app servers.
Globalcode – Open4education
Qual o papel dos app servers?
• Accept/parse de requisições
• Comunicar a web app
através da abstração Rack
• Converter a resposta da
interface Rack (que a web
app retorna)
Globalcode – Open4education
Rack Handlers
• Ebb
• Fuzed
• Glassfish v3
• Phusion Passenger
• Puma
• Reel
• Unicorn
• unixrack
• uWSGI
• yahns
Globalcode – Open4education
Web frameworks suportados
• Camping
• Coset
• Espresso
• Halcyon
• Mack
• Maveric
• Merb
• etc
• Racktools::SimpleApplication
• Ramaze
• Ruby on Rails
• Rum
• Sinatra
• Sin
• Vintage
• Wee
Globalcode – Open4education
Qual app server escolher?
Globalcode – Open4education
Modelos de I/O
• MultiProcess Blocking
• MultiThreading Blocking
• Evented
Globalcode – Open4education
MultiProcess Blocking
• Fácil de trabalhar
• Sem complexidade de multithreading
• Maior consumo de mem. RAM para concorrência
• Slow Clients podem atrasar seu funcionamento
Processo 1 Processo 2 Processo 3
Request Request
Request
Globalcode – Open4education
MultiThreading Blocking
• Menos suscetível ao problema causado por Slow Clients
• Código precisa ser thread safe
• Rails se declarou thread safe em 2008 na versão 2.2
Processo 1
Request
Processo 2 Processo 3
Globalcode – Open4education
Evented
• Concorrência ilimitada
• Não consome tanta mem. RAM
• Imune à Slow Clients
• Requer que app e libs tenham sido escritas tendo em mente
o Evented I/O
Copyright Benjamin Erb
Globalcode – Open4education
Unicorn
• Pre-forking worker model com I/O
bloqueante
• Copy-on-Write
• Evita concorrência (mas a app pode utilizar
threads internamente)
• Filosofia "Pior é melhor”
• Respeita sinais unix muito bem
• Não lida bem com ‘slow clients'
Globalcode – Open4education
Pre-Forking e Copy-on-Write
Master200 MB Master Child 2
Write
Pre-forking
Request Ruby 2.0+
Essa feature só foi implementada no
Garbage Collector do Ruby 2.0+
Globalcode – Open4education
Client
Slow Clients?
Processo 1 Processo 2 Processo 3 Processo N
Slow
Client
Client
Slow
Client
Slow
Client
Slow
Client
Client
Fila de requisições
…
Globalcode – Open4education
Globalcode – Open4education
Pode ser qualquer um!
Globalcode – Open4education
Reverse Proxying
• Buffer de requisições HTTP (e grande responses)
• Gasta o menor tempo possível do userspace
• Serializa I/O de rede um processo do userspace
• Gerencia bem conexões persistentes (HTTP 1.1)
• Deve servir arquivos estáticos
userspace:
Todo código que roda fora da área de
memória virtual das tarefas do Kernel
Globalcode – Open4education
Rainbows
http://rainbows.bogomips.org/
• Baseado no Unicorn
• Desenvolvido para atender apps que esperam longo
tempo de requisição/resposta
Modelos de Concorrência de Rede
• Coolio
• CoolioFiberSpawn
• CoolioThreadPool
• CoolioThreadSpawn
• Epoll
• EventMachine
• FiberPool
• FiberSpawn
• (etc)
Globalcode – Open4education
Threads e Eventos são
difíceis
• Unicorn evita concorrência em cada worker
• Para atender mais requisições, aumentamos o número de
workers
worker_processes
É muito importante saber quanto memória RAM sua app
precisa para definir este número
Globalcode – Open4education
Consumo de Recursos
• Ruby 2.1
• Rails 3.2
• curl
derailed_benchmarks
https://github.com/schneems/derailed_benchmarks
Globalcode – Open4education
derailed_benchmarks
gem 'derailed_benchmarks', group: :development
$ cat << EOF > perf.rake
require 'bundler'
Bundler.setup
require 'derailed_benchmarks'
require 'derailed_benchmarks/tasks'
EOF
Globalcode – Open4education
Medindo uso de memória em
uma app Rails
Globalcode – Open4education
Quantos workers devo
utilizar no Unicorn?
• Quanto mais requests, mais worker_processes
• Quanto mais worker_processes, mais mem RAM
Copyright DigitalOcean
Memory leak?
Globalcode – Open4education
Unicorn Killer
group :production do
gem 'unicorn'
gem 'unicorn-worker-killer'
end
if ENV['RAILS_ENV'] == 'production'
require 'unicorn/worker_killer'
max_request_min = 500
max_request_max = 600
# Max requests per worker
use Unicorn::WorkerKiller::MaxRequests, max_request_min, max_request_max
end
Globalcode – Open4education
Puma
• Inspirado no Mongrel
• Suporta “verdadeiro paralelismo”
• Funciona muito bem com Rubinius e JRuby
• Evented I/O
• Thread Pool
• Clustered Mode
Globalcode – Open4education
É rápido?
PUMA - 78 Mb RAINBOWS! (1X16) - 120 Mb
UNICORN - 1076 Mb RAINBOWS! (16X32) - 1138 Mb
Requests/sec x Number of concurrent requests
Globalcode – Open4education
Heroku recomenda
https://devcenter.heroku.com/articles/rails-unicorn
https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server
Globalcode – Open4education
Por que o Gitlab voltou a
utilizar Unicorn?
http://stackoverflow.com/a/18398991
Globalcode – Open4education
Ruby Raptor aka Passenger 5
• Utiliza todos os cores da CPU disponíveis
• Built-in buffering reverse proxy (Evented I/O)
• Inicia e elimina processos da aplicação de acordo com
o tráfego
• Utiliza preloading e copy-on-write
• HTTP cache integrado
• Garbage collection entre requests
Globalcode – Open4education
Arquitetura do Passenger
Globalcode – Open4education
E o número de workers do
Passenger?
• passenger_max_pool_size (compartilhado entre apps)
• passenger_min_instances (mínimo por app)
• passenger_pool_idle_time (quanto tempo manter worker vivo)
max_app_processes = (TOTAL_RAM * 0.75) / RAM_PER_PROCESS
max_app_threads_per_process =
((TOTAL_RAM * 0.75) - (NUMBER_OF_CPUS * RAM_PER_PROCESS * 0.9)) /
(RAM_PER_PROCESS / 10)
25% livre para o SO
Globalcode – Open4education
Para qualquer app?
Não!
• Blocking I/O: Aumente o número de processos/threads
• CPU-bound: configure conforme o número de CPUs e evite
swap
• Dê preferência ao Nginx, não se preocupe em configurar
https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html
Globalcode – Open4education
E qual o melhor app server?
Puma Passenger Unicorn
Globalcode – Open4education
Obrigado!
@wevtimoteo
@wevtimoteo
weverton.ct@gmail.com
• http://www.slideshare.net/wolcanus/como-definir-a-quantidade-de-
workers-para-sua-aplicacao
• http://goo.gl/GTEGsg
Globalcode – Open4education
Referências
• Rack Documentation - http://rack.github.io/
• Server Architectures for Scalable Web - http://berb.github.io/diploma-
thesis/original/042_serverarch.html
• The Philosophy Behind Unicorn - http://unicorn.bogomips.org/
PHILOSOPHY.html
• Apache MPM prefork - http://httpd.apache.org/docs/current/mod/
prefork.html
• How we've made Raptor up to 4x faster - http://www.rubyraptor.org/how-
we-made-raptor-up-to-4x-faster-than-unicorn-and-up-to-2x-faster-than-
puma-torquebox
Globalcode – Open4education
Mais referências
• Ruby App Server Arena - https://blog.engineyard.com/2014/ruby-app-
server-arena-pt1
• Passenger Design and Architecture - https://
www.phusionpassenger.com/documentation/Design%20and
%20Architecture.html
• Rails Server Showdown - https://www.engineyard.com/articles/rails-
server
• Slowloris - https://en.wikipedia.org/wiki/Slowloris_(software)
• RubyRaptor Optimizations - http://www.rubyraptor.org/pointer-tagging-
linked-string-hash-tables-turbocaching-and-other-raptor-optimizations/

Mais conteúdo relacionado

Mais procurados

Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Marcelo Dieder
 
Chef, Nginx e Capistrano: Como usar!
Chef, Nginx e Capistrano: Como usar!Chef, Nginx e Capistrano: Como usar!
Chef, Nginx e Capistrano: Como usar!Felipe Navas
 
NodeJS - Tutorial de forma simples e pratica.
NodeJS - Tutorial de forma simples e pratica.NodeJS - Tutorial de forma simples e pratica.
NodeJS - Tutorial de forma simples e pratica.Filipe Morelli
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4David Ruiz
 
Docker - Tutorial for beginners
Docker - Tutorial for beginnersDocker - Tutorial for beginners
Docker - Tutorial for beginnersRafael Chiavegatto
 
Uma visão rápida sobre Nodejs
Uma visão rápida sobre NodejsUma visão rápida sobre Nodejs
Uma visão rápida sobre NodejsRafael Soares
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com DockerWellington Silva
 
Poco Bibliotecas C++
Poco Bibliotecas C++Poco Bibliotecas C++
Poco Bibliotecas C++Uilian Ries
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 
Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]
Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]
Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]Tiago Hillebrandt
 
gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?Yago Tomé
 
Kubecon EU 2019 Remarks
Kubecon EU 2019 RemarksKubecon EU 2019 Remarks
Kubecon EU 2019 RemarksRicardo Katz
 
Dicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOpsDicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOpsGDGFoz
 
Node.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoNode.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoEduardo Bohrer
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMRodrigo Zaccara
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Felipe Klerk Signorini
 

Mais procurados (20)

Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?Como criar infraestrutura de sites para receber milhões de usuários?
Como criar infraestrutura de sites para receber milhões de usuários?
 
Foreman como provisionador
Foreman como provisionadorForeman como provisionador
Foreman como provisionador
 
Chef, Nginx e Capistrano: Como usar!
Chef, Nginx e Capistrano: Como usar!Chef, Nginx e Capistrano: Como usar!
Chef, Nginx e Capistrano: Como usar!
 
NodeJS - Tutorial de forma simples e pratica.
NodeJS - Tutorial de forma simples e pratica.NodeJS - Tutorial de forma simples e pratica.
NodeJS - Tutorial de forma simples e pratica.
 
Containers com docker #CPRecife4
Containers com docker #CPRecife4Containers com docker #CPRecife4
Containers com docker #CPRecife4
 
Docker - Tutorial for beginners
Docker - Tutorial for beginnersDocker - Tutorial for beginners
Docker - Tutorial for beginners
 
Uma visão rápida sobre Nodejs
Uma visão rápida sobre NodejsUma visão rápida sobre Nodejs
Uma visão rápida sobre Nodejs
 
12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com Docker
 
Poco Bibliotecas C++
Poco Bibliotecas C++Poco Bibliotecas C++
Poco Bibliotecas C++
 
Escalando Sites com Nginx
Escalando Sites com NginxEscalando Sites com Nginx
Escalando Sites com Nginx
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]
Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]
Melhorando o desempenho do seu WordPress [WordCamp Porto Alegre 2015]
 
gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?gRPC: Por que você ainda usa REST?
gRPC: Por que você ainda usa REST?
 
Torquebox
TorqueboxTorquebox
Torquebox
 
Kubecon EU 2019 Remarks
Kubecon EU 2019 RemarksKubecon EU 2019 Remarks
Kubecon EU 2019 Remarks
 
Node js - Javascript Server Side
Node js - Javascript Server SideNode js - Javascript Server Side
Node js - Javascript Server Side
 
Dicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOpsDicas de como entrar no mundo do DevSecOps
Dicas de como entrar no mundo do DevSecOps
 
Node.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoNode.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançado
 
Entregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVMEntregando conteúdo em ambientes extremos na JVM
Entregando conteúdo em ambientes extremos na JVM
 
Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016Deploy automático em projeto PHP - PHPSPIMA 2016
Deploy automático em projeto PHP - PHPSPIMA 2016
 

Semelhante a Ruby app servers: Unicorn, Puma, Passenger

O bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsO bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsNuno Paz
 
TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?tdc-globalcode
 
Node.js, Uma breve introdução
Node.js, Uma breve introduçãoNode.js, Uma breve introdução
Node.js, Uma breve introduçãoPablo Feijó
 
Tdc 2013 eric lemes - integracoes entre sistemas-2
Tdc 2013   eric lemes - integracoes entre sistemas-2Tdc 2013   eric lemes - integracoes entre sistemas-2
Tdc 2013 eric lemes - integracoes entre sistemas-2Eric Lemes
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Emerson Macedo
 
Arquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App EngineArquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App EngineEder Magalhães
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScriptCarlos Santos
 
Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Adler Medrado
 
Gdg quality fest 2018 - Metralhando o próprio produto com tudo!
Gdg quality fest 2018 - Metralhando o próprio produto com tudo!Gdg quality fest 2018 - Metralhando o próprio produto com tudo!
Gdg quality fest 2018 - Metralhando o próprio produto com tudo!Flávio Pimenta
 
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...tdc-globalcode
 
Descobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performanceDescobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performanceGustavo Ciello
 
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...tdc-globalcode
 
Linux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCLinux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCEmbarcados
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJSGiovanni Bassi
 
Web Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+ApacheWeb Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+ApacheDell Technologies
 
Java Virtual Threads.pptx
Java Virtual Threads.pptxJava Virtual Threads.pptx
Java Virtual Threads.pptxssuser980608
 
Alta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - NginxAlta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - NginxThiago Paes
 
Oficina de PHP - Software Freedom Day Luziânia 2013
Oficina de PHP - Software Freedom Day Luziânia 2013Oficina de PHP - Software Freedom Day Luziânia 2013
Oficina de PHP - Software Freedom Day Luziânia 2013George Mendonça
 

Semelhante a Ruby app servers: Unicorn, Puma, Passenger (20)

O bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsO bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.js
 
TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?TDC2018SP | Trilha Serveless - Pra que SERVErless?
TDC2018SP | Trilha Serveless - Pra que SERVErless?
 
Web tools pt-br
Web tools pt-brWeb tools pt-br
Web tools pt-br
 
Node.js, Uma breve introdução
Node.js, Uma breve introduçãoNode.js, Uma breve introdução
Node.js, Uma breve introdução
 
Tdc 2013 eric lemes - integracoes entre sistemas-2
Tdc 2013   eric lemes - integracoes entre sistemas-2Tdc 2013   eric lemes - integracoes entre sistemas-2
Tdc 2013 eric lemes - integracoes entre sistemas-2
 
Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011Node.JS - Campus Party Brasil 2011
Node.JS - Campus Party Brasil 2011
 
Arquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App EngineArquiteturas Java EE no Google App Engine
Arquiteturas Java EE no Google App Engine
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
 
Phpreact flisol-fb-2014
Phpreact flisol-fb-2014Phpreact flisol-fb-2014
Phpreact flisol-fb-2014
 
Gdg quality fest 2018 - Metralhando o próprio produto com tudo!
Gdg quality fest 2018 - Metralhando o próprio produto com tudo!Gdg quality fest 2018 - Metralhando o próprio produto com tudo!
Gdg quality fest 2018 - Metralhando o próprio produto com tudo!
 
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
TDC2016SP - O bê-a-bá da fila de processamento para você deixar o ThreadPool ...
 
Descobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performanceDescobrindo o Nginx - Um servidor web de alta performance
Descobrindo o Nginx - Um servidor web de alta performance
 
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
TDC2018SP | Trilha Modern Web - Blazor - C# rodando no navegador padrao, sem ...
 
Linux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoCLinux e zephyr conversando no mesmo SoC
Linux e zephyr conversando no mesmo SoC
 
Introdução ao NodeJS
Introdução ao NodeJSIntrodução ao NodeJS
Introdução ao NodeJS
 
Web Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+ApacheWeb Seminário sobre Varnish+Nginx+Apache
Web Seminário sobre Varnish+Nginx+Apache
 
Java Virtual Threads.pptx
Java Virtual Threads.pptxJava Virtual Threads.pptx
Java Virtual Threads.pptx
 
Alta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - NginxAlta Performance de Aplicações Web em PHP - Nginx
Alta Performance de Aplicações Web em PHP - Nginx
 
Oficina de PHP - Software Freedom Day Luziânia 2013
Oficina de PHP - Software Freedom Day Luziânia 2013Oficina de PHP - Software Freedom Day Luziânia 2013
Oficina de PHP - Software Freedom Day Luziânia 2013
 
HTTP 2
HTTP 2HTTP 2
HTTP 2
 

Mais de Weverton Timoteo

[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...Weverton Timoteo
 
[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?
[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?
[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?Weverton Timoteo
 
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com ElixirWeverton Timoteo
 
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso códigoRuby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso códigoWeverton Timoteo
 
[Gophercon 2019] Analysing code quality with linters and static analysis
[Gophercon 2019] Analysing code quality with linters and static analysis[Gophercon 2019] Analysing code quality with linters and static analysis
[Gophercon 2019] Analysing code quality with linters and static analysisWeverton Timoteo
 
Elixir Brasil 2019 - Quality: A Panacéia para seu código Elixir
Elixir Brasil 2019 - Quality:  A Panacéia para seu código ElixirElixir Brasil 2019 - Quality:  A Panacéia para seu código Elixir
Elixir Brasil 2019 - Quality: A Panacéia para seu código ElixirWeverton Timoteo
 
Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)
Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)
Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)Weverton Timoteo
 
21o. RubyFloripa - Maintaining legacy Rails app and introducing Elixir
21o. RubyFloripa - Maintaining legacy Rails app and introducing Elixir21o. RubyFloripa - Maintaining legacy Rails app and introducing Elixir
21o. RubyFloripa - Maintaining legacy Rails app and introducing ElixirWeverton Timoteo
 
How to use Ruby code inside Elixir
How to use Ruby code inside ElixirHow to use Ruby code inside Elixir
How to use Ruby code inside ElixirWeverton Timoteo
 
17º RubyFloripa - Coding Dojo
17º RubyFloripa - Coding Dojo17º RubyFloripa - Coding Dojo
17º RubyFloripa - Coding DojoWeverton Timoteo
 
How to draw a map - What is projections?
How to draw a map - What is projections?How to draw a map - What is projections?
How to draw a map - What is projections?Weverton Timoteo
 
Gerenciando dependências front-end no Rails
Gerenciando dependências front-end no RailsGerenciando dependências front-end no Rails
Gerenciando dependências front-end no RailsWeverton Timoteo
 
Swift language - A fast overview of some features
Swift language - A fast overview of some featuresSwift language - A fast overview of some features
Swift language - A fast overview of some featuresWeverton Timoteo
 
Developing an Universal iOS app
Developing an Universal iOS appDeveloping an Universal iOS app
Developing an Universal iOS appWeverton Timoteo
 

Mais de Weverton Timoteo (17)

[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
[Ruby Summit Brasil 2020] Ruby 3 e Análise estática - O que esperar e o que s...
 
[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?
[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?
[Devs Cansados Evento 2020] Queria saber a qualidade do meu código: o que olho?
 
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
 
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso códigoRuby 3 e Análise estática - O que esperar e o que significa para o nosso código
Ruby 3 e Análise estática - O que esperar e o que significa para o nosso código
 
[Gophercon 2019] Analysing code quality with linters and static analysis
[Gophercon 2019] Analysing code quality with linters and static analysis[Gophercon 2019] Analysing code quality with linters and static analysis
[Gophercon 2019] Analysing code quality with linters and static analysis
 
Elixir Brasil 2019 - Quality: A Panacéia para seu código Elixir
Elixir Brasil 2019 - Quality:  A Panacéia para seu código ElixirElixir Brasil 2019 - Quality:  A Panacéia para seu código Elixir
Elixir Brasil 2019 - Quality: A Panacéia para seu código Elixir
 
Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)
Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)
Floripa Gophers - Analysing Code Quality (Linters and Static Analysis)
 
21o. RubyFloripa - Maintaining legacy Rails app and introducing Elixir
21o. RubyFloripa - Maintaining legacy Rails app and introducing Elixir21o. RubyFloripa - Maintaining legacy Rails app and introducing Elixir
21o. RubyFloripa - Maintaining legacy Rails app and introducing Elixir
 
How to use Ruby code inside Elixir
How to use Ruby code inside ElixirHow to use Ruby code inside Elixir
How to use Ruby code inside Elixir
 
17º RubyFloripa - Coding Dojo
17º RubyFloripa - Coding Dojo17º RubyFloripa - Coding Dojo
17º RubyFloripa - Coding Dojo
 
How to draw a map - What is projections?
How to draw a map - What is projections?How to draw a map - What is projections?
How to draw a map - What is projections?
 
Gerenciando dependências front-end no Rails
Gerenciando dependências front-end no RailsGerenciando dependências front-end no Rails
Gerenciando dependências front-end no Rails
 
Introdução ao Chef Ops
Introdução ao Chef OpsIntrodução ao Chef Ops
Introdução ao Chef Ops
 
Brincando com FFI no Ruby
Brincando com FFI no RubyBrincando com FFI no Ruby
Brincando com FFI no Ruby
 
Swift language - A fast overview of some features
Swift language - A fast overview of some featuresSwift language - A fast overview of some features
Swift language - A fast overview of some features
 
Vim Registers
Vim RegistersVim Registers
Vim Registers
 
Developing an Universal iOS app
Developing an Universal iOS appDeveloping an Universal iOS app
Developing an Universal iOS app
 

Ruby app servers: Unicorn, Puma, Passenger

  • 1. Globalcode – Open4education Ruby - Definindo a quantidade de workers para sua app Weverton do Couto Timoteo Software Developer
  • 2. Globalcode – Open4education Qual app server vocês utilizam? Puma Passenger Unicorn
  • 3. Globalcode – Open4education Como funciona um web server? Web Server Usuário HTTP RequestHTTP Response GET HTTP/1.1 Accept: text/html Accept-Encoding: gzip Accept-Language: en-US Connection: keep-alive Host: www2.autocargo.com.br User-Agent: Chrome/42.0.231 HTTP/1.x 200 OK Date: Sun, 10 May 2015 GMT Server: nginx/1.4.6 (Ubuntu) Cache-Control: max-age=0 Content-Type: text/html; charset=utf-8 X-Powered-By: Phusion Passenger 4.0.58
  • 4. Globalcode – Open4education Qual web server mais utilizado? Fonte: rails-hosting.com - 2014
  • 5. Globalcode – Open4education Qual app server mais utilizado? Fonte: rails-hosting.com - 2014
  • 6. Globalcode – Open4education Rack Premissa: Todos app servers implementam uma interface Rack. Sendo assim todos frameworks web funcionam com todos app servers.
  • 7. Globalcode – Open4education Qual o papel dos app servers? • Accept/parse de requisições • Comunicar a web app através da abstração Rack • Converter a resposta da interface Rack (que a web app retorna)
  • 8. Globalcode – Open4education Rack Handlers • Ebb • Fuzed • Glassfish v3 • Phusion Passenger • Puma • Reel • Unicorn • unixrack • uWSGI • yahns
  • 9. Globalcode – Open4education Web frameworks suportados • Camping • Coset • Espresso • Halcyon • Mack • Maveric • Merb • etc • Racktools::SimpleApplication • Ramaze • Ruby on Rails • Rum • Sinatra • Sin • Vintage • Wee
  • 10. Globalcode – Open4education Qual app server escolher?
  • 11. Globalcode – Open4education Modelos de I/O • MultiProcess Blocking • MultiThreading Blocking • Evented
  • 12. Globalcode – Open4education MultiProcess Blocking • Fácil de trabalhar • Sem complexidade de multithreading • Maior consumo de mem. RAM para concorrência • Slow Clients podem atrasar seu funcionamento Processo 1 Processo 2 Processo 3 Request Request Request
  • 13. Globalcode – Open4education MultiThreading Blocking • Menos suscetível ao problema causado por Slow Clients • Código precisa ser thread safe • Rails se declarou thread safe em 2008 na versão 2.2 Processo 1 Request Processo 2 Processo 3
  • 14. Globalcode – Open4education Evented • Concorrência ilimitada • Não consome tanta mem. RAM • Imune à Slow Clients • Requer que app e libs tenham sido escritas tendo em mente o Evented I/O Copyright Benjamin Erb
  • 15. Globalcode – Open4education Unicorn • Pre-forking worker model com I/O bloqueante • Copy-on-Write • Evita concorrência (mas a app pode utilizar threads internamente) • Filosofia "Pior é melhor” • Respeita sinais unix muito bem • Não lida bem com ‘slow clients'
  • 16. Globalcode – Open4education Pre-Forking e Copy-on-Write Master200 MB Master Child 2 Write Pre-forking Request Ruby 2.0+ Essa feature só foi implementada no Garbage Collector do Ruby 2.0+
  • 17. Globalcode – Open4education Client Slow Clients? Processo 1 Processo 2 Processo 3 Processo N Slow Client Client Slow Client Slow Client Slow Client Client Fila de requisições …
  • 20. Globalcode – Open4education Reverse Proxying • Buffer de requisições HTTP (e grande responses) • Gasta o menor tempo possível do userspace • Serializa I/O de rede um processo do userspace • Gerencia bem conexões persistentes (HTTP 1.1) • Deve servir arquivos estáticos userspace: Todo código que roda fora da área de memória virtual das tarefas do Kernel
  • 21. Globalcode – Open4education Rainbows http://rainbows.bogomips.org/ • Baseado no Unicorn • Desenvolvido para atender apps que esperam longo tempo de requisição/resposta Modelos de Concorrência de Rede • Coolio • CoolioFiberSpawn • CoolioThreadPool • CoolioThreadSpawn • Epoll • EventMachine • FiberPool • FiberSpawn • (etc)
  • 22. Globalcode – Open4education Threads e Eventos são difíceis • Unicorn evita concorrência em cada worker • Para atender mais requisições, aumentamos o número de workers worker_processes É muito importante saber quanto memória RAM sua app precisa para definir este número
  • 23. Globalcode – Open4education Consumo de Recursos • Ruby 2.1 • Rails 3.2 • curl derailed_benchmarks https://github.com/schneems/derailed_benchmarks
  • 24. Globalcode – Open4education derailed_benchmarks gem 'derailed_benchmarks', group: :development $ cat << EOF > perf.rake require 'bundler' Bundler.setup require 'derailed_benchmarks' require 'derailed_benchmarks/tasks' EOF
  • 25. Globalcode – Open4education Medindo uso de memória em uma app Rails
  • 26. Globalcode – Open4education Quantos workers devo utilizar no Unicorn? • Quanto mais requests, mais worker_processes • Quanto mais worker_processes, mais mem RAM Copyright DigitalOcean Memory leak?
  • 27. Globalcode – Open4education Unicorn Killer group :production do gem 'unicorn' gem 'unicorn-worker-killer' end if ENV['RAILS_ENV'] == 'production' require 'unicorn/worker_killer' max_request_min = 500 max_request_max = 600 # Max requests per worker use Unicorn::WorkerKiller::MaxRequests, max_request_min, max_request_max end
  • 28. Globalcode – Open4education Puma • Inspirado no Mongrel • Suporta “verdadeiro paralelismo” • Funciona muito bem com Rubinius e JRuby • Evented I/O • Thread Pool • Clustered Mode
  • 29. Globalcode – Open4education É rápido? PUMA - 78 Mb RAINBOWS! (1X16) - 120 Mb UNICORN - 1076 Mb RAINBOWS! (16X32) - 1138 Mb Requests/sec x Number of concurrent requests
  • 30. Globalcode – Open4education Heroku recomenda https://devcenter.heroku.com/articles/rails-unicorn https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server
  • 31. Globalcode – Open4education Por que o Gitlab voltou a utilizar Unicorn? http://stackoverflow.com/a/18398991
  • 32. Globalcode – Open4education Ruby Raptor aka Passenger 5 • Utiliza todos os cores da CPU disponíveis • Built-in buffering reverse proxy (Evented I/O) • Inicia e elimina processos da aplicação de acordo com o tráfego • Utiliza preloading e copy-on-write • HTTP cache integrado • Garbage collection entre requests
  • 34. Globalcode – Open4education E o número de workers do Passenger? • passenger_max_pool_size (compartilhado entre apps) • passenger_min_instances (mínimo por app) • passenger_pool_idle_time (quanto tempo manter worker vivo) max_app_processes = (TOTAL_RAM * 0.75) / RAM_PER_PROCESS max_app_threads_per_process = ((TOTAL_RAM * 0.75) - (NUMBER_OF_CPUS * RAM_PER_PROCESS * 0.9)) / (RAM_PER_PROCESS / 10) 25% livre para o SO
  • 35. Globalcode – Open4education Para qualquer app? Não! • Blocking I/O: Aumente o número de processos/threads • CPU-bound: configure conforme o número de CPUs e evite swap • Dê preferência ao Nginx, não se preocupe em configurar https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html
  • 36. Globalcode – Open4education E qual o melhor app server? Puma Passenger Unicorn
  • 37. Globalcode – Open4education Obrigado! @wevtimoteo @wevtimoteo weverton.ct@gmail.com • http://www.slideshare.net/wolcanus/como-definir-a-quantidade-de- workers-para-sua-aplicacao • http://goo.gl/GTEGsg
  • 38. Globalcode – Open4education Referências • Rack Documentation - http://rack.github.io/ • Server Architectures for Scalable Web - http://berb.github.io/diploma- thesis/original/042_serverarch.html • The Philosophy Behind Unicorn - http://unicorn.bogomips.org/ PHILOSOPHY.html • Apache MPM prefork - http://httpd.apache.org/docs/current/mod/ prefork.html • How we've made Raptor up to 4x faster - http://www.rubyraptor.org/how- we-made-raptor-up-to-4x-faster-than-unicorn-and-up-to-2x-faster-than- puma-torquebox
  • 39. Globalcode – Open4education Mais referências • Ruby App Server Arena - https://blog.engineyard.com/2014/ruby-app- server-arena-pt1 • Passenger Design and Architecture - https:// www.phusionpassenger.com/documentation/Design%20and %20Architecture.html • Rails Server Showdown - https://www.engineyard.com/articles/rails- server • Slowloris - https://en.wikipedia.org/wiki/Slowloris_(software) • RubyRaptor Optimizations - http://www.rubyraptor.org/pointer-tagging- linked-string-hash-tables-turbocaching-and-other-raptor-optimizations/