2011-11-24 94 views
5

我正在將舊的Rails和PostgreSQL應用程序從2.1升級到Rails 3(通過成功的中間2.3.11步驟)。獨角獸!和PostgreSQL

最後,當我所有的Rspecs運行平穩時,我安裝了Mongrel 1.2.0.pre2並啓動並運行 - 一切正常。即使是100個併發用戶的JMeter測試用例也通過了OK。

但是,當我嘗試與獨角獸一樣!服務器,它在我自己使用它的時候工作正常,但是當我在JMeter的負載下得到它時,它開始給出100%的錯誤,從JMeter試圖發佈登錄的那一刻開始。而此時我查了一些特定頁面的同時,它給了我奇怪的錯誤是這樣的:

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對象不能被共享的在併發請求的線程之間。

是獨角獸!或AR混合請求來自不同的線程在同一個對象中的PGconn

的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(因部署env)
  • 獨角獸! 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將在麒麟主人派生工作人員之前建立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