Представление классической синатры и модульной синатры?я делаю не так? - PullRequest
2 голосов
/ 03 июня 2019

ОБНОВЛЕНО: ОК, проблема решена.

Другой способ запуска сервера дает другой результат.

# 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

Итак, способы начала синатры:

  1. неправильно: $ ruby ​​main.rb (в зависимости от стойки?)
  2. неверно: $ rackup config.ru (на основе стойки)
  3. неверно: $ rackup config.ru -s thin (событие на основе стойки)
  4. правильно: $ thin start -R config.ru -e производство

------------------- Оригинальный вопрос --------------------

Сегодня я пишу код Sinatra для приложения API и обнаружил, что:

  1. Классический код синатры может обрабатывать:

    1.1 1800 запросов / с, с тонким сервером.

    1.2 2000 запросов / с, с пумой в качестве сервера.

  2. Модульный код синатры может обрабатывать только:

    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, как написать код для больших приложений?

спасибо большое!

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Ваш эталонный тест неверен.

Согласно опубликованным вами фрагментам, в первом случае вы используете Thin в качестве сервера, а во втором - Puma.

Эти серверы реализуют абсолютно разные модели параллелизма: насколько я помню, это однопоточный цикл событий для первого и несколько потоков для второго. В результате Thin лучше справляется с легкими неблокирующими задачами, в то время как Puma побеждает его в сценариях с относительно тяжелыми или блокирующими вычислениями.

Ваш фиктивный пример просто лучше подходит для модели Thin, и это вызывает разницу ... Модульная Синатра должна быть абсолютно прекрасна, просто сравните яблоки с яблоками:)

1 голос
/ 20 июня 2019

Хорошо, я нашел основную причину, и с предложением Жестяного Человека я публикую свой ответ здесь.

Проблема в «веб-сервере», а не в «фреймворке»

Другой способ, которым я запустил сервер, дает другой результат.

# 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
so the ways of starting sinatra:
  • неправильно: $ ruby ​​main.rb (на основе стойки?)
  • неправильно: $ rackup config.ru (на основе стойки)
  • неправильно: $ rackup config.ru -s thin (событиев зависимости от стойки)
  • правильно: $ thin start -R config.ru -e производство
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...