2011-11-24 3 views
5

古いRailsとPostgreSQLアプリケーションを2.1からRails 3にアップグレードする途中です(中間2.3.11の手順を成功させることで)。ユニコーン! PostgreSQL

最後に、すべてのRspecがスムーズに実行されたら、Mongrel 1.2.0.pre2をインストールして起動しました。すべてOKです。 100人の同時ユーザーのJMeterテストケースでもOKになりました。

しかし、私はユニコーンで同じことをしようとしたとき!サーバーでは、自分で使用しているとうまく動作しますが、JMeterを使用して負荷をかけた場合、JMeterがログインを試みる時点から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 docsPGconnオブジェクトが共有されてはならないことを指定することがわかっ

前のテキストの一部を削除しました同時要求を行うスレッド間。

ユニコーンです!または同一のPGconnオブジェクト内の異なるスレッドからのARミキシング要求?

database.ymlの:

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

私も無駄にこれを追加しようとしました:

allow_concurrency: true 

unicorn.conf:

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(デプロイメントのため)
  • ユニコーン! 4.1.1
  • nginxの1.0.5
  • PG宝石0.11.0
  • のPostgreSQL 9.0.4
  • のMac OS X 10.7.2

Railsのバージョンはもちろんの犯人でなければならない場合私は最新のものにアップグレードすることができます。私は、サービスプロバイダが持っているものから始めました。

+0

あなたはunicorn.rbで作成するにはどうすれば多くのユニコーンの労働者?タイムアウトは何ですか? – stephenmurdoch

+0

私の質問をunicorn.confで更新しました – Laas

答えて

7

プロセス間でデータベース接続を共有しないことが重要です。 preload_appでRailsを実行すると、Railsはunicorn masterが作業者をフォークする前にAR接続を確立します。 unicorn.conf.rbの例では、before_forkフックでAR接続を切断することを推奨しています。 ARは自動的に新しい接続を確立します。各作業者はポストフォークを要求します。 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 
+0

はい、Unicornメーリングリストの助けを借りてもわかりましたが、私の答えを更新するのを忘れました。私はこれを行うためにあなたにポイントを与えます。ありがとうございました。 – Laas

関連する問題