Estou usando o puma e o nxinx e, até onde posso dizer, ele só usa um único thread, mesmo quando eu inicio com o padrão de 16 threads ou mais. Eu configurei um novo aplicativo de trilhos, depois passei pela configuração descrita aqui:
O que dá este exemplo de configuração nginx:
upstream benchmarkapp.com {server unix:/tmp/benchmark_app.sock fail_timeout=0;}
server {
server_name benchmarkapp.com;
root /home/tristan/benchmark_app/public;
try_files $uri/index.html $uri @benchmarkapp.com;
location @benchmarkapp.com {
proxy_redirect off;
proxy_pass http://benchmarkapp.com;
}
}
Em seguida, criou uma simples ação do controlador que simplesmente dorme por 3 segundos e renderiza "hello":
class WelcomeController < ApplicationController
def index
sleep(2)
render :text => "hello"
end
end
Então comecei o puma com: puma -t 16 -b unix:///tmp/benchmark_app.sock -S /tmp/benchmark_app.state
uma vez correndo, eu bato com 10 usuários simultâneos usando cerco, e aqui está o resultado
% siege -c 10 -t 60s http://benchmarkapp.com
** SIEGE 2.70
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200 2.04 secs: 25 bytes ==> /
HTTP/1.1 200 4.05 secs: 25 bytes ==> /
HTTP/1.1 200 6.06 secs: 25 bytes ==> /
HTTP/1.1 200 8.08 secs: 25 bytes ==> /
HTTP/1.1 200 10.09 secs: 25 bytes ==> /
Qual é precisamente o que eu esperaria ver se o aplicativo estivesse sendo executado com thread único. Pegue as duas primeiras solicitações. Eles chegam mais ou menos na mesma hora. O primeiro leva dois segundos, até aí tudo bem. Mas o segundo, terceiro, ... até o dia 10, todos têm que esperar mais 2 segundos para cada pedido antes dele. De fato, se eu reiniciar o puma com apenas 1 thread, obtenho exatamente esse resultado.
O que estou fazendo de errado aqui? Como posso fazer com que o servidor realmente use todos os threads que o puma gera? Se tudo funcionar corretamente, espero ver:
% siege -c 10 -t 60s http://benchmarkapp.com
** SIEGE 2.70
** Preparing 10 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200 2.04 secs: 25 bytes ==> /
HTTP/1.1 200 2.05 secs: 25 bytes ==> /
HTTP/1.1 200 2.03 secs: 25 bytes ==> /
HTTP/1.1 200 2.01 secs: 25 bytes ==> /
HTTP/1.1 200 2.06 secs: 25 bytes ==> /
Como posso fazer isso acontecer?
Tags nginx ruby ruby-on-rails web-server