2017-04-10 58 views
10

转换相对较小的图片(2mb)时,我一直从Firebase云端函数中收到零星错误。成功后,该功能只需要大约2000ms或更少的时间完成,根据Image Magick文档,我不应该看到任何问题。因超出内存限制而导致Firebase死亡的云端函数

我试图增加命令的缓冲区大小,这是不允许从Firebase内部允许的,并且我试图找到.spawn()的替代方案,因为这可能会导致垃圾超载并且速度变慢。什么都没有

回答

15

[更新]正如一位评论者所建议的,这应该不再是一个问题,因为现在的firebase功能会在重新部署时保留其设置。感谢firebase!

原来,这并不明显,也没有记录,您可以增加Google Functions Console中函数的内存分配。您还可以增加长时间运行的功能的超时时间。它解决了内存过载的问题,现在一切都很顺利。

编辑:请注意,Firebase将重置部署时的默认值,因此您应该记得登录到控制台并立即更新它们。我仍然在寻找通过CLI更新这些设置的方法,当我找到它时会更新。

+0

我找不到增加内存人的地方我的职能的位置。我应该在功能控制台中去哪里? TKS! – Walucas

+0

@Walucas云功能> {你的功能名称}>点击“编辑”>然后编辑“内存分配”中的数字 – Kirill

+0

功能设置正在为我重新设置。 –

2

更新:它看起来他们现在保留重新部署的设置,以便您可以安全地更改云控制台中的内存分配!

+0

哦,好消息!我有一段时间没有重新部署,以避免任何破坏。将尝试一个测试项目。如果它再次运作,这真是太棒了! – Kirill

+0

更新:它每次都为我重置它们(并且由于内存限制已超出_at deploy time_,这会产生一个令人尴尬的鸡和蛋问题),因此无法部署。 –

10

我迷失在用户界面中,找不到任何选项可以更改记忆,却终于找到了:

  1. 转到谷歌云平台控制台(而不是火力地堡控制台)
  2. 选择Cloud Functions在菜单中
  3. 现在,如果它是正确的,现在你会在这里看到你的firebase功能。否则,请检查您是否选择了正确的项目。
  4. 忽略所有复选框,按钮和菜单项,只需点击函数的名称
  5. 点击编辑(顶部菜单),只更改分配的内存,然后点击保存。

的问候,彼得

0

似乎在火力地堡云功能默认ImageMagick的资源配置不匹配分配给功能的实际内存。 - 默认ImageMagick的实例认为它有2GB,因此不从磁盘分配缓冲区

File  Area   Memory  Map  Disk Thread Throttle  Time 
-------------------------------------------------------------------------------- 
18750 4.295GB  2GiB  4GiB unlimited  8   0 unlimited 

分配到FCF的默认内存为256MB:

在火力地堡云功能产量的上下文中运行identify -list resource并且可以轻松地尝试重新分配内存,导致该功能失败Error: memory limit exceeded. Function killed.

一种方法是增加上述建议的所需内存 - 尽管仍然存在风险,IM将尝试根据您的用例和异常值进行分配。

作为使用-limit memory [your limit]的图像处理过程的一部分,更安全的是将正确的内存限制设置为IM。你可以通过使用`-debug Cache'运行你的IM逻辑来判断你的大约内存使用情况 - 它会显示你分配的所有缓冲区,它们的大小以及它们是内存还是磁盘。

如果IM遇到了内存限制,它将开始在磁盘上分配缓冲区(内存映射,然后是常规磁盘缓冲区)。您必须考虑I/O性能与内存成本之间的特定平衡。你分配给你的FCF内存被使用的100毫秒乘以 - 。因此,能够迅速成长

0

另一个选择是避免使用.spawn()完全

有一个伟大的图像处理包的节点称为Sharp那使用低存储器足迹库libvips。您可以在Github上查看Cloud Function示例。

或者,ImageMagick(和GraphicsMagick)的节点包装器名为gm。它甚至支持-limit选项向IM报告您的资源限制。

+0

有趣。将给予锐利的一击。 Google Cloud的问题在于,您无法真正在本地测试任何内容,并且需要通过一段云代码来推动每项更改。所以转换成本很高,即使是更好的解决方案。 – Kirill

+1

您应该查看刚添加的一些新的本地测试功能。现在您可以在本地测试触发函数并对它们执行单元测试。 https://firebase.google.com/docs/functions/local-emulator#invoke_storage_and_auth_functions – Kiana

2

最新的firebase deploy命令确实将内存分配覆盖为默认的256MB,并且超时至60s。

可替换地,可以指定所期望的存储器分配和最大超时,我使用gcloud指令,例如:

gcloudβ函数部署YourFunctionName --memory = 2048MB --timeout = 540S

其他选项,请参考:

https://cloud.google.com/sdk/gcloud/reference/beta/functions/deploy