Ruby on rails ActiveRecord::QueryCache#使用pg:backups在Heroku上缓慢调用 最近我们在RAIS4.2.7.1应用程序上每晚都遇到麻烦,我们开始看到一组非常慢的 ActureCordR::QuielCaseSuffy~调用/代码>调用,即使我们的流量在半夜相对较低:

Ruby on rails ActiveRecord::QueryCache#使用pg:backups在Heroku上缓慢调用 最近我们在RAIS4.2.7.1应用程序上每晚都遇到麻烦,我们开始看到一组非常慢的 ActureCordR::QuielCaseSuffy~调用/代码>调用,即使我们的流量在半夜相对较低:,ruby-on-rails,ruby,postgresql,heroku,activerecord,Ruby On Rails,Ruby,Postgresql,Heroku,Activerecord,我们使用Puma在Heroku上运行,该应用程序非常繁重,为此我们使用Sidekiq。白天工作正常,但每天晚上,我们都会通过API获得这些异常缓慢的响应时间峰值,这些API似乎起源于ActiveRecord::QueryCache\call 我能从我们的应用程序中找到的唯一可能导致这种情况的原因是,我们启用了heroku pg:backup,并且在上面图像的当晚,备份在3:06开始运行,这正是您在newrelic图表中看到第一个ActiveRecord::QueryCache#call峰值的时间

我们使用Puma在Heroku上运行,该应用程序非常繁重,为此我们使用Sidekiq。白天工作正常,但每天晚上,我们都会通过API获得这些异常缓慢的响应时间峰值,这些API似乎起源于
ActiveRecord::QueryCache\call

我能从我们的应用程序中找到的唯一可能导致这种情况的原因是,我们启用了heroku pg:backup,并且在上面图像的当晚,备份在3:06开始运行,这正是您在newrelic图表中看到第一个
ActiveRecord::QueryCache#call
峰值的时间。然而,备份在一个小时后完成(在最大峰值附近),但正如您所见,峰值一直持续到凌晨5点左右


这可能是由pg:备份引起的吗?(我们的数据库大约是19GB),或者完全是别的什么东西?有没有一种好方法可以避免或加速缓存调用?我不完全理解为什么它会这么慢或者存在于事务列表中。有什么建议吗?

有趣的是,在看到类似的行为后,我们最近一直在对此进行调查。大型数据库上的
pg:backups
会对性能造成一定的影响。注意凌晨1点后,当备份开始时的大峰值:

数据库大小>100GB

这并不奇怪,事实上Heroku在这一点上也有自己的见解,这表明您应该只对20GB以下的数据库使用
pg:backups

对于较大的数据库,最好创建一个跟随者并从中获取备份。对于高可用性数据库来说,令人烦恼的是,您似乎无法从备用数据库读取数据


不过,我对
ActiveRecord::QueryCache
没有太多的了解,所以本文的其余部分只是猜测,可能是进一步调查的起点。如果有更博学的人可以加入,很高兴删除/修改:-)

Heroku的文档确实指出,备份过程将从非Postgres缓存中逐出缓存良好的数据,因此这可能代表您的工作人员多次重新填充该缓存


它也可能值得一看。您的工作人员会重用连接并接收脏查询缓存吗?

我刚刚看到了关于
pg:backups
和数据库大小的相同文档。有趣的是,我们的数据库过去大约是40GB,这在当时似乎不是问题。但我将尝试禁用它一晚(依靠持续的保护),看看这是否会有所不同。