2017-04-10 66 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

相關問題