2011-07-06 89 views
15

我的生產服務器上出現獨角獸時出現了一個相當奇怪的問題。 雖然配置文件指出preload_app爲true,但將USR2發送到主進程並不會產生任何響應,並且看起來像獨角獸完全忽略了信號。 在另一臺發送USR2的服務器上,將主進程更改爲(舊)狀態併成功啓動新的主進程。 有問題的服務器使用RVM & bundler,所以我假設它有某種相關性(另一個是香草紅寶石)。 發送除USR2(QUIT,HUP)以外的信號工作得很好。 有沒有辦法跟蹤幕後發生的事情?獨角獸的日誌文件是完全空的。獨角獸完全忽略USR2信號

+0

您可能感興趣strace。我不知道它是否可用於OSX,但它會幫助你達到此目的。 http://linux.die.net/man/1/strace –

回答

0

我在我的VDS上遇到過類似的問題。 Strace'ing透露了原因:

write(2, "E, [2011-07-23T04:40:27.240227 #19450] ERROR -- : Cannot allocate memory - fork(2) (Errno::ENOMEM) <...> 

嘗試增加內存容量,內存XEN需求限制(他們在我的情況太用力),或者可能打開overcommit,通過後者可以有一些嚴重的不必要的副作用效果,所以要小心。

5

我遇到過類似的問題,但是我的日誌清楚地發現了這個問題:發送USR2最初將用於部署,但隨着部署得到清理,Unicorn主機最初啓動的發佈版本將被刪除,發送USR2信號似乎什麼都不做/失敗,與錯誤日誌說明:

派生的子重新執行... 53 /無功/網絡/應用/發行/ 153565b36021c0b8c9cbab1cc373a9c5199073db /供應商/包/紅寶石/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:439:in `exec':沒有這樣的文件或目錄 - /var/www/application/releases/153565b36021c0b8c9cbab1 cc373a9c5199073db /供應商/包/紅寶石/ 1.9.1 /斌/麒麟 (錯誤:: ENOENT)

麟角文件在http://unicorn.bogomips.org/Sandbox.html提到這個潛在的問題:「清理舊版本會導致特定版本的安裝獨角獸失蹤,升級失敗「,在我看來這意味着USR2似乎」無所作爲「。

我使用的是廚師的應用配方來部署應用程序,這將創建一個跨部署共享的符號鏈接vendor_bundle目錄,但調用bundle exec unicorn仍然導致原麒麟控股高手,其中包括具體的發佈目錄的路徑參考。

爲了解決這個問題,我不得不打電話給bundle exec /var/www/application/shared/vendor_bundle/ruby/1.9.1/bin/unicorn以確保獨角獸主機有一個二進制路徑,這個二進制文件在一個部署中是有效的。一旦完成,我可以部署給我心臟的內容,並kill -USR2 PID將按照廣告。

麟角文檔提到您可以手動設置在麒麟配置文件中的以下內容併發送HUP到發送USR2叉新主人面前重裝獨角獸改變二進制路徑參考:Unicorn::HttpServer::START_CTX[0] = "/some/path/to/bin/unicorn"

也許,這是非常有用的對一些處於類似情況的人來說,但我沒有實現,因爲它似乎指定了共享獨角獸二進制文件的絕對路徑就足夠了。

10

我懷疑你的問題可能是你的Gemfile已經改變了,但你還沒有啓動你的獨角獸,讓USR2使用新的Gemfile。因此,當您嘗試重新啓動應用程序時,它會崩潰。

查看您的/log/unicorn.log瞭解可能失敗的細節。

如果您使用Capistrano的,指定BUNDLE_GEMFILE作爲符號鏈接,例如:

run "cd #{current_path} && BUNDLE_GEMFILE=#{current_path}/Gemfile bundle exec unicorn -C#{config_path} -E #{unicorn_env} -D" 

Here's a PR是這個演示功能。

+0

我總是在新的獨角獸部署中忘記這一點。 'before_exec {| server | ENV [「BUNDLE_GEMFILE」] =「#{app_path}/current/Gemfile」}' – Adam