2015-07-30 6 views
2

Je compare un équivalent de "hello world" en utilisant sinatra et rack.wrk affiche des résultats impairs sur Rack vs Sinatra benchmark

Commande en question wrk -t12 -c400 -d30s: 12 threads, 400 connexions HTTP ouvertes, 30 secondes.

rack:

require 'rack' 

app = Proc.new do |env| 
    ['200', {'Content-Type' => 'text/html'}, ['A barebones rack app.']] 
end 

Rack::Handler::Thin.run app 

# wrk $ wrk -t12 -c400 -d30s http://localhost:8080 
# Running 30s test @ http://localhost:8080 
# 12 threads and 400 connections 
# Thread Stats Avg  Stdev  Max +/- Stdev 
#  Latency 11.82ms 38.97ms 488.51ms 99.32% 
#  Req/Sec 705.04 568.62  2.20k 61.82% 
# 16576 requests in 30.08s, 1.55MB read 
# Socket errors: connect 157, read 274, write 0, timeout 0 
# Requests/sec: 551.05 
# Transfer/sec:  52.74KB 

Sinatra:

require 'sinatra' 

get '/' do 
    status 200 
    headers \ 
    'Content-Type' => 'text/html' 
    'A barebones rack app.' 
end 

# wrk $ wrk -t12 -c400 -d30s http://localhost:4567 
# Running 30s test @ http://localhost:4567 
# 12 threads and 400 connections 
# Thread Stats Avg  Stdev  Max +/- Stdev 
#  Latency 40.12ms 90.46ms 1.39s 98.67% 
#  Req/Sec 265.47 147.50  1.17k 73.15% 
# 90322 requests in 30.08s, 18.78MB read 
# Socket errors: connect 157, read 333, write 0, timeout 0 
# Requests/sec: 3002.52 
# Transfer/sec: 639.21KB 

Spécifications:

test machine specs

Si les deux rack et Sinatra exécuter mince, comment se Sinatra gère 3002,52 ~ req/s alors que Rack pur gère seulement 551.05 req/s? Qu'est-ce que je rate?

+0

quoi de neuf? Je n'ai pas entendu parler de cette commande. – iain

+0

@iain https://github.com/wg/wrk –

Répondre

0

Je n'ai pas installé wrk, je n'étais pas dans l'ambiance pour une installation, mais j'ai couru vos deux exemples en utilisant time:

# run.sh 
for i in {1..1000} 
do 
    curl localhost:8080/ > /dev/null 2>&1 
done 

# sinatra, run via `bundle exec ruby sinatra.rb -p 8080` 
$ time sh run.sh    
sh run.sh 3.67s user 2.79s system 66% cpu 9.768 total 

# rack, run via `bin/rackup config.ru` 
$ time sh run.sh 
sh run.sh 3.65s user 2.87s system 74% cpu 8.799 total 

# sinatra with the puma server, by adding the line `set :server, "puma"` 
$ time sh run.sh  
sh run.sh 3.67s user 2.71s system 92% cpu 6.924 total 

J'ai obtenu des résultats très similaires, donc peut-être quelque chose à faire avec wrk ou votre système. Je cours OSX Mavericks, mais j'ai trouvé this answer qui dit de comparer avec time vous devriez vraiment utiliser chrt pour éviter les conflits avec d'autres processus. Je ne suis pas sûr de ce que l'équivalent OSX de chrt est cependant. Peut-être que c'est ce qui se passe sur votre système, ou peut-être que les ports fonctionnent à des vitesses différentes, pour une raison quelconque.

J'ai également mis en sandbox mes gemmes en utilisant bundle install --binstubs --path vendor.noindex, peut-être que cela aurait un effet sur votre système aussi.

Sinon, je ne vois pas de raison pour une telle disparité. Je suis un peu surpris par les résultats que j'ai obtenus car je m'attendais à ce que Sinatra soit un peu plus lourd que Rack, mais peut-être que les choses semblent différentes avec des applications plus complexes ou plus grandes. Ou peut-être pas, Sinatra est une telle petite bibliothèque soignée.