【问题标题】:Rails with Puma occasional timeout带有 Puma 的 Rails 偶尔超时
【发布时间】:2015-04-14 11:54:20
【问题描述】:

我在远程服务器中有两个 Rails 应用程序(生产环境和暂存环境)。

我目前遇到一个奇怪的问题,在我完成部署(通过 cap 部署)后,Puma 会有时让我超时。这种情况已经发生了一段时间,而且越来越频繁。每当发生这种情况时,我都需要重新启动 Puma 服务器(从cap puma:stopcap puma:start),或者手动执行kill -9 <pid of puma instance>。但是,在这两种情况下,我都需要首先从shared/tmp/sockets 目录中rm puma.sock

另一方面,我的生产环境没有遇到这个问题。它们之间的区别只是 # 提交,我的暂存环境是几个(约 50 次)提交。早些时候,当我将登台合并到生产并部署时,同样的问题出现在生产中。所以我将我的产品回滚到以前的版本,重新启动 Puma,问题就消失了。

注意cap puma:restart 无法解决这个问题;我必须杀死当前的 Puma 实例,并启动一个新实例才能解决此问题。

我目前的设置是:

  • Rails 4.1
  • 彪马
  • Nginx
  • Capistrano 3

发生错误时,Rails 日志中没有任何记录,但 Nginx 记录了一些错误:

  • upstream timed out (110: Connection timed out) while reading response header from upstream 等待 60 秒后,显示 500 的页面。
  • recv() failed (104: Connection reset by peer) while reading response header from upstream 立即显示 500 个页面。
  • connect() to unix:/var/deploy/medictrust-staging/shared/tmp/sockets/puma.sock failed (111: Connection refused) while connecting to upstream 立即显示 500 个页面。

上述错误是随机发生的;有时连接超时,有时连接被拒绝。但最常见的是连接超时。

奇怪的是,如果我通过 cURL 访问我的应用程序,Puma 不会超时。 Puma 或 Nginx 配置中没有进行任何更改,那么这可能是由应用程序代码引起的吗?

如何让这个问题永远消失?

【问题讨论】:

  • 你有想过这个吗?我正在处理类似的事情,但仅在我的生产环境中。 xkcd.com/979
  • 嘿@steel,如果我没记错的话,Web 服务器正在超时,因为整个数据库中都有长时间运行(阅读:卡住)的查询。可用的数据库池已用尽,Puma 一直在等待卡住的查询完成。要检查我的问题是否与您的问题相似,只需登录到您的生产数据库并运行SHOW FULL PROCESSLIST。这是一个对我有帮助的答案:stackoverflow.com/a/15252722/1266558

标签: ruby-on-rails nginx capistrano puma


【解决方案1】:

对我来说,Web 服务器超时是因为整个数据库中都存在长时间运行的查询,这会占用可用的连接并使 Puma 等待新的连接可用。

作为急救,我重新启动了我的 MySQL 服务器,它立即工作。我很遗憾我没有记录慢查询;因为该查询一定是我的 Rails 应用程序中一些错误代码的结果。

此外,这个 SO 答案也有帮助:Getting “Lock wait timeout exceeded; try restarting transaction” even though I'm not using a transaction

【讨论】:

    猜你喜欢
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2013-02-22
    • 2016-09-25
    • 2016-04-13
    相关资源
    最近更新 更多