SlideShare uma empresa Scribd logo
1 de 29
Baixar para ler offline
Definindo a quantidade de
workers para sua app!
Weverton Timoteo
hosted by supported by
Qual app server vocês utilizam?
Phusion PassengerUnicorn
Como funciona um webserver?
Web Server
Usuário
HTTP Request
HTTP 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
Fonte: rails-hosting.com - 2014
Qual web server mais utilizado?
• Apache 22.49%	
• Nginx 71.97%	
• Lighttpd 0.55%	
• IIS 0.08%	
• Puma 4.91%
Qual app server mais utilizado?
Fonte: rails-hosting.com - 2014
• Mongrel 3.94%	
• FastCGI 1.29%	
• Passenger 52.33%	
• Unicorn 59.57%	
• Rainbows! 0.72%	
• Puma 24.44%
Premissa:!
Todos app servers implementam a
interface Rack. Todas apps web
respondem no formato do Rack.
Rack
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)
Rack Handlers
• Ebb
• Fuzed
• Glassfish v3
• Phusion Passenger
• Puma
• Reel
• Unicorn
• unixrack
• uWSGI
• yahns
Web frameworks suportados
• Camping!
• Coset!
• Espresso!
• Halcyon!
• Mack!
• Maveric!
• Merb!
• etc
• Racktools::SimpleApplication!
• Ramaze!
• Ruby on Rails!
• Rum!
• Sinatra!
• Sin!
• Vintage!
• Wee
Qual app server escolher?
Phusion PassengerUnicorn
• MultiProcess Blocking
• MultiThreading Blocking
• Evented
Modelos de I/O
• 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
MultiProcess 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
MultiThreading Blocking
• 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
Evented
• Pre-forking worker model com I/O
bloqueante!
• Copy-on-Write (Ruby 2.0+)!
• 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'
Unicorn
Processo 1 Processo 2 Processo 3 Processo N
Slow
Client
Client
Slow
Client
Slow
Client
Slow
Client
Client
Fila de requisições!
…
Slow clients?
• 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
Reverse Proxying
• 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)
Rainbows!
!
gem 'derailed', group: :development	
$ cat << EOF > perf.rake	
require 'bundler'	
Bundler.setup	
!
require 'derailed_benchmarks'	
require 'derailed_benchmarks/tasks'	
EOF
Medindo consumo de recursos
Ruby 2.0+ e Rails 3.2+
Medindo consumo de recursos
Quantos workers devo utilizar no Unicorn?
Quanto mais requests, mais
worker_processes
Quanto mais worker_processes,
mais mem. RAM
Copyright DigitalOcean
Memory leak?
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	
Unicorn Killer
• Inspirado no Mongrel
• Suporta “verdadeiro paralelismo”
• Funciona muito bem com Rubinius e JRuby
• Evented I/O
• Thread Pool
• Clustered Mode
Puma
• 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
Passenger (a.k.a Raptor)
• 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
E o número de workers?
Posso usar qualquer app server?
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 a usar Nginx como web server
Obrigado!
@wevtimoteo
weverton.ct@gmail.com
http://www.slideshare.net/wevtimoteo/definindo-a-
quantidade-de-workers-para-sua-app
http://goo.gl/uCl1L4
• 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
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/
Referências

Mais conteúdo relacionado

Semelhante a Definindo quantidade workers app

Como definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicaçãoComo definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicaçãoWeverton Timoteo
 
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
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHPFelipe Ribeiro
 
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
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaHenrique Lima
 
HTTP, Requisição e Resposta
HTTP, Requisição e RespostaHTTP, Requisição e Resposta
HTTP, Requisição e RespostaThiago Rondon
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScriptCarlos Santos
 
TDCPOA2018 - Trilha Python - Testes de Performance com Locust
TDCPOA2018 - Trilha Python - Testes de Performance com LocustTDCPOA2018 - Trilha Python - Testes de Performance com Locust
TDCPOA2018 - Trilha Python - Testes de Performance com LocustMayara Fernandes
 
Um milhao tdc2014sp Apresentação por Fernando Ike
Um milhao tdc2014sp Apresentação por Fernando IkeUm milhao tdc2014sp Apresentação por Fernando Ike
Um milhao tdc2014sp Apresentação por Fernando IkePaulo Fernandes
 
Sapo Sessions - Web Mobile
Sapo Sessions - Web MobileSapo Sessions - Web Mobile
Sapo Sessions - Web MobileBruno Carreira
 
5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introdução
5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introdução5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introdução
5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introduçãoAgrupamento de Escolas da Batalha
 
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPLabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPCarlos Santos
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04Carlos Santos
 
4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdf4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdfRubenManhia
 

Semelhante a Definindo quantidade workers app (20)

Como definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicaçãoComo definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicação
 
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?
 
Otimizacao de websites em PHP
Otimizacao de websites em PHPOtimizacao de websites em PHP
Otimizacao de websites em PHP
 
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
 
Aumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinadaAumente a performance de seu site de maneira disciplinada
Aumente a performance de seu site de maneira disciplinada
 
