独角兽完全忽略USR2信号

15

我在我的生产服务器上遇到了一个相当奇怪的unicorn问题。虽然配置文件中指定preload_app为true,但是向主进程发送USR2信号不会产生任何响应,而且似乎unicorn完全忽略了该信号。在另一台服务器上,发送USR2会成功地将主进程更改为旧状态并启动一个新的主进程。有问题的服务器使用RVM和bundler,因此我认为它与这些相关(另一个是vanilla ruby)。发送除USR2之外的信号(QUIT、HUP)都可以正常工作。是否有办法跟踪这里发生了什么?Unicorn的日志文件完全为空。


你可能会对strace感兴趣。我不知道它是否适用于OSX,但它可以帮助你找到问题的根源。http://linux.die.net/man/1/strace - Devin M
3个回答

10

我怀疑你的问题可能是由于Gemfile发生了变化,但你没有以允许USR2使用新的Gemfile的方式启动你的unicorn。因此,当你尝试重新启动应用程序时,它会崩溃。

检查你的/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"

这里是一个PR,可以演示这个问题。


我总是在新的独角兽部署中忘记这个。
before_exec { |server| ENV["BUNDLE_GEMFILE"] = "#{app_path}/current/Gemfile" }
- Adam

5
我遇到了类似的问题,但是我的日志清楚地标识出了问题所在:发送USR2信号一开始可以在部署中工作,但随着部署的清理,Unicorn主进程最初启动的发布版将被删除,因此尝试发送USR2信号将似乎无事发生/失败,并且错误日志会显示:
forked child re-executing... 53 /var/www/application/releases/153565b36021c0b8c9cbab1cc373a9c5199073db/vendor/bundle/ruby/1.9.1/gems/unicorn-4.3.1/lib/unicorn/http_server.rb:439:in `exec': No such file or directory - /var/www/application/releases/153565b36021c0b8c9cbab1cc373a9c5199073db/vendor/bundle/ruby/1.9.1/bin/unicorn (Errno::ENOENT)
Unicorn文档在http://unicorn.bogomips.org/Sandbox.html中提到了这个潜在的问题:"清理旧版本将导致缺少特定版本的unicorn安装并导致升级失败",这在我的情况下意味着USR2似乎“没有任何反应”。
我正在使用Chef的应用程序配方来部署应用程序,它创建了一个符号链接的vendor_bundle目录,该目录在部署之间共享,但调用bundle exec unicorn仍然导致原始的Unicorn主进程持有包含特定版本目录的路径引用。
为了修复它,我必须调用bundle exec /var/www/application/shared/vendor_bundle/ruby/1.9.1/bin/unicorn以确保Unicorn主进程具有从一个部署到下一个有效的二进制文件路径。一旦完成,我就可以随心所欲地部署了,kill -USR2 PID将按预期工作。
Unicorn文档提到,您可以通过在Unicorn配置文件中设置以下内容并发送HUP重新加载Unicorn,然后发送USR2以分叉新主进程来手动更改二进制路径引用:Unicorn::HttpServer::START_CTX[0] = "/some/path/to/bin/unicorn"
也许这对于处于类似情况的某些人很有用,但我没有实现这个功能,因为指定共享独角兽二进制文件的绝对路径已足够。

0

我在我的VDS上遇到了类似的问题。通过Strace追踪发现了原因:

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

尝试增加内存大小,调整XEN内存需求限制(在我的情况下过于严格),或者可能打开overcommit,尽管后者可能会产生一些严重的不良副作用,所以请小心操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接