ruby-on-rails - 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 -aux
COMMAND 列显示
Passenger AppPreloader: /home/other_domain/app3_which_had_error_on_other_server (forking...)
我是 linux 的初学者,我不知道在哪里检查有什么问题。也许有人可以给我一些提示,看看在哪里看。在我的本地机器上,所有应用程序都可以正常工作,即使在生产模式下也是如此。
编辑:经过进一步调查,我发现这是这里描述的死锁问题:puma/puma#1184。但是,将eager_load
, or设置thread_count
为 1 并没有帮助。
解决方案
在托管服务器上安装了Litespeed,似乎当应用程序的rails版本为5.2时,linux进程发生死锁,并导致504错误。
这里有一个旧帖子: https ://www.litespeedtech.com/support/forum/threads/rails-2-2-cache_classes-problem.2493/其中指定了 2.2 版本。
没有 Litespeed,一切正常。
推荐阅读
- java - 每次将项目添加到列表时如何使 RecyclerView 不滚动到底部
- python - .all(0 删除异常值时的目的不明确
- javascript - 如何在反应原生中单击按钮时提醒随机文本
- php - 使用 AJAX 数据库连接错误和页面路径问题加载页面
- azure-devops - 如何获取管道构建的 URL
- python - 如何分析使用 python 多处理的脚本
- xamarin.forms - Xamarin Forms - 将 TapGestureRecognizer 限制为单击一次
- unreal-engine4 - 虚幻引擎 AI 没有跟随新的水平
- reactjs - 错误无法读取未定义的属性 getState - 带有 NextJS 的 Redux
- c# - 从数据库端的组中获取最后 2 行