2016-04-30 6 views
3

Ich habe Richard Schneeman Artikel gelesen, und eine Reihe von anderen. ;-) Ich kämpfe immer noch damit.Welche Konfiguration für Rails 3.2.22.2 + Puma + Heroku?

Hier einige Edelsteine ​​ich in meinem Gemfile zu Benchmark meine App hinzugefügt haben:

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

Nach vielen Benchmarks in der Entwicklung und env in Inszenierung, weiß ich, wo meine app nicht schnell genug ist, aber es gibt nicht Speicherleck (einige kleine Mem Blähungen manchmal vielleicht).

newapp-Staging App ist die neue Version (aka: neue Frontend, aktualisiert Edelsteine, optimierte Abfragen, ...) von oldapp Produktion App. Bitte werfen Sie einen Blick auf die Screenshots (oldapp Produktion Verwendung webrick, newapp-Staging Verwendung puma)

hier So kommt 2 einfache Fragen:

Frage # 1

newapp- Inszenierung App verwendet Ruby '2.2.0' & Rails '3.2.22.2' und ich kann nicht sicherstellen, dass es Threadsafe ist wegen meines Codes und der damit verbundenen Edelsteine, also ... Ich muss 1 Thread auf einmal verwenden. Ist Puma hier ein Vorteil? Metriken sagen mir nicht. ODER ... meine Konfiguration ist nicht gut. (Fehlende preload_app vielleicht, oder andere Dinge!?) Hier ist meine procfile:

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

Frage # 2

Einhorn als Ersatz verwendet werden könnte?

Vielen Dank für Ihre Zeit und Ihre Ratschläge.

Prost

OLD APP NEW APP

Antwort

1

Einhorn ist der beste hier bewegen. Hier ist meine Konfiguration, wenn das irgendjemandem helfen könnte.

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 

config/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 

Konfig.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 

Auf Heroku:

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

Heroku Config Vars:

SENSIBLE_DEFAULTS: enabled(für alle Fälle) & WEB_CONCURRENCY: 2

Prost