【问题标题】:Dockerized Rails app: slow after container startDockerized Rails 应用程序:容器启动后速度变慢
【发布时间】: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


【解决方案1】:

检查日志后,我们注意到,响应时间的最大下降发生在视图渲染阶段:

# first SLOW request
I, [2020-02-24T09:47:55.634574 #464]  INFO -- : Completed 200 OK in 57087ms (Views: 56624.1ms | ActiveRecord: 104.7ms)

# second FAST request
I, [2020-02-24T09:48:21.101165 #461]  INFO -- : Completed 200 OK in 993ms (Views: 486.6ms | ActiveRecord: 110.1ms)

因此,我们检查了默认缓存并意识到它根本不会在部署之间持续存在,并且在第一次请求时,应用程序必须从头开始渲染视图并缓存它。

因此,我们的解决方案是将 rails 缓存保存在共享的持久 docker 卷中,并在应用程序服务器启动之前创建指向它的符号链接。因此,如果页面被缓存,即使是第一个打开它的请求也会非常快。

【讨论】:

  • 很好的后续塔拉斯!
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
相关资源
最近更新 更多