主动存储的高响应时间
High response time with active storage
我正在使用 active_storage
在 Heroku
的网页上存储和检索三个图。检索图的代码是
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
为什么检索这些图需要这么长时间?
可能是几件事:
- 变体由服务器按需创建,因此第一次调用它可能需要一些时间和大量资源才能完成。
- Heroku 有一个临时文件系统,这意味着如果您在本地存储这些变体,那么在每次新部署或其他导致 dyno 更改的事件之后,先前创建的变体将被销毁,因此下次调用它时您将拥有再次执行上一步。
- 如果您不在本地存储变体,那么也许您的测力计太小,这意味着服务器 运行 内存不足并且必须使用交换 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 我希望能提高速度这样做之后,但我无法检测到任何东西。
我正在使用 active_storage
在 Heroku
的网页上存储和检索三个图。检索图的代码是
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
为什么检索这些图需要这么长时间?
可能是几件事:
- 变体由服务器按需创建,因此第一次调用它可能需要一些时间和大量资源才能完成。
- Heroku 有一个临时文件系统,这意味着如果您在本地存储这些变体,那么在每次新部署或其他导致 dyno 更改的事件之后,先前创建的变体将被销毁,因此下次调用它时您将拥有再次执行上一步。
- 如果您不在本地存储变体,那么也许您的测力计太小,这意味着服务器 运行 内存不足并且必须使用交换 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 的
一些可能有帮助的事情:
考虑视图是否需要显示图像(例如它是否可以显示 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 我希望能提高速度这样做之后,但我无法检测到任何东西。