Web tools pt-br
Web tools pt-brWeb tools pt-br
Web tools pt-br
 
HTTP, Requisição e Resposta
HTTP, Requisição e RespostaHTTP, Requisição e Resposta
HTTP, Requisição e Resposta
 
(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript(A04 e A05) LabMM3 - JavaScript
(A04 e A05) LabMM3 - JavaScript
 
TDCPOA2018 - Trilha Python - Testes de Performance com Locust
TDCPOA2018 - Trilha Python - Testes de Performance com LocustTDCPOA2018 - Trilha Python - Testes de Performance com Locust
TDCPOA2018 - Trilha Python - Testes de Performance com Locust
 
Um milhao tdc2014sp Apresentação por Fernando Ike
Um milhao tdc2014sp Apresentação por Fernando IkeUm milhao tdc2014sp Apresentação por Fernando Ike
Um milhao tdc2014sp Apresentação por Fernando Ike
 
Aula 1
Aula 1Aula 1
Aula 1
 
Processos e threads cap 02 (i unidade)
Processos e threads   cap 02 (i unidade)Processos e threads   cap 02 (i unidade)
Processos e threads cap 02 (i unidade)
 
Sapo Sessions - Web Mobile
Sapo Sessions - Web MobileSapo Sessions - Web Mobile
Sapo Sessions - Web Mobile
 
HTTP Monkey
HTTP MonkeyHTTP Monkey
HTTP Monkey
 
5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introdução
5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introdução5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introdução
5 – Desenvolvimento de Páginas Web Dinâmicas PHP: introdução
 
Automatizando Nmap com NSE
Automatizando Nmap com NSEAutomatizando Nmap com NSE
Automatizando Nmap com NSE
 
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHPLabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
LabMM4 (T10 - 12/13) - Tecnologias server-side - PHP
 
dnad12
dnad12dnad12
dnad12
 
LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04LabMM3 - Aula teórica 04
LabMM3 - Aula teórica 04
 
4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdf4. Introdução ao PHP.pdf
4. Introdução ao PHP.pdf
 

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
 

Definindo quantidade workers app

  • 1. Definindo a quantidade de workers para sua app! Weverton Timoteo hosted by supported by
  • 2. Qual app server vocês utilizam? Phusion PassengerUnicorn
  • 3. Como funciona um webserver? Web Server Usuário HTTP Request HTTP 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. Fonte: rails-hosting.com - 2014 Qual web server mais utilizado? • Apache 22.49% • Nginx 71.97% • Lighttpd 0.55% • IIS 0.08% • Puma 4.91%
  • 5. Qual app server mais utilizado? Fonte: rails-hosting.com - 2014 • Mongrel 3.94% • FastCGI 1.29% • Passenger 52.33% • Unicorn 59.57% • Rainbows! 0.72% • Puma 24.44%
  • 6. Premissa:! Todos app servers implementam a interface Rack. Todas apps web respondem no formato do Rack. Rack
  • 7. 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. Rack Handlers • Ebb • Fuzed • Glassfish v3 • Phusion Passenger • Puma • Reel • Unicorn • unixrack • uWSGI • yahns
  • 9. Web frameworks suportados • Camping! • Coset! • Espresso! • Halcyon! • Mack! • Maveric! • Merb! • etc • Racktools::SimpleApplication! • Ramaze! • Ruby on Rails! • Rum! • Sinatra! • Sin! • Vintage! • Wee
  • 10. Qual app server escolher? Phusion PassengerUnicorn
  • 11. • MultiProcess Blocking • MultiThreading Blocking • Evented Modelos de I/O
  • 12. • 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 MultiProcess Blocking
  • 13. • 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 MultiThreading Blocking
  • 14. • 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 Evented
  • 15. • Pre-forking worker model com I/O bloqueante! • Copy-on-Write (Ruby 2.0+)! • 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' Unicorn
  • 16. Processo 1 Processo 2 Processo 3 Processo N Slow Client Client Slow Client Slow Client Slow Client Client Fila de requisições! … Slow clients?
  • 17. • 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 Reverse Proxying
  • 18. • 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) Rainbows!
  • 19. ! gem 'derailed', group: :development $ cat << EOF > perf.rake require 'bundler' Bundler.setup ! require 'derailed_benchmarks' require 'derailed_benchmarks/tasks' EOF Medindo consumo de recursos Ruby 2.0+ e Rails 3.2+
  • 20. Medindo consumo de recursos
  • 21. Quantos workers devo utilizar no Unicorn? Quanto mais requests, mais worker_processes Quanto mais worker_processes, mais mem. RAM Copyright DigitalOcean Memory leak?
  • 22. 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 Unicorn Killer
  • 23. • Inspirado no Mongrel • Suporta “verdadeiro paralelismo” • Funciona muito bem com Rubinius e JRuby • Evented I/O • Thread Pool • Clustered Mode Puma
  • 24. • 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 Passenger (a.k.a Raptor)
  • 25. • 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 E o número de workers?
  • 26. Posso usar qualquer app server? 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 a usar Nginx como web server
  • 28. • 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 Referências
  • 29. • 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/ Referências