ruby-on-rails - Dockerized Rails 应用程序 : slow after container start

标签 ruby-on-rails ruby docker nginx docker-swarm

我们的 Rails (5.1.7) 应用程序在 docker-swarm 容器(Ruby 2.6.5,PostgreSQL 10)中运行。

我们尝试了 Puma web-server,但它在重负载下还不够好,所以我们使用了 Unicorn (5.5.2)。

我们正面临一个大问题。

容器启动后,每个页面第一次加载都很慢,最多一分钟。对相同页面的所有后续请求都会快速响应。

看起来不是 unicorn 问题,因为在 HUP 之后(重新启动)或 QUIT (shutdown) (+ start) 表示页面加载速度足够快。

此问题发生在部署 (docker stack deploy ...) 或更新 (docker service update ...) 之后。

docker 架构:

  • 两个独立的服务器
  • 两个堆栈(登台 + 演示);
  • 两个堆栈都使用相同的 Nginx 容器(+ 为连接它们而创建的外部网络)
  • 每个堆栈包括:
  • PostgreSQL 容器
  • Rails 应用程序容器
  • Redis 容器
  • RabbitMQ 容器
  • 后台 worker 容器
  • Nginx 服务仅在演示的 docker-compose 中定义,因此部署到 staging 不会重新启动 Nginx 容器

  • 值得注意的是,所有暂存容器都运行在服务器 1(Nginx 除外)上,演示容器分布在两台服务器之间:在服务器 1 上,我们有演示 PostgreSQL、Redis 和 RabbitMQ,在服务器 2 上,我们有 Rails 应用程序、背景 worker 和 Nginx。并且问题在两个堆栈上都重现。

    任何想法如何解决这个问题?提前致谢。

    更新 (2020.02.24)

    View 层缓存似乎有问题。我无法显示完整的日志,但除了这一行之外,它们几乎相同:
    # 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)
    

    最佳答案

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

    # 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)
    

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

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

    关于ruby-on-rails - Dockerized Rails 应用程序 : slow after container start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60322508/

    相关文章:

    ruby - 需要帮助理解 "(2..Math.sqrt(n)).none?"在对数字以下的素数求和的方法中的含义

    django - Docker 构建给了我这个错误 "/bin/sh: -c requires an argument , The command '/bin/sh -c' 返回一个非零代码 : 2"

    ruby-on-rails - 如何使这段代码更像 Ruby 方式?

    ruby-on-rails - Ruby 和 Rails 性能问题,服务器

    ruby-on-rails - 事件记录 rails 上的条件 3

    docker - 使用docker compose运行Gatsby

    Docker 容器在 kubernetes 内工作/不工作

    ruby-on-rails - 有没有可以执行Ruby代码约定的gem?

    ruby-on-rails - Rails - 从字符串数组中下拉

    mysql - activerecord 3.2.2 与多个连接的关联问题