wrk在Rack vs Sinatra基准测试中显示奇怪的结果

时间:2015-07-30 01:48:52

标签: ruby sinatra benchmarking rack wrk

我是一个" hello world"相当于使用sinatra和rack。

有问题的命令wrk -t12 -c400 -d30s:12个线程,400个打开的HTTP连接,30秒。

架:

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

屈:

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

规格:

test machine specs

如果Rack和Sinatra都运行Thin,那么Sinatra如何管理3002.52~req / s,而纯Rack只管理551.05 req / s?我错过了什么?

1 个答案:

答案 0 :(得分:0)

我没有安装wrk,我没有心情安装,但我使用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

我的结果非常相似,所以也许它与wrk或您的系统有关。我正在运行OSX Mavericks,但我发现this answer表示要使用time进行基准测试,您应该使用chrt来避免与其他进程争用。我不确定OS {等同于chrt是什么。也许这就是你的系统上发生了什么,或者无论出于什么原因,端口都可能以不同的速度运行。

我还使用bundle install --binstubs --path vendor.noindex对我的宝石进行了沙盒化,也许这会对你的系统产生影响。

否则,我看不出有任何这种差异的原因。我对我得到的结果感到有些惊讶,因为我预计Sinatra会比Rack重一点,但是对于更复杂或更大的应用程序来说,似乎有些不同。或许不是,Sinatra是一个如此整洁的小图书馆。