首页 > 解决方案 > Ruby on Rails 应用程序在一段时间后返回 504 错误

问题描述

在共享主机上,我有几个 Ruby on Rails 应用程序(5.0 和 5.2 与 ruby​​ 2.2 或 2.4),其中一些,在我启动它们并访问一些页面后,停止工作并发生504 Gateway Time-out错误。当它发生时,我在日志文件中或在 CPanel 的 Metrics - Errors 部分中看不到任何内容,如果我尝试加载越来越多的页面,我会收到 504 错误,并且服务器上的物理内存使用率增加到 99%。
但是,只有一些应用程序被阻止,而其他应用程序则没有。而且他们没有什么特别的东西会消耗内存。他们都有 puma gem 的 3.12 版本,但我尝试用 4 更改它,但没有任何改变。

如果我登录 SSH 控制台,当我运行命令时ps -aux会显示如下内容:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
truesoft 17085  0.1  0.0 366116 22308 ?        S    11:29   0:00 lsphp
truesoft 25413  0.0  0.0  11228  1988 pts/0    Ss   08:11   0:00 -bash
truesoft 18492  0.0  0.0  51020  1664 pts/0    R+   11:30   0:00 ps -aux
truesoft  3525  0.5  0.2 268288 94924 ?        SNl  11:19   0:03 RACK: /home/truesoft/app1_which_works_fine/ (production)
truesoft 12526  1.2  0.2 268116 96808 ?        SNl  11:26   0:03 RACK: /home/truesoft/app2_which_works_fine/ (production)
truesoft 13773  1.5  0.2 250988 94000 ?        SNl  11:26   0:03 RACK: /home/truesoft/app3_which_works_fine/ (production)
truesoft 18029  4.1  0.3 287600 108072 ?       SN   11:30   0:01 RACK: /home/truesoft/app2_which_works_fine/ (production)
truesoft 18088 11.9  0.3 295860 118684 ?       SN   11:30   0:02 RACK: /home/truesoft/app2_which_works_fine/ (production)
truesoft 18266  0.0  0.2 294768 75004 ?        SN   11:30   0:00 RACK: /home/truesoft/app2_with_error/ (production)
truesoft 12413  0.0  0.2 359060 96356 ?        SNl  Dec18   0:49 RACK: /home/truesoft/app1_with_error/ (production)
truesoft 12444  0.0  0.2 359060 93172 ?        SN   Dec18   0:00 RACK: /home/truesoft/app1_with_error/ (production)
truesoft 24104  0.0  0.2 314648 82472 ?        SN   09:30   0:00 RACK: /home/truesoft/app3_with_error/ (production)
truesoft 25743  0.0  0.2 314648 82472 ?        SN   09:31   0:00 RACK: /home/truesoft/app3_with_error/ (production)
truesoft 31330  0.0  0.2 312456 83812 ?        SNl  09:34   0:03 RACK: /home/truesoft/app3_with_error/ (production)

有些进程在那里挂了几天(请参阅 参考资料Dec18)甚至更多,我必须用 -9 杀死它们。

strace -tt -p 31330我在浏览器中看到页面一直加载很长时间没有结果的那一刻也运行 了一个进程,这是输出:

strace: Process 31330 attached
12:58:42.475820 select(8, [7], NULL, NULL, {0, 668936}) = 0 (Timeout)
12:58:43.148229 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:44.153079 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:45.158192 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:46.163095 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:47.168427 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:48.169276 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:49.174225 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:50.175233 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)
12:58:51.180778 select(8, [7], NULL, NULL, {1, 0}) = 0 (Timeout)

我注意到select(8, [7], NULL, NULL, {1, 0})每秒钟都在重复永远。

select似乎是一个 linux 系统调用(参见man)。

我已经在另一个主机上安装了相同的应用程序,它工作正常。不同的是,对于ps -auxCOMMAND 列显示

Passenger AppPreloader: /home/other_domain/app3_which_had_error_on_other_server (forking...)

我是 linux 的初学者,我不知道在哪里检查有什么问题。也许有人可以给我一些提示,看看在哪里看。在我的本地机器上,所有应用程序都可以正常工作,即使在生产模式下也是如此。

编辑:经过进一步调查,我发现这是这里描述的死锁问题:puma/puma#1184。但是,将eager_load, or设置thread_count为 1 并没有帮助。

标签: ruby-on-railshttp-status-code-504

解决方案


在托管服务器上安装了Litespeed,似乎当应用程序的rails版本为5.2时,linux进程发生死锁,并导致504错误。

这里有一个旧帖子: https ://www.litespeedtech.com/support/forum/threads/rails-2-2-cache_classes-problem.2493/其中指定了 2.2 版本。

没有 Litespeed,一切正常。


推荐阅读