2016-04-30 2 views
3

Я читал статью Ричарда Шнеймана и кучу других. ;-) Я все еще борюсь с этим.Какая конфигурация для Rails 3.2.22.2 + Puma + Heroku?

Вот несколько драгоценных камней я добавил в моем Gemfile для сравнения мое приложение:

gem 'airbrake' 
gem 'newrelic_rpm' 
gem 'stackprof' 
gem 'derailed', group: :development 
gem 'rack-mini-profiler' 
gem 'flamegraph' 
gem 'memory_profiler' 
gem "skylight" 

После большого количества тестов в развитии и в постановке окр, я знаю, где мое приложение не достаточно быстро, но не утечка памяти (иногда иногда может возникнуть небольшая память).

newapp-устроив приложение является новой версией (ака: новый интерфейс, модернизированные драгоценные камни, оптимизированные запросы, ...) из oldapp производства приложений. Пожалуйста, посмотрите на скриншоты (oldapp-производство использование WEBrick, newapp-постановка использование пума)

Так вот идет 2 простых вопроса:

вопрос № 1

newapp- staging приложение использует ruby ​​'2.2.0' & rails '3.2.22.2', и я не могу гарантировать, что он является потокобезопасным из-за моего кода и связанных с ним камней, поэтому ... Я должен использовать только один поток за раз. Является ли puma преимуществом здесь? Метрики не говорят мне. ИЛИ ... моя конфигурация не очень хорошая. (Отсутствует preload_app может быть, или другие вещи!?) Вот мой PROCFILE:

web: bundle exec puma -t 1:1 -p ${PORT:-3000} -e ${RACK_ENV:-development} 
worker: bundle exec rake jobs:work 

вопрос № 2

Unicorn может быть использован в качестве замены?

Спасибо за ваше время и ваши советы.

Приветствия

OLD APP NEW APP

ответ

1

Использование единорога лучший ход здесь. Вот моя конфигурация, если это может помочь кому угодно.

Gemfile:

gem 'unicorn' 
gem 'unicorn-rails' 
group :production, :staging do 
    gem 'unicorn-worker-killer' 
end 

PROCFILE:

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb 
worker: bundle exec rake jobs:work 

конфигурации/unicorn.rb

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2) 
timeout 15 
preload_app true 
before_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
end 
after_fork do |server, worker| 
    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT' 
    end 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

конфигурации.RU

if ENV['RAILS_ENV'] == 'production' || ENV['RAILS_ENV'] == 'staging' 
    require 'unicorn/worker_killer' 
    use Unicorn::WorkerKiller::MaxRequests, 768, 1024, true 
    use Unicorn::WorkerKiller::Oom, (450*(1024**2)), (490*(1024**2)), 16, true 
end 
require ::File.expand_path('../config/environment', __FILE__) 
use Rack::Deflater 
run MyApp::Application 

На Heroku:

2 x `Standard 2X dynos` for web 
1 x `Standard 1X dyno` for worker 

Heroku конфигурации вары:

SENSIBLE_DEFAULTS: enabled(на всякий случай) & WEB_CONCURRENCY: 2

Приветствиях

Смежные вопросы