3

コアと同じ数のワーカーがある場合、デフォルトで受信リクエストを同時に処理する必要があることを理解しています。リクエストが同期的にしか処理されないのはなぜですか?

これが私のunicorn.rbです:

worker_processes 10

APP_PATH = "/var/www/myapp/current" # available in 0.94.0+
APP_PATH_SHARED = "/var/www/myapp/shared"
working_directory APP_PATH
# listen on both a Unix domain socket and a TCP port,
# we use a shorter backlog for quicker failover when busy
listen "/tmp/.sock", :backlog => 64
listen 8080, :tcp_nopush => true

# nuke workers after 30 seconds instead of 60 seconds (the default)
timeout 60

# feel free to point this anywhere accessible on the filesystem
pid APP_PATH_SHARED + "/pids/unicorn.pid"

# By default, the Unicorn logger will write to stderr.
# Additionally, ome applications/frameworks log to stderr or stdout,
# so prevent them from going to /dev/null when daemonized here:
stderr_path APP_PATH_SHARED + "/log/unicorn.stderr.log"
stdout_path APP_PATH_SHARED + "/log/unicorn.stdout.log"



# combine Ruby 2.0.0dev or REE with "preload_app true" for memory savings
# http://rubyenterpriseedition.com/faq.html#adapt_apps_for_cow
preload_app true
GC.respond_to?(:copy_on_write_friendly=) and
  GC.copy_on_write_friendly = true

before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "/var/www/myapp/current/Gemfile"
end

before_fork do |server, worker|
  # the following is highly recomended for Rails + "preload_app true"
  # as there's no need for the master process to hold a connection
  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!


   # Before forking, kill the master process that belongs to the .oldbin PID.
  # This enables 0 downtime deploys.
  old_pid = APP_PATH_SHARED + "/pids/unicorn.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end

end

after_fork do |server, worker|

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection

end

これは何週間も私を悩ませてきました!ありがとうございました。

4

1 に答える 1

1

リクエストが同期的にしか処理されない理由は、スレッド ベースのサーバーがなく、おそらく Ruby バージョンも使用していないためです。

純粋な並行性が必要な場合は、Unicorn では取得できません。Unicorn は、スレッドではなくプロセス フォークで動作します。その種の並行性が必要な場合は、スレッドセーフなコードを用意し、PUMA で Jruby または rubinius を使用する必要があります。

Puma は実際にはスレッド ベースの同時実行を実装する Web サーバーですが、それを実現するには、スレッドの同時実行を実装する Ruby バージョンを使用する必要があります。そうでない場合は、プロセスを再びフォークすることになり、Unicorn の代わりに puma を使用しても何も得られないと思います。

これには、ルビーの同時実行性に関する素晴らしい説明があります: http://merbist.com/2011/02/22/concurrency-in-ruby-explained/

次に、puma サーバーを確認すると、私が説明しようとしていることを理解できます: http://puma.io/

于 2013-05-16T14:33:59.257 に答える