Rails Puma 偶尔超时

Rails with Puma occasional timeout

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

我目前遇到一个奇怪的问题,Puma 有时 在我完成部署(通过 cap deploy)后给我超时。这种情况已经发生了一段时间,而且越来越频繁。每当发生这种情况时,我都需要重新启动 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 日志中没有任何记录,但 Nginx 记录了一些错误:

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

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

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

对我来说,网络服务器超时是因为 运行 整个数据库都有很长的查询,这占用了可用的连接并使 Puma 等待新的可用连接。

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

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