ОБНОВЛЕНО: ОК, проблема решена.
Другой способ запуска сервера дает другой результат.
# this gives 2800 req/s in a production server, server based on thin
$ bundle exec thin start -R config.ru -e production
# this gives 1600 req/s in the same server, server based on Rack( seems that)
$ bundle exec rackup config.ru -s thin
Итак, способы начала синатры:
- неправильно: $ ruby main.rb (в зависимости от стойки?)
- неверно: $ rackup config.ru (на основе стойки)
- неверно: $ rackup config.ru -s thin (событие на основе стойки)
- правильно: $ thin start -R config.ru -e производство
------------------- Оригинальный вопрос --------------------
Сегодня я пишу код Sinatra для приложения API и обнаружил, что:
Классический код синатры может обрабатывать:
1.1 1800 запросов / с, с тонким сервером.
1.2 2000 запросов / с, с пумой в качестве сервера.
Модульный код синатры может обрабатывать только:
2,1 1100 запросов / с, с тонким сервером
2,2 800 запросов / с, с пумой в качестве сервера.
Как воспроизвести это:
классическая синатра
# test_classic_sinatra.rb
require 'sinatra'
get '/' do
'hihihi'
end
пробег:
siwei $ ruby test.rb
== Sinatra (v2.0.5) has taken the stage on 4567 for development with backup from Thin
Thin web server (v1.7.2 codename Bachmanity)
Maximum connections set to 1024
Listening on localhost:4567, CTRL+C to stop
тест:
$ ab -n 1000 -c 100 http://localhost:4567/
и получил результат:
Concurrency Level: 100
Time taken for tests: 0.530 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 211000 bytes
HTML transferred: 6000 bytes
Requests per second: 1885.43 [#/sec] (mean)
Time per request: 53.038 [ms] (mean)
Time per request: 0.530 [ms] (mean, across all concurrent requests)
Transfer rate: 388.50 [Kbytes/sec] received
Модульная синатра:
# config.ru
require 'sinatra/base'
class App < Sinatra::Application
set :environment, :production
get '/' do
'hihihi'
end
end
run App
с тонким сервером
пробег:
$ rackup config.ru -s thin
Thin web server (v1.7.2 codename Bachmanity)
Maximum connections set to 1024
Listening on localhost:9292, CTRL+C to stop
тест:
Concurrency Level: 100
Time taken for tests: 0.931 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 211000 bytes
HTML transferred: 6000 bytes
Requests per second: 1073.58 [#/sec] (mean)
Time per request: 93.146 [ms] (mean)
Time per request: 0.931 [ms] (mean, across all concurrent requests)
Transfer rate: 221.22 [Kbytes/sec] received
с пумой в качестве сервера
пробег:
siwei$ rackup config.ru
Puma starting in single mode...
* Version 3.11.4 (ruby 2.3.8-p459), codename: Love Song
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:9292
Use Ctrl-C to stop
тест:
$ab -n 1000 -c 100 http://localhost:9292/
получил результат:
Concurrency Level: 100
Time taken for tests: 1.266 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 178000 bytes
HTML transferred: 6000 bytes
Requests per second: 789.62 [#/sec] (mean)
Time per request: 126.643 [ms] (mean)
Time per request: 1.266 [ms] (mean, across all concurrent requests)
Transfer rate: 137.26 [Kbytes/sec] received
Прежде чем принять решение использовать Sinatra, я прочитал много постов о "sinatra, grape и rails api", и я проверил agaist этих фреймворков и, наконец, решил использовать Sinatra.
Но теперь я обнаружил, что Modular Sinatra выглядит не так хорошо, как ожидалось. Может кто-нибудь дать мне подсказку о том, как использовать «Классическую Синатру» или «Модульную Синатру»?
Если я не использую Modular Sinatra, как написать код для больших приложений?
спасибо большое!