【发布时间】:2020-02-20 14:45:01
【问题描述】:
我们的 Rails (5.1.7) 应用程序在 docker-swarm 容器(Ruby 2.6.5、PostgreSQL 10)中运行。
我们尝试了 Puma 网络服务器,但它在重负载下还不够好,所以我们使用了 Unicorn (5.5.2)。
我们正面临一个大问题。
容器启动后,每个页面第一次加载都很慢,最多一分钟。对同一页面的所有后续请求都会快速响应。
看起来这不是 Unicorn 的问题,因为在 HUP(重新启动)或 QUIT(关闭)(+ 启动)发出页面加载速度足够快的信号之后。
部署 (docker stack deploy ...) 或更新 (docker service update ...) 后会出现此问题。
Docker 架构:
- 两个独立的服务器
- 两个堆栈(暂存 + 演示);
- 两个堆栈都使用相同的 Nginx 容器(+ 为连接它们而创建的外部网络)
- 每个堆栈包括:
- PostgreSQL 容器
- Rails 应用程序容器
- Redis 容器
- RabbitMQ 容器
- 后台工作者容器
- Nginx 服务仅在 docker-compose 中定义用于演示,因此部署到 staging 不会重新启动 Nginx 容器
值得注意的是,所有暂存容器都在服务器 1 上运行(Nginx 除外),演示容器分布在两台服务器之间:在服务器 1 上我们有演示 PostgreSQL、Redis 和 RabbitMQ,在服务器 2 上我们有 Rails应用程序、后台工作人员和 Nginx。并且问题在两个堆栈上都重现。
任何想法如何解决这个问题?提前致谢。
更新(2020.02.24)
视图层缓存似乎有问题。我无法显示完整的日志,但除了这一行之外,它们几乎相同:
# SLOW request
I, [2020-02-24T09:47:55.634574 #464] INFO -- : Completed 200 OK in 57087ms (Views: 56624.1ms | ActiveRecord: 104.7ms)
# FAST request
I, [2020-02-24T09:48:21.101165 #461] INFO -- : Completed 200 OK in 993ms (Views: 486.6ms | ActiveRecord: 110.1ms)
【问题讨论】:
-
您的日志怎么说?将级别设置为
debug,并为第一个慢速请求和随后的较快请求提供日志输出的使用。这可以为这里发生的事情提供线索。 -
如果您的应用在调试模式下没有任何日志,请从服务输出
docker service ps --no-trunc <service ID>检查容器日志。您的应用程序是否会在第一次 API 调用时初始化所有连接?您还可以在堆栈的.yml文件中添加depends_on:。 -
@JoelMagnuson 在集群模式下部署堆栈时,
depends_on选项将被忽略。而docker service ps --no-trunc <service ID>不显示日志。 -
@PatrickQuigley 问题已更新,请看一下。
标签: ruby-on-rails ruby docker nginx docker-swarm