优化Heroku,Rails和Unicorn:定义适当的配置选项,比如有多少个工作进程?

Cra*_*lot 4 ruby-on-rails heroku unicorn mongoid ruby-on-rails-3

我们为Unicorn提供了以下配置文件.我们在Rails 3.2.12和Mongoid 3.1.16上.我们应该如何确定要使用多少个工作进程?我们可以包括其他选项来提升绩效吗?

谢谢!

# config/unicorn.rb
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 25
preload_app true

before_fork do |server, worker|
  # TERM signals indicates the Heroku Dyno is shutting down
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end
end

after_fork do |server, worker|
  # TERM signals indicates the Heroku Dyno is shutting down
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end
end
Run Code Online (Sandbox Code Playgroud)

mar*_*ada 10

目前接受的答案中包含一些不正确的信息.

根据dyno大小heroku文档,2X dynos拥有2X cpu份额,而不仅仅是内存的两倍:

在此输入图像描述

无论如何,由于可以使用的独角兽工作者的数量必然会占用内存占用,因此您最有可能从2X dyno中获得更高的性能,您可以更好地使用可用内存.

例如,您可能能够运行一个2X dyno与7个独角兽工作者和两个1X dynos与3个独角兽工作者(总共6个).使用更多dynos时,也可能存在一些路由开销.

通过关于优化dyno用法heroku文档:

虽然高度依赖于app,但下表列出了每个dyno大小可以运行多少Unicorn worker的一些粗略的经验法则:

在此输入图像描述

考虑到这一点,要优化使用的最重要的事情是总内存占用量.您可以启用heroku的log-runtime-metrics,以将实际的内存和CPU使用信息打印到heroku日志中.它看起来像这样:

source=web.1 dyno=heroku.2808254.d97d0ea7-cf3d-411b-b453-d2943a50b456 sample#load_avg_1m=2.46 sample#load_avg_5m=1.06 sample#load_avg_15m=0.99
source=web.1 dyno=heroku.2808254.d97d0ea7-cf3d-411b-b453-d2943a50b456 sample#memory_total=21.00MB sample#memory_rss=21.22MB sample#memory_cache=0.00MB sample#memory_swap=0.00MB sample#memory_pgpgin=348836pages sample#memory_pgpgout=343403pages
Run Code Online (Sandbox Code Playgroud)

如上面链接的文章所述,您可以将其与librato附加组件一起使用,以便更好地了解应用程序的峰值使用要求:

在此输入图像描述

NewRelic的增加上可以用于类似的目的.

希望有所帮助.