主动存储的高响应时间

High response time with active storage

我正在使用 active_storageHeroku 的网页上存储和检索三个图。检索图的代码是

image_tag plot.variant(resize: '500x500'), class: 'r_plot'

每个地块都相当小,大约 500 KB。我经常从 Logentries heroku 附加组件中看到以下错误:

High Response Time: Heroku/Syslog drain
    2020-05-30 21:39:37.733
    671 <158>1 2020-05-30T21:39:35.184905+00:00 heroku router - - at=info method=GET path="/rails/active_storage/representations/long_token/-tmp-plotsPlotname" host=cvd-tracker.herokuapp.com request_id=some_id fwd="ip_address" dyno=web.1 connect=0ms service=5015ms status=302 bytes=1679 protocol=https

为什么检索这些图需要这么长时间?

可能是几件事:

  1. 变体由服务器按需创建,因此第一次调用它可能需要一些时间和大量资源才能完成。
  2. Heroku 有一个临时文件系统,这意味着如果您在本地存储这些变体,那么在每次新部署或其他导致 dyno 更改的事件之后,先前创建的变体将被销毁,因此下次调用它时您将拥有再次执行上一步。
  3. 如果您不在本地存储变体,那么也许您的测力计太小,这意味着服务器 运行 内存不足并且必须使用交换 space 来完成变体处理?

听起来这些是否适用于您的情况?

编辑 - 后台处理:

看起来实际处理是在调用 processed 时触发的,因此您可以在 rake 任务中执行类似的操作:

upload = Upload.find(upload_id)
variant = upload.image.variant(options)
was_processed = variant.processed
Rails.logger.info "Processed variant for #{upload.id}" if was_processed

我找到了以上内容以及其他一些提示 here

稍微扩展@Simon L. Brazell 的 ,一些应用程序可能 redirect_to 一个在图像上传后显示图像的视图,这意味着应用程序可能首先需要创建变体(这需要时间)。

一些可能有帮助的事情:

  • 考虑视图是否需要显示图像(例如它是否可以显示 links 到用户可以点击的图像,从而递增地产生变体(或不如果你 link 到原图,full-size 图像)。

  • 一些变体方法可能会为集合创建变体,请考虑是否有必要(如果您只显示集合的一个子集,则可能不需要需要为整个系列创建变体)。

另一个原因

不要像这样通过 `.update!() 传递附件:

article.update!(
  content: article_params[:content],
  photos: article_params[:photos],
  videos: article_params[:videos]
  )

相反,this:

article.update!(content: article_params[:content])
article.photos.attach(article_params[:photos]) 
article.videos.attach(article_params[:videos]) 
  • 有关详细信息,请参阅 here

补充说明:

  • 我在我的 heroku 日志中看到了这个:Skipping image analysis because the ruby-vips gem isn't installed,我已经安装了 ruby-vips gem,但还没有 installed vips on heroku 我希望能提高速度这样做之后,但我无法检测到任何东西。