我们的 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 架构:
值得注意的是,所有暂存容器都运行在服务器 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/