ruby-on-rails-3 - unicorn !和 PostgreSQL

标签 ruby-on-rails-3 postgresql unicorn

我正在将旧的 Rails 和 PostgreSQL 应用程序从 2.1 升级到 Rails 3(通过成功的中间 2.3.11 步骤)。

最后,当我让所有 Rspecs 顺利运行时,我安装了 Mongrel 1.2.0.pre2 并启动并运行 - 一切正常。即使是具有 100 个并发用户的 JMeter 测试用例也通过了 OK。

但是当我对 Unicorn 进行同样的尝试时!服务器,当我自己使用它时它工作正常,但是当我使用 JMeter 加载它时,它从 JMeter 尝试 POST 登录的那一刻开始出现 100% 的错误。同时,当我检查某些特定页面时,它会给我这样的奇怪错误:

undefined method `eq' for nil:NilClass

在终端我得到以下输出(但只有几次):

message type 0x43 arrived from server while idle
message type 0x5a arrived from server while idle
WARNING:  there is already a transaction in progress

编辑:这似乎是共享 PGconnect 对象的问题,所以我删除了一些以前的文本

我发现 PostgreSQL docs指定 PGconn 对象不得在发出并发请求的线程之间共享。

是 unicorn !还是 AR 在同一 PGconn 对象中混合来自不同线程的请求?

数据库.yml:

production:
  adapter: postgresql
  encoding: unicode
  database: ***
  username: ***
  password: ***
  host: 127.0.0.1

我什至尝试添加它无济于事:

  allow_concurrency: true

unicorn session :

worker_processes 8
working_directory "/full/path/to/app"
listen '/tmp/app.sock', :backlog => 512
timeout 30
pid "/full/path/to/app/tmp/pids/puppetmaster_unicorn.pid"

preload_app true
  if GC.respond_to?(:copy_on_write_friendly=)
  GC.copy_on_write_friendly = true
end

规范:

  • Rails 3.0.6(因为部署环境)
  • unicorn ! 4.1.1
  • Nginx 1.0.5
  • PG gem 0.11.0
  • PostgreSQL 9.0.4
  • Mac OS X 10.7.2

如果 Rails 版本是罪魁祸首,我当然可以升级到最新版本。我刚开始了解服务提供商的内容。

最佳答案

重要的是不要在进程之间共享数据库连接。当您使用 preload_app 运行 Rails 时,Rails 将在 unicorn master fork workers 之前建立 AR 连接。示例 unicorn.conf.rb 建议在 before_fork Hook 中断开 AR 连接。 AR 将自动重新建立新连接,因为每个工作人员都需要它后 fork 。

摘自 http://unicorn.bogomips.org/examples/unicorn.conf.rb :

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!
  # ...
end

关于ruby-on-rails-3 - unicorn !和 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262803/

相关文章:

postgresql - 使用多个条件对分区进行排序

ruby-on-rails - 应用程序错误-heroku 检查日志?

postgresql - AWS ElasticBeanstalk amazon linux pg_config 与 psycopg2 错误

ruby-on-rails - Resque 未获取 Redis 配置设置

sql - 在 Rails ActiveRecord 模型中,使用 after_initialize 回调是一个非常糟糕的主意吗?

ruby-on-rails - 如何在生产模式下运行redis服务器和juggernaut服务器

java - 配置 W3C 的 Unicorn 以使用代理服务器

ruby-on-rails - 减少 unicorn 应用服务器响应时间

mysql - 哪里用MongoDB,哪里用MySQL?

ruby - ActiveRecord,通过多态属性查找